---
# System prepended metadata

title: '[Blueline] Granule optimization'
tags: [cycle 32 10/25]

---

# [Blueline] Granule optimization

<!-- Add the tag for the current cycle number in the top bar -->

- Shaped by:
- Appetite (FTEs, weeks):
- Developers: <!-- Filled in at the betting table unless someone is specifically required here -->

## Problem

This project covers all changes that are done in the user-code. In this cycle we prefer performance over readability (if we have to choose). Consider keeping (and testing) the more readable variants.

The following changes could potentially improve performance:
- Remove output fields that are only for debugging
- Introduce field operator output fields with different domains
- Probably minor: Replace copies for in/out fields by forwarding different fields if possible

Any change that touches the shape/scope of programs should verify:
- change actually results in better performance (maybe after tweaking DaCe optimizations)
- change is verified in blueline for relveant experiments (to be defined)


## Appetite
<!-- Explain how much time we want to spend and how that constrains the solution -->

## Solution

### Remove output fields that are only for debugging

#### Dycore local:

```
ddt_vn_apc_ntl1 
ddt_vn_apc_ntl2
ddt_w_adv_ntl1
ddt_w_adv_ntl2
mass_fl_e
w_concorr_c
vn_ie
```


#### Used in dycore and diffusion but no where else:

```
theta_v_ic             diffu_type 5, smagorinsky, not our current code path but COULD be used in the future
vt                     diffu_type 5, smagorinsky, not our current code path but COULD be used in the future
```


#### Used elswhere:

```
rho_ic          used in AES physics for example
exner_pr        used in AES and NWP physics for example
exner_dyn_incr  used in NWP physics for example

mass_flx_me     tracer adv
mass_flx_ic     tracer adv
vol_flx_ic      tracer adv
vn_traj         tracer adv
```


#### Not output, should be removed from output and verify_field in blue line.

```
grf_tend_rho
grf_tend_thv
grf_tend_w
ddt_exner_phy   used in NWP physics for example
ddt_vn_phy
vn_incr
rho_incr
exner_incr
grf_tend_vn

```

### Introduce field operator output fields of varying dimensions

### Replace copies if possible

TODO

## Rabbit holes

## No-gos

## Progress

- [ ] Combine `compute_perturbed_quantities_and_interpolation` further by inlining the half level `nlevp1` fields `exner_at_cells_on_half_levels` and `perturbed_theta_v_at_cells_on_half_levels` which allows us to combine 4 field operators into one.
    - The 4 field operators are `_surface_computations`, `_compute_perturbed_quantities_and_interpolation`, `_interpolate_to_surface`, `_compute_first_and_second_vertical_derivative_of_exner`
    - The field operator `_set_theta_v_on_surface_level` also has a dependency on `perturbed_theta_v_at_cells_on_half_levels` on the last level, however, this can be fixed by inlining `_interpolate_to_surface` into it, which then results in a dependency on `perturbed_theta_v_at_cells_on_model_levels`, which is computed in the big new combined field operator (which we get by fusing the 4 mentioned above), so it is readily available 
    - The open PR is here: https://github.com/C2SM/icon4py/pull/896
