Metadata-Version: 2.4
Name: lcsim
Version: 0.1.7
Summary: LCSim - liquid crystal simulator.
Project-URL: Repository, https://gitlab.com/alepoydes/lcsim
Project-URL: Issues, https://gitlab.com/alepoydes/lcsim/-/issues
Author-email: Igor Lobanov <lobanov.igor@gmail.com>
License-Expression: MIT
License-File: LICENSE.md
Keywords: dynamics,liquid crystal,physics
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Scientific/Engineering :: Physics
Requires-Python: <3.14,>=3.10
Requires-Dist: numpy>=2.1
Requires-Dist: rich>=13.9.4
Requires-Dist: topovec>=0.1.10
Provides-Extra: all-cu12
Requires-Dist: ffmpeg-python; extra == 'all-cu12'
Requires-Dist: moderngl>=5.12.0; extra == 'all-cu12'
Requires-Dist: numba-cuda[cu12]>=0.23.0; extra == 'all-cu12'
Requires-Dist: numba>=0.61; extra == 'all-cu12'
Requires-Dist: requests; extra == 'all-cu12'
Requires-Dist: sadcompressor>=0.1.2; extra == 'all-cu12'
Requires-Dist: sadcompressor>=0.1.3; extra == 'all-cu12'
Requires-Dist: scipy>=1.15.2; extra == 'all-cu12'
Requires-Dist: topovec[gui,ti]; extra == 'all-cu12'
Requires-Dist: topovec[render,sad,ti]; extra == 'all-cu12'
Requires-Dist: topovec[sad]; extra == 'all-cu12'
Requires-Dist: topovec[view]; extra == 'all-cu12'
Provides-Extra: all-cu13
Requires-Dist: ffmpeg-python; extra == 'all-cu13'
Requires-Dist: moderngl>=5.12.0; extra == 'all-cu13'
Requires-Dist: numba-cuda[cu13]>=0.30.0; extra == 'all-cu13'
Requires-Dist: numba>=0.61; extra == 'all-cu13'
Requires-Dist: requests; extra == 'all-cu13'
Requires-Dist: sadcompressor>=0.1.2; extra == 'all-cu13'
Requires-Dist: sadcompressor>=0.1.3; extra == 'all-cu13'
Requires-Dist: scipy>=1.15.2; extra == 'all-cu13'
Requires-Dist: topovec[cuda]; extra == 'all-cu13'
Requires-Dist: topovec[gui,ti]; extra == 'all-cu13'
Requires-Dist: topovec[render,sad,ti]; extra == 'all-cu13'
Requires-Dist: topovec[sad]; extra == 'all-cu13'
Requires-Dist: topovec[view]; extra == 'all-cu13'
Provides-Extra: dev
Requires-Dist: pytest>=8.3; extra == 'dev'
Provides-Extra: gui
Requires-Dist: topovec[gui,ti]; extra == 'gui'
Provides-Extra: gui-cu12
Requires-Dist: numba-cuda[cu12]>=0.23.0; extra == 'gui-cu12'
Requires-Dist: numba>=0.61; extra == 'gui-cu12'
Requires-Dist: topovec[gui,ti]; extra == 'gui-cu12'
Provides-Extra: gui-cu13
Requires-Dist: numba-cuda[cu13]>=0.30.0; extra == 'gui-cu13'
Requires-Dist: numba>=0.61; extra == 'gui-cu13'
Requires-Dist: topovec[gui,ti]; extra == 'gui-cu13'
Provides-Extra: gui-full-cu13
Requires-Dist: numba-cuda[cu13]>=0.30.0; extra == 'gui-full-cu13'
Requires-Dist: numba>=0.61; extra == 'gui-full-cu13'
Requires-Dist: topovec[cuda]; extra == 'gui-full-cu13'
Requires-Dist: topovec[gui,ti]; extra == 'gui-full-cu13'
Provides-Extra: legacy-render
Requires-Dist: ffmpeg-python; extra == 'legacy-render'
Requires-Dist: moderngl>=5.12.0; extra == 'legacy-render'
Requires-Dist: sadcompressor>=0.1.2; extra == 'legacy-render'
Provides-Extra: optics
Requires-Dist: scipy>=1.15.2; extra == 'optics'
Provides-Extra: render
Requires-Dist: topovec[cuda]; extra == 'render'
Requires-Dist: topovec[render,sad,ti]; extra == 'render'
Provides-Extra: render-lite
Requires-Dist: topovec[render,sad,ti]; extra == 'render-lite'
Provides-Extra: run-cu12
Requires-Dist: numba-cuda[cu12]>=0.23.0; extra == 'run-cu12'
Requires-Dist: numba>=0.61; extra == 'run-cu12'
Requires-Dist: sadcompressor>=0.1.3; extra == 'run-cu12'
Requires-Dist: topovec[sad]; extra == 'run-cu12'
Provides-Extra: run-cu13
Requires-Dist: numba-cuda[cu13]>=0.30.0; extra == 'run-cu13'
Requires-Dist: numba>=0.61; extra == 'run-cu13'
Requires-Dist: sadcompressor>=0.1.3; extra == 'run-cu13'
Requires-Dist: topovec[sad]; extra == 'run-cu13'
Provides-Extra: run-notify
Requires-Dist: requests; extra == 'run-notify'
Provides-Extra: runtime-cu12
Requires-Dist: numba-cuda[cu12]>=0.23.0; extra == 'runtime-cu12'
Requires-Dist: numba>=0.61; extra == 'runtime-cu12'
Provides-Extra: runtime-cu13
Requires-Dist: numba-cuda[cu13]>=0.30.0; extra == 'runtime-cu13'
Requires-Dist: numba>=0.61; extra == 'runtime-cu13'
Provides-Extra: runtime-legacy
Requires-Dist: numba<0.63,>=0.61; extra == 'runtime-legacy'
Provides-Extra: sad
Requires-Dist: sadcompressor>=0.1.3; extra == 'sad'
Requires-Dist: topovec[sad]; extra == 'sad'
Provides-Extra: test
Requires-Dist: pytest>=8.3; extra == 'test'
Provides-Extra: tests
Requires-Dist: pytest>=8.3; extra == 'tests'
Provides-Extra: view
Requires-Dist: topovec[cuda]; extra == 'view'
Requires-Dist: topovec[view]; extra == 'view'
Provides-Extra: view-lite
Requires-Dist: topovec[view]; extra == 'view-lite'
Provides-Extra: viewer-cuda
Requires-Dist: topovec[cuda]; extra == 'viewer-cuda'
Description-Content-Type: text/markdown

# LCSim

Liquid crystal simulation tools and command-line utilities.

## Installation

LCSim is published on PyPI. For regular use, install it as a `uv` tool.
Detailed OS-specific instructions:

- Windows: [WINDOWS-INSTALL.md](WINDOWS-INSTALL.md)
- Ubuntu: [UBUNTU-INSTALL.md](UBUNTU-INSTALL.md)

The default dependency set is intentionally light: it is enough for the
`lcsim` dispatcher and shared Python code, but not for running simulations,
opening the GUI, viewing files, or rendering videos. Install the profile for
the workflow you actually use.

Recommended PyPI tool installs:

```sh
# All runtime modes, recommended CUDA 13 profile.
uv tool install 'lcsim[all-cu13]'

# Batch simulation, recommended CUDA 13 profile.
uv tool install 'lcsim[run-cu13]'

# Live simulation GUI, recommended CUDA 13 profile.
uv tool install 'lcsim[gui-cu13]'

# Saved-file viewer with LCSIM scenes and TopoVec scenes, no simulation runtime.
uv tool install 'lcsim[view]'

# TopoVec-based renderer for SAD/TopoVec state files, no simulation runtime.
uv tool install 'lcsim[render]'
```

Use `view-lite` or `render-lite` when you want saved-file tools without
TopoVec CUDA render scenes. Use `all-cu12`, `run-cu12`, or `gui-cu12` only when
the calculation runtime must stay on the CUDA 12 package family. Legacy
`lcsrender` still needs a system `ffmpeg` executable on `PATH`.

For one-off execution without installing persistent commands:

```sh
uvx --from 'lcsim[run-cu13]' lcsim run --help
uvx --from 'lcsim[gui-cu13]' lcsim gui --help
```

From a repository checkout, use the same extras with `uv sync --extra ...` and
run commands with `uv run ...`.

## Command-line tools

The primary public entry point is now `lcsim`:

```sh
lcsim --help
lcsim run --help
lcsim gui --help
lcsim view --help
lcsim extract --help
lcsim render --help
```

Typical usage:

```sh
# Run an off-screen simulation.
lcsim run --preset consym --history HISTORY.json --period 10 --output --sad

# Open the interactive viewer.
lcsim gui

# View a saved simulation state; read-only Settings appear beside Data Sources.
lcsim view run.sad

# Extract selected SAD frames to NPZ snapshots.
lcsim extract run.sad --time 1.0 --output-dir frames

# Render a SAD file with simulation-time video sampling.
lcsim render run.sad --scene "Jones RGB" --output run.mp4 --fps 25
```

Inside `lcsim view`, use `File` -> `Save Current State NPZ...` to save the
selected LCSIM SAD frame or NPZ entry as a full snapshot NPZ file.

Mode documentation:

- [`lcsrun`](doc/lcsrun.md): use `lcsim run ...` for new workflows.
- [`lcsgui`](doc/lcsgui.md): use `lcsim gui ...` for new workflows.
- [`lcsim extract`](doc/lcsim-extract.md): extract selected SAD frames to NPZ snapshots.
- [`lcsrender`](doc/lcsrender.md): legacy renderer; use `lcsim render ...` for the new renderer.
- `lcsoptics`: optional optics utility. Install the `optics` extra if you want to use it.

Legacy commands remain available as compatibility wrappers, but they print a
deprecation notice:

- `lcsrun`: use `lcsim run ...` for new workflows.
- `lcsgui`: use `lcsim gui ...` for new workflows.
- `lcsextract`: use `lcsim extract ...` for new workflows.
- `lcsrender`: use `lcsim render ...` for the new renderer.

Legacy `lcsrender` requires a system `ffmpeg` executable on `PATH`; the new
`lcsim run` path writes SAD and leaves video generation to `lcsim render`.
