# [Greenline] Metric fields factory
<!-- 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
<!-- The raw idea, a use case, or something we’ve seen that motivates us to work on this -->
Over the last cycles the computation of ICON's metric fields was ported to `icon4py`. We now want to use them in the model.
## Appetite
<!-- Explain how much time we want to spend and how that constrains the solution -->
One developer, full cycle. If metrics fields are done the same work can be extended to the interpolation coefficients.
## Solution
<!-- The core elements we came up with, presented in a form that’s easy for people to immediately understand -->
The metric fields are static fields possibly used in several model components. We want to provide these fields through a factory that is responsible for allocating memory and and computing the fields on demand.
### Properties
- The factory should be the only way to request the fields.
- Fields are allocated and computed upon request and cached.
- The fields are requested via a string name, which is a name taken from CF conventions or built in a similar way.
- Since the fields depend on each other, requesting a field will possibly trigger the computation of its dependencies
- The Factory can be queried for metadata like `units`, `dimensions`, ...
- factory might also return a list of available fields.
The factory should be build up statically, but data needed for field computation like the GRID size, topology and geometry fields can only be passed once a concrete simulation is setup.
### steps
Integrate the metric fields in the factory:
1. find useful name, (inspired by [CF conventions](https://cfconventions.org/Data/cf-standard-names/current/build/cf-standard-name-table.html), [CF name guidelines](http://cfconventions.org/Data/cf-standard-names/docs/guidelines.html) and build up field metadata. The relevant information (meaning, units, dimension) is normally available from comments in ICON where they declare the fields and/or in icon4py docstrings)
2. create a `FieldProvider` for the field computation with the relevant `func`, dependencies, compute domain.
3. register the provider in the factory.
Test the factory by running it with the test field
### draft solution
Very ad hoc prototype : https://github.com/C2SM/icon4py/tree/prototype_fields_factory:
## 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 -->
## Progress
<!-- Don't fill during shaping. This area is for collecting TODOs during building. As first task during building add a preliminary list of coarse-grained tasks for the project and refine them with finer-grained items when it makes sense as you work on them. -->
- [x] Naming of fields
- [x] dictionary with metadata
- [ ] build up the metadata dictionary for the metrics fields
- [ ]
- [ ] FieldProvider:
- [x] Dummy Provider for fields computed elsewhere (geometry, interpolation...)
- [x] Protocol and implementation for GT4Py Programs, Numpy functions
- [ ] Open: Need infrastructure for run time lookup of:
- [ ] configuration parameters
- [ ] geometry
- [ ] vertical index offset computation
- [x] Factory
- [x] Register provider (definition time)
- [x] validation of dependency tree (definition time)
- [x] retrieve and compute fields (model run time)
- [ ] Setup factory for metrics fields and test field construction
- [ ] Task 4