# Icon4py Repo walkthrough
## Structure of the repo
- different packages
- up to now each package is a top level folder in the repo. Discussion: should we change?
- content of the packages
- `atm_dyn_iconam`: dycore stencils, diffusion granule, dycore granule
- `advection`: tracer advection stencils
- `pyutils`: icon4pygen, f2ser (serialization),
- `liskov`: icon_liskov
- `py2f` : Fortran interface generation for granules (untested, branch `fortran_interface_generation`)
- `common`: common functionality for icon: dimensions, grid_manager
- `testutils`: test functionality
## Branches
- `greenline-dycore`: base branch for greenline. Contains the diffusion granule and some basic infrastructure. It is still based on the gt4py by Till: `git+https://github.com/tehrengruber/gt4py.git@reduce_foast_lowering_complexity#egg=gt4py`.
- `implement_nh_solve`: python port of solve_nonhydro
- `implement_velocity_advection`: python port of velocity advection (for solve_nonhydro)
- ` dummy_dycore_driver`: simple python program that runs diffusion module and does a dummy timestepping (serves slicing of serialized data)
- `icon_grid_manager`: reading of grid file
- `fortran_interface_generation`
- `fortran-serialisation`: Branch containing Fortran serialisation framework, which includes granule parser and serialisation cli `f2ser`, and serialisation integration into `icon_liskov`.
```mermaid
flowchart LR
subgraph Frontend
A[serialise.py] -->|f2py + regex| C{{Serialisation Interface}}
B[Liskov] -->|Start/EndStencil Directives| C
end
subgraph Backend
C --> D[SerialisationGenerator]
D --> E[CodegenWriter]
E --> F[F90File]
end
```
## CLIs
#### `icon4pygen`
Generate Gridtools C++ code for an icon4py fencil as well as all the associated C++ and Fortran bindings (`.h`, `.f90`, `.hpp`, `.cpp`).
```
Usage: icon4pygen [OPTIONS] FENCIL [BLOCK_SIZE] [LEVELS_PER_THREAD] [OUTPATH]
Arguments:
fencil: may be specified as <module>:<member>, where <module> is
the dotted name of the containing module and <member> is the name of
the fencil.
block_size: refers to the number of threads per block to use in a cuda kernel.
levels_per_thread: how many k-levels to process per thread.
outpath: represents a path to the folder in which to write all generated code.
Options:
--is_global
--imperative Use the imperative backend for code generation.
--help Show this message and exit.
```
#### `icon_liskov`
Command line interface for interacting with the ICON-Liskov DSL Preprocessor. Automatically generates and inserts Fortran integration code into ICON source code.
```
Usage: icon_liskov [OPTIONS] INPUT_FILEPATH OUTPUT_FILEPATH
Arguments:
input_filepath: Path to the input file to process.
output_filepath: Path to the output file to generate.
Options:
-p, --profile Add nvtx profile statements to stencils.
-m, --metadatagen Add metadata header with information about program
(requires git).
--help Show this message and exit.
```
### dummy dycore-driver
in `atm_dyn_iconam/src/icon4py/driver`
```
Usage: dycore_driver.py [OPTIONS] INPUT_PATH
Run the driver.
usage: python driver/dycore_driver.py
../../tests/ser_icondata/mch_ch_r04b09_dsl/ser_data
steps: 1. initialize model:
a) read config
b) initialize grid
c) initialize/configure components ie "granules"
d) setup the time loop
2. run time loop 3. collect output (not implemented)
Options:
--run_path TEXT folder for output
--n_steps INTEGER number of time steps to run
--help Show this message and exit.
```
```
python src/icon4py/driver/dycore_driver.py ../testutils/src/icon4py/testutils/ser_icondata/mch_ch_r04b09_dsl/ser_data --n_steps=2 --run_path=/home/magdalena/temp/icon
```
model/nh_solve
/diffusion
/advection
/graupel
/common
pyutils/