---
# System prepended metadata

title: '[GT4Py] GTIR: avoid accidental promotion of 1D to 2D fields.'
tags: [shaping-archive]

---

# [GT4Py] GTIR: avoid accidental promotion of 1D to 2D fields.

###### tags: `cycle 25 - 09/24` <!-- Change to the current cycle number -->

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

## Problem

```python
output_domain = unstructured_domain({Vertex: (0, num_vertices), K: (0, num_levels)})

v_field = as_fieldop(lambda it: 2*deref(it))(inp_v_field)
set_at(
  expr=as_fieldop(lambda it1, it2: deref(it1) + deref(it2))(
    v_field, inp_vk_field
  ),
  domain=output_domain,
  target=output_vk_field
)
```
The domain inference will transform this into
```python
v_field = as_fieldop(lambda it: 2*deref(it), output_domain)(inp_v_field)
set_at(
  expr=as_fieldop(lambda it1, it2: deref(it1) + deref(it2), output_domain)(
    v_field, inp_vk_field
  ),
  domain=output_domain,
  target=output_vk_field
)
```
which means `v_field` is unnecessarily computed on the entire `Vertex, K` domain, while it only needs to be defined on `Vertex`.

<!-- The raw idea, a use case, or something we’ve seen that motivates us to work on this -->

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

## Solution

- Change the lowering to specify for each `as_fieldop` the dimensions the field is defined on. This would as a side-effect also fix the issue that the type inference requires the domain inference pass to run before. Maybe something like this:
  - `as_fieldop(stencil, auto_domain(Vertex))(fields...)`
  - or this  
  `as_fieldop(stencil, unstructured_domain(Vertex: (-Inf, Inf))(fields...)`
- Adopt the domain inference to only propagate the subset of the domain that is "required"
<!-- The core elements we came up with, presented in a form that’s easy for people to immediately understand -->

## Rabbit holes
<!-- Details about the solution worth calling out to avoid problems -->

## No-gos
<!-- Anything specifically excluded from the concept: functionality or use cases we intentionally aren’t covering to fit the ## appetite or make the problem tractable -->
