---
# System prepended metadata

title: ICON Liskov Generation Targets

---

# ICON Liskov Generation Targets

### Simple Stencil Case

**Fortran Stencil**

```Fortran
!$ACC PARALLEL IF( i_am_accel_node .AND. acc_on ) DEFAULT(NONE) ASYNC(1)
            !$ACC LOOP GANG VECTOR
            DO jk = 1, nlev
              DO jc = i_startidx_2, i_endidx_2
                z_rth_pr(jc,jk,1,1) = 0._wp
                z_rth_pr(jc,jk,1,2) = 0._wp
              ENDDO
            ENDDO
!$ACC END PARALLEL
```

- Fortran preprocessor needs to be aware of start and end of each "stencil". Markers can be set using preprocessor `start` and `end` directives.

**Call to DSL interface (gt4py)**

```Fortran
call wrap_run_mo_velocity_advection_stencil_07(
		vn_ie=p_diag%vn_ie(:,:,1), & 
        inv_dual_edge_length=p_patch%edges%inv_dual_edge_length(:,1), &  
        w=p_prog%w(:,:,1), z_vt_ie=z_vt_ie(:,:,1), &
        inv_primal_edge_length=p_patch%edges%inv_primal_edge_length(:,1), &
        tangent_orientation=p_patch%edges%tangent_orientation(:,1), &
        z_w_v=z_w_v(:,:,1), &
        z_v_grad_w=z_v_grad_w(:,:,1), z_v_grad_w_before=z_v_grad_w_before(:,:,1), &
        z_v_grad_w_abs_tol=1e-16_wp, &
        vertical_lower=1, &
        vertical_upper=nlev, &
        horizontal_lower=i_startidx, &
        horizontal_upper=i_endidx)
```

- Requires knowing name of target stencil.
- Requires knowing all arguments of stencil (in/out fields) as well as their dimensions.
- Requires knowledge of vertical and horizontal bounds, unless we pass these in from the gt4py stencil directly.
- Tolerances

**Nvtx profiling**

```Fortran
call nvtxStartRange("mo_solve_nonhydro_stencil_01")

! Fortran stencil code goes here

call nvtxEndRange()
```

- Requires knowing name of target stencil.

**Output field creation (copying)**

```Fortran
!$ACC PARALLEL IF( i_am_accel_node .AND. acc_on ) DEFAULT(NONE) ASYNC(1)
z_rth_pr_1_before(:,:,:) = z_rth_pr(:,:,:,1)
z_rth_pr_2_before(:,:,:) = z_rth_pr(:,:,:,2)
!$ACC END PARALLEL
```

- Requires names of output fields of the stencil.
- Needs to know dimensionality of each output field (unless a generic copy function can be written in Fortran to handle this).

**Importing DSL wrapped function interfaces**

```Fortran
USE mo_velocity_advection_stencil_01, ONLY: wrap_run_mo_velocity_advection_stencil_01
```

- Are these modules generated by `icon4pygen` at compile time?

**DSL in/out field declarations**

```Fortran
REAL(wp), DIMENSION(nproma,p_patch%nlev,p_patch%nblks_e) :: vt_before
REAL(wp), DIMENSION(nproma,p_patch%nlevp1,p_patch%nblks_e) :: vn_ie_before
REAL(wp), DIMENSION(nproma,p_patch%nlev,p_patch%nblks_e) :: z_kin_hor_e_before
```

- Requires configuring the different dimension variables for each field.

**Loading dsl fields onto the GPU**

```Fortran
!$ACC DATA COPYIN( z_w_concorr_me, z_kin_hor_e, z_vt_ie ), &

!$ACC CREATE(z_w_concorr_mc, z_w_con_c, cfl_clipping, z_w_con_c_full, z_v_grad_w, z_w_v, zeta, z_ekinh, levmask, levelmask, &

!$ACC vt_before, &

!$ACC vn_ie_before, z_kin_hor_e_before, &

!$ACC z_vt_ie_before, &

!$ACC z_w_concorr_me_before, &

!$ACC z_v_grad_w_before, &

!$ACC z_ekinh_before, &

!$ACC z_w_concorr_mc_before, &

!$ACC w_concorr_c_before, &

!$ACC z_w_con_c_before, &

!$ACC pre_levmask, &

!$ACC cfl_clipping_dsl, &

!$ACC pre_levelmask_dsl, &

!$ACC vcfl_dsl, &

!$ACC cfl_clipping_before, &

!$ACC pre_levelmask_before, &

!$ACC levelmask_dsl, &

!$ACC vcfl_before, &

!$ACC z_w_con_c_full_before, &

!$ACC ddt_w_adv_before, &

!$ACC ddt_vn_adv_before &

!$ACC ), &

!$ACC PRESENT( p_diag, p_prog, p_int, p_metrics, p_patch ), &

!$ACC PRESENT( iqidx, iqblk, ividx, icblk, icidx, ieidx, ieblk, incblk, ivblk, incidx ) &

!$ACC IF ( i_am_accel_node .AND. acc_on )
```

- Requires simple way of parsing ACC statements to be able to insert additional fields in `DATA CREATE` directive.

**General structure for a stencil**

The general structure of the generated code looks as follows for the simple stencil case:

```pseudocode
#ifdef __DSL_VERIFY

<Output Field Creation>

<Nvtx Start>

<Fortran Stencil>

<Nvtx End>

#endif

<Call to DSL Interface>
```


### DSL Interface Call Generation


#### Simple case

- Stencil arguments input/output fields -> get them from parsed gt4py stencil.
- Horizontal and vertical bounds -> Either from DSL directive, or directly through `custom_domain` in gt4py.
- Name of target stencil -> get from gt4py stencil.
- `start` and `end` of Fortran stencil -> line numbers from DSL directives in file.