Metadata-Version: 2.4
Name: dapper
Version: 1.8.1
Summary: DAPPER benchmarks the performance of data assimilation (DA) methods.
Project-URL: Documentation, https://nansencenter.github.io/DAPPER/
Project-URL: Source, https://github.com/nansencenter/DAPPER
Project-URL: Tracker, https://github.com/nansencenter/DAPPER/issues
Author-email: "Patrick N. Raanes" <patrick.n.raanes@gmail.com>
License: MIT
License-File: LICENCE.txt
Keywords: bayesian-filter,bayesian-methods,chaos,data-assimilation,enkf,kalman-filtering,particle-filter,state-estimation
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Scientific/Engineering :: Mathematics
Requires-Python: >=3.12
Requires-Dist: colorama~=0.4.1
Requires-Dist: dill==0.3.8
Requires-Dist: ipywidgets>=8.1.8
Requires-Dist: matplotlib>=3.10
Requires-Dist: mpl-tools==0.4.2
Requires-Dist: notebook~=6.5
Requires-Dist: numpy~=2.0
Requires-Dist: pathos~=0.3
Requires-Dist: pyyaml>=6.0.2
Requires-Dist: scipy>=1.14
Requires-Dist: setuptools>=65.5.0
Requires-Dist: tabulate>=0.9
Requires-Dist: threadpoolctl>=3.0.0
Requires-Dist: tqdm~=4.67
Provides-Extra: debug
Requires-Dist: ipdb; extra == 'debug'
Requires-Dist: ipython>=7.34; extra == 'debug'
Requires-Dist: line-profiler; extra == 'debug'
Requires-Dist: pre-commit; extra == 'debug'
Provides-Extra: dev
Requires-Dist: ipdb; extra == 'dev'
Requires-Dist: ipython>=7.34; extra == 'dev'
Requires-Dist: jupytext; extra == 'dev'
Requires-Dist: line-profiler; extra == 'dev'
Requires-Dist: mkdocs-gen-files; extra == 'dev'
Requires-Dist: mkdocs-glightbox; extra == 'dev'
Requires-Dist: mkdocs-jupyter; extra == 'dev'
Requires-Dist: mkdocs-literate-nav; extra == 'dev'
Requires-Dist: mkdocs-material; extra == 'dev'
Requires-Dist: mkdocs-section-index; extra == 'dev'
Requires-Dist: mkdocstrings; extra == 'dev'
Requires-Dist: mkdocstrings-python; extra == 'dev'
Requires-Dist: pre-commit; extra == 'dev'
Requires-Dist: pybtex; extra == 'dev'
Requires-Dist: pytest; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: pytest-timeout; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Requires-Dist: ty; extra == 'dev'
Provides-Extra: doc
Requires-Dist: jupytext; extra == 'doc'
Requires-Dist: mkdocs-gen-files; extra == 'doc'
Requires-Dist: mkdocs-glightbox; extra == 'doc'
Requires-Dist: mkdocs-jupyter; extra == 'doc'
Requires-Dist: mkdocs-literate-nav; extra == 'doc'
Requires-Dist: mkdocs-material; extra == 'doc'
Requires-Dist: mkdocs-section-index; extra == 'doc'
Requires-Dist: mkdocstrings; extra == 'doc'
Requires-Dist: mkdocstrings-python; extra == 'doc'
Requires-Dist: pybtex; extra == 'doc'
Provides-Extra: lint
Requires-Dist: ruff; extra == 'lint'
Requires-Dist: ty; extra == 'lint'
Provides-Extra: qt
Requires-Dist: pyqt5; extra == 'qt'
Requires-Dist: qtpy; extra == 'qt'
Provides-Extra: test
Requires-Dist: pytest; extra == 'test'
Requires-Dist: pytest-cov; extra == 'test'
Requires-Dist: pytest-timeout; extra == 'test'
Description-Content-Type: text/markdown


<!--
!      ___   _   ___ ___ ___ ___
!     |   \ /_\ | _ \ _ \ __| _ \
!     | |) / _ \|  _/  _/ _||   /
!     |___/_/ \_\_| |_| |___|_|_\
!
!
-->

<img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/logo_wtxt.png" alt="DAPPER logo" align="left" width="250"/>

DAPPER is a set of templates for **benchmarking** the performance of **data assimilation** (DA) methods.
The numerical experiments provide support and guidance for new developments in DA.
The typical set-up is a **synthetic (twin) experiment**, where you
specify a dynamic model and an observational model,
and use these to generate a synthetic truth (multivariate time series),
and then estimate that truth given the models and noisy observations.

<!-- Badges / shields -->
[![Github CI](https://img.shields.io/github/actions/workflow/status/nansencenter/DAPPER/tests.yml?branch=master&logo=github&style=for-the-badge)](https://github.com/nansencenter/DAPPER/actions)
[![Coveralls](https://img.shields.io/coveralls/github/nansencenter/DAPPER?style=for-the-badge&logo=coveralls)](https://coveralls.io/github/nansencenter/DAPPER?branch=master)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?style=for-the-badge&logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
[![PyPI - Version](https://img.shields.io/pypi/v/dapper.svg?style=for-the-badge&logo=pypi&logoColor=white)](https://pypi.python.org/pypi/dapper/)
[![PyPI - Downloads](https://img.shields.io/pypi/dw/dapper?style=for-the-badge&logo=pypi&logoColor=white)](https://pypi.org/project/dapper)

## Getting started

- Read & run [examples](docs/examples)/`basic_1.py` and `basic_2.py`,
  or their corresponding notebooks [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/github/nansencenter/DAPPER)
  (requires Google login).
- This [screencast](https://www.youtube.com/watch?v=YtalK0Zkzvg&t=6475s)
  provides an overview to DAPPER.
- [Install](#installation).
- The [documentation](https://nansencenter.github.io/DAPPER)
  includes general guidelines and the API reference,
  but most users must expect to read the code as well.
- If used towards a publication, please cite as
  *The experiments used (inspiration from) DAPPER [ref], version 1.6.0*,
  or similar, where [ref] points to [![DOI](https://joss.theoj.org/papers/10.21105/joss.05150/status.svg)](https://doi.org/10.21105/joss.05150).
- Also see the interactive [tutorials on DA theory](https://github.com/nansencenter/DA-tutorials) with Python.

## Highlights

DAPPER enables the numerical investigation of [DA methods](#da-methods)
through a variety of typical [test cases](#test-cases-models) and statistics. It
(a) reproduces numerical benchmarks results reported in the literature, and
(b) facilitates comparative studies, thus promoting the
(a) reliability and
(b) relevance of the results.
For example, the figure below is generated by `docs/examples/basic_3.py`,
reproduces figure 5.7 of [these lecture notes](https://cerea.enpc.fr/HomePages/bocquet/teaching/assim-mb-en-0.52.pdf).
DAPPER is
(c) open source, written in Python, and
(d) focuses on readability;
this promotes the
(c) reproduction and
(d) dissemination of the underlying science,
and makes it easy to adapt and extend.

![Comparative benchmarks with Lorenz-96 plotted as a function of the ensemble size (N)](https://github.com/nansencenter/DAPPER/raw/master/docs/images/ex3.svg)

DAPPER demonstrates how to parallelise ensemble forecasts (e.g., the QG model),
local analyses (e.g., the LETKF), and independent experiments (e.g., `docs/examples/basic_3.py`).
It includes a battery of diagnostics and statistics,
which all get averaged over subdomains (e.g., "ocean" and "land") and then in time.
Confidence intervals are computed, taking into account auto-correlations,
and used for uncertainty quantification, and significant digits printing.
Several diagnostics are included in the on-line "liveplotting" illustrated below,
which may be paused for further interactive inspection.
In summary, DAPPER is well suited for teaching and fundamental DA research.
Also see its [drawbacks](#similar-projects).

![EnKF - Lorenz-96](https://github.com/nansencenter/DAPPER/raw/master/docs/images/ex1.jpg)

<!-- Non-highlighted features:
- Time sequences use via `tools.chronos.Chronology` and `tools.chronos.Ticker`.
- Random variables via `tools.randvars.RV`: Gaussian, Student-t, Laplace, Uniform,
  ..., as well as support for custom sampling functions.
- Covariance matrices via `tools.matrices.CovMat`:
  provides input flexibility/overloading,
  lazy eval that facilitates the use of non-diagonal
  covariance matrices (whether sparse or full).
- built-in tools for experiment and result management,
-->

## Installation

Successfully tested on Linux/Mac/Windows. Also see: [developer guide](https://nansencenter.github.io/DAPPER/dev_guide).

### Prerequisite: Python ≥ 3.12 and a virtual environment

Can be installed from [python.org/downloads](https://www.python.org/downloads/)
but [Miniconda](https://docs.conda.io/en/latest/miniconda.html)
or [uv](https://docs.astral.sh/uv/) will give you more options.

Either way, subsequently check your current python by [opening a terminal](https://www.google.com/search?q=open+terminal+on+windows),
and typing `python --version`

Create and activate (and keep using!) a virtual environment using your chosen tool.

### Install

- Download and unzip (or `git clone`) DAPPER.
- Move the resulting folder wherever you like.
- In the terminal, navigate (`cd`) into that "DAPPER" folder and enter
- `pip install -e .`

PS: If all you need is to use (but not modify and play around with) DAPPER as a library package,
then all of the above can be replaced simply by `pip install dapper`

### Try it out

Assuming you are in the DAPPER dir, do

```sh
python docs/examples/basic_1.py
```

## DA methods

<!-- markdownlint-capture -->
<!-- markdownlint-disable line-length -->
| Method                                               | Literature reproduced                                                                                                                        |
|------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------|
| EnKF <sup>1</sup>                                    | [Sakov08](https://nansencenter.github.io/DAPPER/references/#sakov2008b), [Hoteit15](https://nansencenter.github.io/DAPPER/references/#hoteit2015a), [Grudzien2020](https://nansencenter.github.io/DAPPER/references/#grudzien2020a) |
| EnKF-N                                               | [Bocquet12](https://nansencenter.github.io/DAPPER/references/#bocquet2012a), [Bocquet15](https://nansencenter.github.io/DAPPER/references/#bocquet2015)                                 |
| EnKS, EnRTS                                          | [Raanes2016](https://nansencenter.github.io/DAPPER/references/#raanes2016thesis)                                                              |
| iEnKS / iEnKF / EnRML / ES-MDA <sup>2</sup>          | [Sakov12](https://nansencenter.github.io/DAPPER/references/#sakov2012a), [Bocquet12](https://nansencenter.github.io/DAPPER/references/#Bocquet12), [Bocquet14](https://nansencenter.github.io/DAPPER/references/#bocquet2014) |
| LETKF, local & serial EAKF                           | [Bocquet11](https://nansencenter.github.io/DAPPER/references/#bocquet2011)                                                                   |
| Sqrt. model noise methods                            | [Raanes2014](https://nansencenter.github.io/DAPPER/references/#raanes2014)                                                                   |
| Particle filter (bootstrap) <sup>3</sup>             | [Bocquet10](https://nansencenter.github.io/DAPPER/references/#bocquet2010a)                                                                  |
| Optimal/implicit Particle filter  <sup>3</sup>       | [Bocquet10](https://nansencenter.github.io/DAPPER/references/#bocquet2010a)                                                                  |
| NETF                                                 | [Tödter15](https://nansencenter.github.io/DAPPER/references/#todter2015a), [Wiljes16](https://nansencenter.github.io/DAPPER/references/#wiljes2016)                                 |
| Rank histogram filter (RHF)                          | [Anderson10](https://nansencenter.github.io/DAPPER/references/#anderson2010)                                                                 |
| 4D-Var                                               |                                                                                                                                              |
| 3D-Var                                               |                                                                                                                                              |
| Extended KF                                          |                                                                                                                                              |
| Optimal interpolation                                |                                                                                                                                              |
| Climatology                                          |                                                                                                                                              |
<!-- markdownlint-restore -->

<sup>1</sup>: Stochastic, DEnKF (i.e. half-update), ETKF (i.e. sym. sqrt.).
Serial forms are also available.  
Tuned with inflation and "random, orthogonal rotations".  
<sup>2</sup>: Also supports the bundle version,
and "EnKF-N"-type inflation.  
<sup>3</sup>: Resampling: multinomial
(including systematic/universal and residual).  
The particle filter is tuned with "effective-N monitoring",
"regularization/jittering" strength, and more.

For a list of ready-made experiments with suitable,
tuned settings for a given method (e.g., the `iEnKS`), use:

```sh
grep -r "xp.*iEnKS" dapper/mods
```


## Test cases (models)

Simple models facilitate the reliability, reproducibility,
and interpretability of experiment results.

| Model                | Lin | TLM`**` | PDE?  | Phys.dim. | State len | Lyap≥0 | Implementer         |
|----------------------|-----|-------|-------|-----------|-----------|--------|---------------------|
| Id                   | Yes | Yes   | No    | N/A       | `*`         | 0      | Raanes              |
| Linear Advect. (LA)  | Yes | Yes   | Yes   | 1d        | 1000 `*`    | 51     | Evensen/Raanes      |
| DoublePendulum       | No  | Yes   | No    | 0d        | 4         | 2      | Matplotlib/Raanes   |
| Ikeda                | No  | Yes   | No    | 0d        | 2         | 1      | Raanes              |
| LotkaVolterra        | No  | Yes   | No    | 0d        | 5 `*`       | 1      | Wikipedia/Raanes    |
| Lorenz63             | No  | Yes   | "Yes" | 0d        | 3         | 2      | Sakov               |
| Lorenz84             | No  | Yes   | No    | 0d        | 3         | 2      | Raanes              |
| Lorenz96             | No  | Yes   | No    | 1d        | 40 `*`      | 13     | Raanes              |
| Lorenz96s            | No  | Yes   | No    | 1d        | 10 `*`      | 4      | Grudzien            |
| LorenzUV             | No  | Yes   | No    | 2x 1d     | 256 + 8 `*` | ≈60    | Raanes              |
| LorenzIII            | No  | No    | No    | 1d        | 960 `*`     | ≈164   | Raanes              |
| Vissio-Lucarini 20   | No  | Yes   | No    | 1d        | 36 `*`      | 10     | Yumeng              |
| Kuramoto-Sivashinsky | No  | Yes   | Yes   | 1d        | 128 `*`     | 11     | Kassam/Raanes       |
| Quasi-Geost (QG)     | No  | No    | Yes   | 2d        | 129²≈17k  | ≈140   | Sakov               |

- `*`: Flexible; set as necessary
- `**`: Tangent Linear Model included?

The models are found as subdirectories within `dapper/mods`.
A model should be defined in a file named `__init__.py`,
and illustrated by a file named `demo.py`.
Most other files within a model subdirectory
are usually named `authorYEAR.py` and define a `HMM` object,
which holds the settings of a specific twin experiment,
using that model,
as detailed in the corresponding author/year's paper.
A list of these files can be obtained using

```sh
find dapper/mods -iname '[a-z]*[0-9]*.py'
```

Some files contain settings used by several papers.
Moreover, at the bottom of each such file should be (in comments)
a list of suitable, tuned settings for various DA methods,
along with their expected, average `rmse.a` score for that experiment.
As mentioned [above](#da-methods), DAPPER reproduces literature results.
You will also find results that were not reproduced by DAPPER.


## Statistics

Each experiment (`xp`) populates `xp.stats` with per-timestep timeseries diagnostics
and `xp.avrgs` with time-averages and their confidence intervals.
Most of these carry subscripts `.f`, `.a`, `.s`, `.i`
corresponding to forecast, analysis, smoothed (smoothers only), and integrational statistics.
Vector statistics (one value per state dimension) are also summarised spatially
via `rms`, `m`, `ma`, `ms`, `gm`, and per `HMM.sectors` if defined.

<!-- markdownlint-capture -->
<!-- markdownlint-disable line-length -->
| Statistic | Type | Description |
|-----------|------|-------------|
| `mu` | vector | Mean estimate (ensemble mean or Kalman/variational estimate) |
| `spread` | vector | Spread (ensemble std dev or posterior std dev) |
| `err` | vector | Error of mean estimate vs. truth (`mu − truth`) |
| `gscore` | vector | Gaussian (log) score: `2·log(spread) + (err/spread)²` |
| `crps` | vector | Continuous ranked probability score (proper scoring rule) |
| `mad` | scalar | Mean absolute deviation of ensemble from its mean |
| `skew` | scalar <sup>e</sup> | Skewness of the ensemble |
| `kurt` | scalar <sup>e</sup> | Excess kurtosis (0 for Gaussians) |
| `svals` | vector <sup>e,s</sup> | Singular values of the ensemble anomalies |
| `umisf` | vector <sup>e,s</sup> | Error projected onto the leading ensemble directions |
| `w` | vector <sup>p</sup> | Importance weights |
| `rh` | vector <sup>e</sup> | Rank histogram (rank of truth among sorted ensemble members) |
| `trHK` | scalar <sup>†</sup> | Trace of the obs-space gain matrix `HK` |
| `infl` | scalar <sup>†</sup> | Inflation factor applied at this step |
| `iters` | scalar <sup>†</sup> | Iteration count (iterative methods) |
| `N_eff` | scalar <sup>p,†</sup> | Effective ensemble size `1 / Σwᵢ²` |
| `wroot` | scalar <sup>p,†</sup> | Root for optimal weight tempering |
| `resmpl` | scalar <sup>p,†</sup> | Resampling indicator/count |
| `duration` | — | Wall-clock time (s) for the full `assimilate()` call |
<!-- markdownlint-restore -->

<sup>e</sup>: Ensemble methods only.
<sup>s</sup>: Only computed when √(Nx·N) ≤ `rc.comps.max_spectral`.
<sup>p</sup>: Particle filter (weighted ensemble) methods only.
<sup>†</sup>: Analysis-only (no `.f` or `.i` subscript).

## Similar projects

DAPPER is aimed at research and teaching (see discussion up top).
Example of limitations:

- It is not suited for very big models (>60k unknowns).
- Non-uniform time sequences.

The scope of DAPPER is restricted because

![framework_to_language](https://latex.codecogs.com/gif.latex?%5Clim_%7B%5Ctext%7Bflexibility%7D%20%5Crightarrow%20%5Cinfty%7D%20%5Ctext%7Bframework%7D%20%3D%20%5Ctext%7Bprog.%20language%7D)

Moreover, even straying beyond basic configurability appears [unrewarding](https://en.wikipedia.org/wiki/Flexibility%E2%80%93usability_tradeoff)
when already building on a high-level language such as Python.
Indeed, you may freely fork and modify the code of DAPPER,
which should be seen as a set of templates, and not a framework.

Also, DAPPER comes with no guarantees/support.
Therefore, if you have an *operational* or real-world application,
such as WRF, you should look into one of the alternatives,
sorted by approximate project size.

| Name               | Developers            | Purpose (approximately)           |
|--------------------|----------------------|-----------------------------------|
| [DART][1]          | NCAR                 | General                           |
| [PDAF][7]          | AWI                  | General                           |
| [JEDI][21]         | JCSDA (NOAA, NASA, ++)| General                          |
| [OpenDA][3]        | TU Delft             | General                           |
| [EMPIRE][4]        | Reading (Met)        | General                           |
| [ERT][2]           | Statoil              | History matching (Petroleum DA)   |
| [PIPT][14]         | CIPR                 | History matching (Petroleum DA)   |
| [MIKE][9]          | DHI                  | Oceanographic                     |
| [OAK][10]          | Liège                | Oceanographic                     |
| [Siroco][11]       | OMP                  | Oceanographic                     |
| [Verdandi][6]      | INRIA                | Biophysical DA                    |
| [PyOSSE][8]        | Edinburgh, Reading   | Earth-observation DA              |

Below is a list of projects with a purpose more similar to DAPPER's
(research *in* DA, and not so much *using* DA):

| Name                                 | Developers                | Notes                              |
|--------------------------------------|---------------------------|------------------------------------|
| [DAPPER][22]                         | Raanes, Chen, Grudzien    | Python                             |
| [SANGOMA][5]                         | Conglomerate*             | Fortran, Matlab                    |
| [hIPPYlib][25]                       | Villa, Petra, Ghattas     | Python, adjoint-based PDE methods  |
| [FilterPy][12]                       | R. Labbe                  | Python. Engineering oriented.      |
| [DASoftware][13]                     | Yue Li, Stanford          | Matlab. Large inverse probs.       |
| [Pomp][18]                           | U of Michigan             | R                                  |
| [EnKF-Matlab][15]                    | Sakov                     | Matlab                             |
| [EnKF-C][17]                         | Sakov                     | C. Light-weight, off-line DA       |
| [pyda][16]                           | Hickman                   | Python                             |
| [PyDA][19]                           | Shady-Ahmed               | Python                             |
| [DasPy][20]                          | Xujun Han                 | Python                             |
| [DataAssim.jl][23]                   | Alexander-Barth           | Julia                              |
| [DataAssimilationBenchmarks.jl][24]  | Grudzien                  | Julia, Python                      |
| [EnsembleKalmanProcesses.jl][26]     | Clim. Modl. Alliance      | Julia, EKI (optim)                 |
| Datum                                | Raanes                    | Matlab                             |
| IEnKS code                           | Bocquet                   | Python                             |

The `EnKF-Matlab` and `IEnKS` codes have been inspirational
in the development of DAPPER.

`*`: AWI/Liege/CNRS/NERSC/Reading/Delft

[1]:  https://www.image.ucar.edu/DAReS/DART/
[2]:  https://github.com/equinor/ert
[3]:  https://www.openda.org/
[4]:  https://www.met.reading.ac.uk/~darc/empire/index.php
[5]:  https://www.data-assimilation.net/
[6]:  http://verdandi.sourceforge.net/
[7]:  https://pdaf.awi.de/trac/wiki
[8]:  https://www.geos.ed.ac.uk/~lfeng/
[9]:  http://www.dhigroup.com/
[10]: https://github.com/gher-ulg/OAK
[11]: https://www5.obs-mip.fr/sirocco/assimilation-tools/sequoia-data-assimilation-platform/
[12]: https://github.com/rlabbe/filterpy
[13]: https://github.com/judithyueli/DASoftware
[14]: http://uni.no/en/uni-cipr/
[15]: http://enkf.nersc.no/
[16]: http://hickmank.github.io/pyda/
[17]: https://github.com/sakov/enkf-c
[18]: https://github.com/kingaa/pomp
[19]: https://github.com/Shady-Ahmed/PyDA
[20]: https://github.com/daspy/daspy
[21]: https://jointcenterforsatellitedataassimilation-jedi-docs.readthedocs-hosted.com/en/latest/
[22]: https://github.com/nansencenter/DAPPER
[23]: https://juliahub.com/docs/DataAssim/qCDwD/0.3.2/
[24]: https://github.com/cgrudz/DataAssimilationBenchmarks.jl
[25]: https://hippylib.github.io/
[26]: https://github.com/CliMA/EnsembleKalmanProcesses.jl


## Contributing

### Issues and Pull requests

Do not hesitate to open an issue, whether to report a problem or ask a question.
It may take some time for us to get back to you,
since DAPPER is primarily a volunteer effort.
Please start by perusing the [documentation](https://nansencenter.github.io/DAPPER/dapper.html)
and searching the issue tracker for similar items.

Pull requests are very welcome.
Examples: adding a new DA method, dynamical models,
experimental configuration reproducing literature results,
or improving the features and capabilities of DAPPER.
Please keep in mind the intentional [limitations](https://github.com/nansencenter/DAPPER#similar-projects)
and read the [developers guidelines](https://nansencenter.github.io/DAPPER/dev_guide).

### Contributors

Patrick N. Raanes,
Yumeng Chen,
Colin Grudzien,
Maxime Tondeur,
Remy Dubois

DAPPER is developed and maintained at
NORCE (Norwegian Research Institute)
and the Nansen Environmental and Remote Sensing Center (NERSC),
in collaboration with the University of Reading,
the UK National Centre for Earth Observation (NCEO),
and the Center for Western Weather and Water Extremes (CW3E).

<!-- markdownlint-capture -->
<!-- markdownlint-disable line-length -->
![NORCE](https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/norce-logo.png)
![NERSC](https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/nansen-logo.png)
<img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/UoR-logo.png?raw=true" alt="University of Reading logo" height="120" />
<img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/nceologo1000.png?raw=true" alt="NCEO logo" height="100">
<img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/CW3E-Logo-Horizontal-FullColor.png?raw=true" alt="CW3E logo" width="400">
<!-- markdownlint-restore -->

## Publications

- [Combining data assimilation and machine learning to emulate a dynamical model from sparse and noisy observations: A case study with the Lorenz 96 model](https://doi.org/10.1016/j.jocs.2020.101171)
- [Adaptive covariance inflation in the ensemble Kalman filter by Gaussian scale mixtures](https://doi.org/10.1002/qj.3386)
- [Revising the stochastic iterative ensemble smoother](https://doi.org/10.5194/npg-26-325-2019)
- [p-Kernel Stein Variational Gradient Descent for Data Assimilation and History Matching](https://doi.org/10.1007/s11004-021-09937-x)
- [Springer book chapter: Data Assimilation for Chaotic Dynamics](https://doi.org/10.1007/978-3-030-77722-7_1)


<!-- markdownlint-configure-file
{
  "no-multiple-blanks": false,
  "first-line-h1": false,
  "no-inline-html": {
    "allowed_elements": [ "img", "sup" ]
  },
  "code-block-style": false,
  "ul-indent": { "indent": 2 }
}
-->
