Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
208 changes: 208 additions & 0 deletions EMBEDDING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
# Atomify Embedding

Atomify now supports embedding simulations directly in web pages using base64-encoded simulation data. This allows you to share complete simulations (including all required files) through a single URL parameter.

## How it Works

The embedding system uses a protobuf-like schema to serialize simulation data into a compact base64 format that can be passed as a URL parameter. This includes:

- Simulation metadata (id, title, description, keywords)
- All simulation files (LAMMPS input scripts, data files, force field files, etc.)
- Analysis descriptions and Jupyter notebooks

## Usage

### Basic Usage

To embed a simulation, add the `embeddedSimulationData` parameter to the Atomify URL:

```
https://your-atomify-host.com/?embeddedSimulationData=<base64-encoded-simulation>
```

### Creating Embedded Simulations

#### From Scratch

```typescript
import { createSimulationDataFromFiles, generateEmbeddedUrl } from './utils/embedding';

const lammpsScript = `
# Simple LJ particles simulation
units lj
atom_style atomic
dimension 3
boundary p p p

region box block 0 10 0 10 0 10
create_box 1 box
create_atoms 1 random 100 12345 box

mass 1 1.0
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0 2.5

velocity all create 1.0 12345

neighbor 0.3 bin
neigh_modify delay 0 every 20 check no

thermo 100
run 1000
`;

const simulationData = createSimulationDataFromFiles(
'simple-lj',
'Simple LJ Particles',
'A basic simulation of Lennard-Jones particles.',
'simple.in',
{
'simple.in': lammpsScript
},
{
keywords: ['lennard jones', 'basic'],
analysisDescription: '# Simple LJ Simulation\nThis is a basic example.'
}
);

const embeddedUrl = generateEmbeddedUrl('https://your-atomify-host.com', simulationData);
```

#### From Existing Atomify Simulation

```typescript
import { generateEmbeddedUrlFromAtomifySimulation } from './utils/embedding';

const existingSimulation = {
id: "diffusion",
title: "Diffusion",
description: "Measure diffusion coefficient using MSD.",
inputScript: "simple_diffusion.in",
keywords: ["lennard jones", "diffusion"],
files: [
{
fileName: "simple_diffusion.in",
url: "examples/diffusion/diffusion/simple_diffusion.in"
}
]
};

const embeddedUrl = await generateEmbeddedUrlFromAtomifySimulation(
'https://your-atomify-host.com',
existingSimulation
);
```

## Features

- **Complete simulation packaging**: All files are embedded, no external dependencies
- **Automatic loading**: Simulations start automatically when the embedded URL is accessed
- **No network requests**: All simulation data is self-contained in the URL
- **Compatible with existing features**: Analysis notebooks, multiple files, etc.

## URL Parameters

| Parameter | Description | Required |
|-----------|-------------|----------|
| `embeddedSimulationData` | Base64-encoded simulation data | Yes (for base64 embedding) |
| `embeddedSimulationUrl` | URL to examples JSON (legacy) | No |
| `simulationIndex` | Index in examples array (legacy) | No |

## Schema

The embedding uses the following schema structure:

```typescript
interface SimulationData {
id: string;
title: string;
description: string;
analysisDescription?: string;
analysisScript?: string;
inputScript: string;
keywords: string[];
files: { [key: string]: SimulationFile };
}

interface SimulationFile {
content?:
| { $case: 'text'; text: string }
| { $case: 'data'; data: Uint8Array };
}
```

## Backwards Compatibility

The original embedding method using `embeddedSimulationUrl` and `simulationIndex` parameters is still supported for backwards compatibility.

## Browser Console Utility

When you have a simulation loaded in Atomify, you can generate an embedded URL directly from the browser console:

```javascript
// In the browser console while a simulation is loaded:
const embeddedUrl = window.generateEmbeddedUrl();
// This will log the embedded URL and return it
```

## Complete Example

Here's a complete example showing how to create and use an embedded simulation:

```javascript
// 1. Create a simple simulation in the browser console
const createSimulationDataFromFiles = window.createSimulationDataFromFiles;
const generateEmbeddedUrl = window.generateEmbeddedUrlFn;

const lammpsScript = `
units lj
atom_style atomic
dimension 3
boundary p p p

region box block 0 10 0 10 0 10
create_box 1 box
create_atoms 1 random 100 12345 box

mass 1 1.0
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0 2.5

velocity all create 1.0 12345
neighbor 0.3 bin
neigh_modify delay 0 every 20 check no

thermo 100
run 1000
`;

const simulationData = createSimulationDataFromFiles(
'demo-lj',
'Demo LJ Particles',
'A demonstration of Lennard-Jones particles.',
'demo.in',
{ 'demo.in': lammpsScript },
{ keywords: ['demo', 'lennard jones'] }
);

const embeddedUrl = generateEmbeddedUrl(window.location.origin, simulationData);
console.log('Embedded URL:', embeddedUrl);

// 2. Copy the URL and paste it in a new browser tab
// 3. The simulation will automatically load and start
```

## Integration in External Websites

To embed Atomify simulations in external websites, you can create embedded URLs and use them in iframes:

```html
<iframe
src="https://atomify.com/?embeddedSimulationData=<your-base64-data>"
width="100%"
height="600px"
frameborder="0">
</iframe>
```

When accessed, embedded URLs will automatically load and start the simulation in an optimized embedded view.
74 changes: 74 additions & 0 deletions build/asset-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
{
"files": {
"main.css": "/atomify/static/css/main.377843dd.css",
"main.js": "/atomify/static/js/main.45b37aeb.js",
"static/media/codicon.ttf": "/atomify/static/media/codicon.b797181c93b3755f4fa1.ttf",
"static/media/KaTeX_AMS-Regular.ttf": "/atomify/static/media/KaTeX_AMS-Regular.853be92419a6c3766b9a.ttf",
"static/media/KaTeX_Main-Regular.ttf": "/atomify/static/media/KaTeX_Main-Regular.9eba1d77abcf2aa6e94e.ttf",
"static/media/KaTeX_Main-Bold.ttf": "/atomify/static/media/KaTeX_Main-Bold.8169508bf58f8bd92ad8.ttf",
"static/media/KaTeX_Main-Italic.ttf": "/atomify/static/media/KaTeX_Main-Italic.fa675e5e4bec9eb250b6.ttf",
"static/media/KaTeX_AMS-Regular.woff": "/atomify/static/media/KaTeX_AMS-Regular.d562e886c52f12660a41.woff",
"static/media/KaTeX_Main-BoldItalic.ttf": "/atomify/static/media/KaTeX_Main-BoldItalic.828abcb200061cffbaae.ttf",
"static/media/KaTeX_Math-Italic.ttf": "/atomify/static/media/KaTeX_Math-Italic.8a5f936332e8028c7278.ttf",
"static/media/KaTeX_Math-BoldItalic.ttf": "/atomify/static/media/KaTeX_Math-BoldItalic.bf2d440b3a42ea78a998.ttf",
"static/media/KaTeX_Main-Regular.woff": "/atomify/static/media/KaTeX_Main-Regular.4f35fbcc9ee8614c2bcc.woff",
"static/media/KaTeX_Main-Bold.woff": "/atomify/static/media/KaTeX_Main-Bold.0c3b8929d377c0e9b2f3.woff",
"static/media/KaTeX_AMS-Regular.woff2": "/atomify/static/media/KaTeX_AMS-Regular.73ea273a72f4aca30ca5.woff2",
"static/media/KaTeX_Typewriter-Regular.ttf": "/atomify/static/media/KaTeX_Typewriter-Regular.c5c02d763c89380dcb4e.ttf",
"static/media/KaTeX_Main-Regular.woff2": "/atomify/static/media/KaTeX_Main-Regular.f650f111a3b890d116f1.woff2",
"static/media/KaTeX_Main-Bold.woff2": "/atomify/static/media/KaTeX_Main-Bold.39890742bc957b368704.woff2",
"static/media/KaTeX_SansSerif-Bold.ttf": "/atomify/static/media/KaTeX_SansSerif-Bold.5b49f4993ae22d7975b4.ttf",
"static/media/KaTeX_SansSerif-Italic.ttf": "/atomify/static/media/KaTeX_SansSerif-Italic.b257a18c016f37ee4543.ttf",
"static/media/KaTeX_Main-Italic.woff": "/atomify/static/media/KaTeX_Main-Italic.fd947498bc16392e76c2.woff",
"static/media/KaTeX_Fraktur-Bold.ttf": "/atomify/static/media/KaTeX_Fraktur-Bold.4c761b3711973ab04edf.ttf",
"static/media/KaTeX_Fraktur-Regular.ttf": "/atomify/static/media/KaTeX_Fraktur-Regular.ed305b5434865e06ffde.ttf",
"static/media/KaTeX_SansSerif-Regular.ttf": "/atomify/static/media/KaTeX_SansSerif-Regular.2f7bc363fc5424ebda59.ttf",
"static/media/KaTeX_Main-BoldItalic.woff": "/atomify/static/media/KaTeX_Main-BoldItalic.428978dc7837d46de091.woff",
"static/media/KaTeX_Math-Italic.woff": "/atomify/static/media/KaTeX_Math-Italic.96759856b4e70f3a8338.woff",
"static/media/KaTeX_Math-BoldItalic.woff": "/atomify/static/media/KaTeX_Math-BoldItalic.3f07ed67f06c720120ce.woff",
"static/media/KaTeX_Main-Italic.woff2": "/atomify/static/media/KaTeX_Main-Italic.fe2176f79edaa716e621.woff2",
"static/media/KaTeX_Main-BoldItalic.woff2": "/atomify/static/media/KaTeX_Main-BoldItalic.20f389c4120be058d80a.woff2",
"static/media/KaTeX_Script-Regular.ttf": "/atomify/static/media/KaTeX_Script-Regular.fc9ba5249878cd8f8d88.ttf",
"static/media/KaTeX_Math-Italic.woff2": "/atomify/static/media/KaTeX_Math-Italic.6d3d25f4820d0da8f01f.woff2",
"static/media/KaTeX_Math-BoldItalic.woff2": "/atomify/static/media/KaTeX_Math-BoldItalic.dcbcbd93bac0470b462d.woff2",
"static/media/KaTeX_Typewriter-Regular.woff": "/atomify/static/media/KaTeX_Typewriter-Regular.4c6b94fd1d07f8beff7c.woff",
"static/media/KaTeX_SansSerif-Bold.woff": "/atomify/static/media/KaTeX_SansSerif-Bold.b9cd458ac6d5889ff9c3.woff",
"static/media/KaTeX_SansSerif-Italic.woff": "/atomify/static/media/KaTeX_SansSerif-Italic.8d593cfaa96238d5e2f8.woff",
"static/media/KaTeX_Typewriter-Regular.woff2": "/atomify/static/media/KaTeX_Typewriter-Regular.c295e7f71970f03c0549.woff2",
"static/media/KaTeX_Fraktur-Bold.woff": "/atomify/static/media/KaTeX_Fraktur-Bold.354501bac435c3264834.woff",
"static/media/KaTeX_Fraktur-Regular.woff": "/atomify/static/media/KaTeX_Fraktur-Regular.6fdf0ac577be0ba82a4c.woff",
"static/media/KaTeX_Caligraphic-Bold.ttf": "/atomify/static/media/KaTeX_Caligraphic-Bold.7489a2fbfb9bfe704420.ttf",
"static/media/KaTeX_Caligraphic-Regular.ttf": "/atomify/static/media/KaTeX_Caligraphic-Regular.7e873d3833eb108a0758.ttf",
"static/media/KaTeX_SansSerif-Regular.woff": "/atomify/static/media/KaTeX_SansSerif-Regular.02271ec5cb9f5b4588ac.woff",
"static/media/KaTeX_Size1-Regular.ttf": "/atomify/static/media/KaTeX_Size1-Regular.6de7d4b539221a49e9e2.ttf",
"static/media/KaTeX_SansSerif-Bold.woff2": "/atomify/static/media/KaTeX_SansSerif-Bold.95591a929f0d32aa282a.woff2",
"static/media/KaTeX_SansSerif-Italic.woff2": "/atomify/static/media/KaTeX_SansSerif-Italic.7d393d382f3e7fb1c637.woff2",
"static/media/KaTeX_Size2-Regular.ttf": "/atomify/static/media/KaTeX_Size2-Regular.57f5c1837853986ea1db.ttf",
"static/media/KaTeX_Fraktur-Bold.woff2": "/atomify/static/media/KaTeX_Fraktur-Bold.931d67ea207ab37ee693.woff2",
"static/media/KaTeX_Fraktur-Regular.woff2": "/atomify/static/media/KaTeX_Fraktur-Regular.172d3529b26f8cedef6b.woff2",
"static/media/KaTeX_Script-Regular.woff": "/atomify/static/media/KaTeX_Script-Regular.073b3402d036714b4370.woff",
"static/media/KaTeX_Size4-Regular.ttf": "/atomify/static/media/KaTeX_Size4-Regular.4ad7c7e8bb8d10a34bb7.ttf",
"static/media/KaTeX_SansSerif-Regular.woff2": "/atomify/static/media/KaTeX_SansSerif-Regular.cd5e231e0cc53b2cb2c0.woff2",
"static/media/KaTeX_Script-Regular.woff2": "/atomify/static/media/KaTeX_Script-Regular.c81d1b2a4b75d3eded60.woff2",
"static/media/KaTeX_Caligraphic-Bold.woff": "/atomify/static/media/KaTeX_Caligraphic-Bold.d757c535a2e5902f1325.woff",
"static/media/KaTeX_Caligraphic-Regular.woff": "/atomify/static/media/KaTeX_Caligraphic-Regular.db074fa22cf224af93d7.woff",
"static/media/KaTeX_Size3-Regular.ttf": "/atomify/static/media/KaTeX_Size3-Regular.8d6b6822586eea3d3b20.ttf",
"static/media/KaTeX_Caligraphic-Bold.woff2": "/atomify/static/media/KaTeX_Caligraphic-Bold.a1abf90dfd72792a577a.woff2",
"static/media/KaTeX_Caligraphic-Regular.woff2": "/atomify/static/media/KaTeX_Caligraphic-Regular.d6484fce1ef428d5bd94.woff2",
"static/media/KaTeX_Size1-Regular.woff": "/atomify/static/media/KaTeX_Size1-Regular.0108e89c9003e8c14ea3.woff",
"static/media/KaTeX_Size2-Regular.woff": "/atomify/static/media/KaTeX_Size2-Regular.3a99e70aee4076660d38.woff",
"static/media/KaTeX_Size4-Regular.woff": "/atomify/static/media/KaTeX_Size4-Regular.aeffd8025cba3647f1a6.woff",
"static/media/KaTeX_Size1-Regular.woff2": "/atomify/static/media/KaTeX_Size1-Regular.6eec866c69313624be60.woff2",
"static/media/KaTeX_Size2-Regular.woff2": "/atomify/static/media/KaTeX_Size2-Regular.2960900c4f271311eb36.woff2",
"static/media/KaTeX_Size4-Regular.woff2": "/atomify/static/media/KaTeX_Size4-Regular.e418bf257af1052628d8.woff2",
"static/media/KaTeX_Size3-Regular.woff": "/atomify/static/media/KaTeX_Size3-Regular.7947224e8a9914fa332b.woff",
"static/media/KaTeX_Size3-Regular.woff2": "/atomify/static/media/KaTeX_Size3-Regular.e1951519f6f0596f7356.woff2",
"index.html": "/atomify/index.html",
"main.377843dd.css.map": "/atomify/static/css/main.377843dd.css.map",
"main.45b37aeb.js.map": "/atomify/static/js/main.45b37aeb.js.map"
},
"entrypoints": [
"static/css/main.377843dd.css",
"static/js/main.45b37aeb.js"
]
}
53 changes: 53 additions & 0 deletions build/examples/diffusion/2d-msd-diffusion/2d-msd-diffusion.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Move camera to a nice position
#/camera position 33.5 39.0 47.8
#/camera target 34.9 38.2 10.1

# Set atom size and color
#/atom 1 1.0 #ffffff

variable x equal 40
variable y equal 40

variable rho equal 0.6
variable t equal 1.0
variable rc equal 2.5

# problem setup

units lj
dimension 2
atom_style atomic
neigh_modify delay 0 every 1

lattice sq2 ${rho}
region simbox block 0 $x 0 $y -0.1 0.1
create_box 1 simbox
create_atoms 1 box

pair_style lj/cut ${rc}
pair_coeff * * 1 1

mass * 1.0
velocity all create $t 97287

fix nve all nve
fix langevin all langevin $t $t 0.1 498094
fix enforce2d all enforce2d
# equilibration run

run 2000
unfix langevin

# data gathering run

reset_timestep 0

# factor of 4 in 2 variables is for 2d
compute msd all msd com yes
variable diffusioncoeff equal c_msd[4]/4/(step*dt+1.0e-6)

thermo_style custom step temp c_msd[4] v_diffusioncoeff
compute displacement all displace/atom

thermo 25
run 10000
79 changes: 79 additions & 0 deletions build/examples/diffusion/2d-msd-diffusion/2d-msd-diffusion.ipynb

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading