🌶️ chili
A modular, reusable, general purpose backend
The chili
backend acts in two phases.
In the first phase, source code is being generated by
macros and
generics.
Afterwards, the generated code is compiled and run.
To leverage the strong type-system and compiler optimizations of the Rust compiler rustc
,
cellular_raza
makes extensive use of these methods.
Code generation
cellular_raza
provides generic concepts which need to be numerically
integrated.
The chili
backend makes extensive use of macros in order to build a fully working simulation.
Three macros stand out in particular:
build_aux_storage
build_communicator
and
run_main
.
They can also be used in tandem via the
run_simulation
macro.
Aux Storage
To store additional information for cell-agents such as position, velocity increments used by the
solver or information about next update steps of the cycle trait,
we need an additional struct that holds this information.
The chili backend provides the
build_aux_storage
macro
which inserts code that defines said struct depending on which
concepts the user chose.
Communicator
The [chili]((/internals/backend/chili) backend uses parallelization across multiple threads.
Since cellular_raza
makes use of domain decomposition methods,
we must be able to communicate and synchronize between threads.
The build_communicator
macro inserts code which defines a new struct that fulfills this purpose.
Main function
To numerically solve the specified system, chili provides the
run_main
macro.
It decomposes the domain with the cells and distributes the workload across multiple threads.
The main purpose of this macro is to insert only update functions which correspond to the selected
simulation aspects.
It also handles storage of simulation results.