# icon-dsl with serialization build on balfrin
Below is a guide of how to compile icon-dsl on balfrin with serialization. Currently, serialbox library is not in the user environment. You have to install it manually.
## Before you start
For the build described in this hackmd, you need to have `dsl/env.sh`, `dsl/setup.sh`, and `config/cscs/alps_nospack`.
They were introduced in this PR: https://github.com/C2SM/icon-exclaim/pull/283 so until they are not merged in main, borrow them from there.
## Steps
1. Prepare the uenv image. Details about uenv can be found on https://confluence.cscs.ch/display/KB/UENV+user+environments
```bash
git clone https://github.com/eth-cscs/uenv.git
cd uenv
# run the installation script.
# if this is the first time that you are installing uenv,
# type "yes" or "y" when prompted whether to update your ~/.bashrc file.
./install --local
```
2. activate the environment (you need this also for running ICON, so put it in your run scripts or bashrc)
```bash
uenv start --view=icon-wcp:icon /scratch/mch/leclairm/uenvs/images/icon.v1.rc4.sqfs
```
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 repo and move to the branch you need to work with
```bash
git clone git@github.com:C2SM/icon-exclaim.git
cd icon-exclaim
git submodule update --init --recursive
```
4. Prepare the serialbox library
4.1. **Spack**
```bash
git clone --depth 1 --recurse-submodules --shallow-submodules -b v0.21.1.3 https://github.com/C2SM/spack-c2sm.git
cd spack-c2sm
source setup-env.sh # this line should actually be `source setup-env.sh /user-environment`, but neither Chia Rui nor Jacopo have tested it
spack install serialbox%nvhpc@24.5 +fortran # this will take quite some time
```
if spack does not automatically detect the compiler, you can do the following to find the correct compiler and rerun the command above
```bash
spack compiler find
```
In the script ```setup.sh```, you need to add the following lines
```bash
source /scratch/mch/<your-user-name>/spack-c2sm/setup-env.sh # wherever this is
spack load serialbox%nvhpc@24.5
```
and in `env.sh` change this variable
```bash
SERIALBOX2_ROOT=$(spack find --format "{prefix}" serialbox@2.6.1%nvhpc@24.5 | head -n1)
```
4.2. **No spack**
Or, if you do not want to use spack, you can manually install serialbox by (which is much faster than spack install above)
```bash
git clone https://github.com/eth-cscs/serialbox2.git
cd serialbox2/
mkdir build
cd build/
export CC=mpicc
export FC=mpif90
export CXX=mpicxx
cmake ../ -DSERIALBOX_ENABLE_FORTRAN=ON
cmake --build .
cmake --build . --target install
```
Now you have to change `SERIALBOX2_ROOT` to your serialbox installation path in the script `env.sh`, for example,
```bash
SERIALBOX2_ROOT=/scratch/mch/cong/serialbox2/install
```
5. Build icon-dsl.
Building on cpu:
In `setup.sh`:
- add an option for a new `build_type` at the top: `build_serialize_cpu`;
- in `build_for_type()` copy the build_cpu options as follows
```bash
build_for_type() {
local build_type=$1
if [[ "$build_type" == "build_cpu" || "$build_type" == "build_serialize_cpu" ]]; then
build_dir="build_cpu"
gpu_option=""
liskov_option="--enable-dsl-local"
ACC_FC_FLAGS=""
CUDA_LDFLAGS=""
CUDA_LIBS=""
NVCFLAGS=""
if [ "$build_type" == "build_serialize_cpu" ]; then
build_dir="build_serialize_cpu"
liskov_option="--enable-serialization"
fi
```
Finally, copy `alps_nospack` to `icon-exclaim/dsl/icon-exclaim/config/cscs/`. Then, run the `setup.sh` script (note that the setup script and `env.sh` must be at the same directory with icon-exclaim, icon4py, and gridtools)
```bash
./setup.sh build_serialize
```
## Troubleshooting:
a. If you encounter this error:
```bash
NVFORTRAN-F-0004-Unable to open MODULE file mo_nonhydro_state.mod (/scratch/mch/jcanton/icon-exclaim/icon-exclaim/src/shr_horizontal/mo_icon_interpolation_scalar.f90: 35)
NVFORTRAN/x86-64 Linux 24.5-1: compilation aborted
```
you need to remove the serialization code (lines with `!$ser`) from `mo_icon_interpolation_scalar.f90`.
b. Similar as above:
```bash
make[1]: Entering directory '/scratch/mch/jcanton/icon-exclaim/icon-exclaim/build_serialize_cpu'
FC src/shr_horizontal/mo_math_gradients.pp-fpp.pp-sb2.o
NVFORTRAN-F-0004-Unable to open MODULE file mo_nonhydro_state.mod (/scratch/mch/jcanton/icon-exclaim/icon-exclaim/src/shr_horizontal/mo_math_gradients.f90: 45)
NVFORTRAN/x86-64 Linux 24.5-1: compilation aborted
```
remove serialization code in `mo_math_gradients.f90`