New features:
- TensorFlow: Seamless TensorFlow data pipeline integration, standard U-net architecture in `phi.tf.standard_networks`, CUDA resampling operator
- Improved support for point clouds and sampled fields (`SampledField`), RK4 advection
- Symbolic field math, `Noise` field to replace `math.randfreq()`
- Support for `STICKY` / `NO_SLIP` domain boundaries and moving/rotating obstacles
- Web interface: Quad view, improved color maps and more configuration settings, configurable axis order using `physics_config.x_first()`
Breaking changes:
- Change in `math.resample()` for `'constant'` boundaries. This affects only values sampled close to the boundary.
- Inflows now use antialiased geometry by default.
- (minor) Removed keyword arguments from `Field.at()` and `Field.sample_at()`.
- (minor) `Scene.copy_calling_script()` now has different keyword arguments.
- (minor) `GeometryMask` only holds one `Geometry` and behaves in line with `AnalyticField`.
- (minor) `math.resample()`: No longer accepts boundary `'zero'` as an alias for `'constant'`.
Deprecations:
- `load_state()`: Use `build_graph_input()` instead.
- `buoyancy()`: Use `density * -gravity * factor` in conjunction with `Field.at()` instead.
- `StaggeredGrid.from_scalar()`: Use `Field.at()` instead.
- `world.add_all()`: Use `world.add()` instead.
- `Dataset.add(), Dataset.remove()`: Mutable datasets are not supported.
- `Geometry.value_at()`: Use `Geometry.lies_inside()` instead.
- `union_mask()`: Use `mask(union())` instead.
This is the last official version with Python 2 and Python 3 support.