# icon-dsl build on todi
Below is a guide of how I compiled icon-dsl.
1. Prepare the uenv image. Details about uenv can be found on https://confluence.cscs.ch/display/KB/UENV+user+environments
```bash
uenv repo create # this will create .uenv_image in your account
uenv image pull icon-wcp/v1:rc4 # pull uenv image required to build icon
```
2. activate the environment
```bash
uenv start --view=icon icon-wcp/v1:rc4
```
You should see something as shown below when you type ```uenv status```
```bash
/user-environment:icon-wcp
The tools required to build ICON
views:
icon (loaded)
modules: activate modules
spack: configure spack upstream
```
3. clone the repos. icon-exclaim repository is still not an open-source code yet. Make sure that you have the access rights to clone the repository. Please contact William Sawyer if you do not have the permission to clone icon-exclaim.
```bash
git clone -b gh_atmcirc git@github.com:C2SM/icon-exclaim.git
git clone -b v0.0.11 git@github.com:C2SM/icon4py.git
git clone -b v2.3.4 https://github.com/GridTools/gridtools.git
cd icon-exclaim
git submodule update --init --recursive
```
4. Change the gt4py branch in ```base-requirements.txt``` in the root directory of icon4py repository to
```bash
gt4py @ git+https://github.com/GridTools/gt4py.git@icon4py_20240521
```
5. create python virtual environment in icon4py by running the following script
```bash
pushd icon4py
python3.10 -m venv .venv
source .venv/bin/activate
pip install --upgrade wheel
pip install --upgrade pip
pip install --upgrade setuptools
pip install -r requirements.txt
deactivate
popd
```
6. We build icon out of source by creating a directory in icon-exclaim folder.
```bash
cd icon-exclaim/
mkdir build_dsl
cd build_dsl
./../config/cscs/todi_nospack.dsl.nvidia_PPK --disable-rte-rrtmgp --enable-liskov=substitute --disable-liskov-fused
make -j 20
```
# BUG FIX
A bug in the acc compiler may cause the following error during the linking stage when you build icon with native ecrad code
```bash
nvlink error : entry function 'radiation_mcica_acc_sw_solver_mcica_acc_sw_291_gpu' with max regcount of 96 calls function 'radiation_cloud_generator_acc_cloud_generator_acc_' with regcount of 212
pgacclnk: child process exit status 2: /user-environment/linux-sles15-neoverse_v2/gcc-12.3.0/nvhpc-24.3-ti5vnjw2lq7oydromjw6bvnb7aliu6qa/Linux_aarch64/24.3/compilers/bin/tools/nvdd
```
If you see this error when building icon, please go to ```icon-exclaim/external/ecrad/radiation/radiation_mcica_acc_sw.f90``` and add ```0``` to the third input argument of the subroutine ```cloud_generator_acc``` as follows:
```bash
! Do cloudy-sky calculation
call cloud_generator_acc(ng, nlev, &
& single_level%iseed(jcol) + 0, & ! add a dummy zero here to fix the compiler bug
& config%cloud_fraction_threshold, &
& frac(:,jcol), overlap_param(:,jcol), &
& config%cloud_inhom_decorr_scaling, frac_std(:,jcol), &
& config%pdf_sampler%ncdf, config%pdf_sampler%nfsd, &
& config%pdf_sampler%fsd1, config%pdf_sampler%inv_fsd_interval, &
& sample_val, &
& od_scaling, total_cloud_cover, &
& ibegin(jcol), iend(jcol), &
& cum_cloud_cover=cum_cloud_cover(:,jcol), &
& pair_cloud_cover=pair_cloud_cover(:,jcol))
```