Modules¶
cacao is split into modules. Each module is a directory at the top of the repository, and each one builds a shared library that milk loads at runtime. Within the milk CLI, a module’s commands are prefixed by its shortname.
Directory |
Library |
CLI shortname |
Description |
|---|---|---|---|
|
|
|
AO loop control engine: modal and zonal filtering, modal statistics. Also installs the cacao setup, task manager, FPS and |
|
|
|
DM operation: DM channel combination, simulated turbulence, astrogrid |
|
|
|
I/O tools: WFS image acquisition, WFS camera simulation, spot finding |
|
|
|
Acquire calibration: linear response measurement |
|
|
|
Compute calibration: control modes, control matrices, Hadamard decoding, masks |
|
|
|
Predictive control filters |
|
|
|
Miscellaneous computation tools |
|
|
|
Performance monitoring and testing, including latency measurement |
|
|
|
Pyramid WFS tools |
|
Python package |
Python AO tools (calibration, DM tools) |
Dependencies¶
All modules link milk’s CLIcore, and all modules except AOloopControl
link cacaoAOloopControl. Linear algebra comes from OpenBLAS with LAPACKE, or
from Intel MKL when found. computeCalib uses CUDA and MAGMA when milk is
configured with -DUSE_CUDA=ON / -DUSE_MAGMA=ON.
Modules also use headers from milk modules they don’t link, and
AOloopControl_acquireCalib calls functions in computeCalib without linking
it. These symbols are resolved at runtime because milk loads all modules into
one process. So a module can’t be used on its own without milk.
Loading a module¶
milk > mload cacaoAOloopControl
milk > m?