Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add open boundaries #442

Merged
merged 151 commits into from
Jun 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
2255b4a
implement `ExtrudeFace`
LasNikas Feb 5, 2024
48a753d
Merge branch 'main' into extrude-shape
LasNikas Feb 7, 2024
e299960
use `sample_face` in `interpolate_plane_3d`
LasNikas Feb 7, 2024
68b3546
add docs
LasNikas Feb 7, 2024
198eadd
add tests
LasNikas Feb 7, 2024
6c7cbde
Merge branch 'main' into extrude-shape
LasNikas Feb 7, 2024
4fe0358
fix bug
LasNikas Feb 7, 2024
c8e08f4
create `OpenBoundarySPHSystem`
LasNikas Feb 7, 2024
c915663
export OpenBoundarySPHSystem
LasNikas Feb 8, 2024
a509489
fix bug
LasNikas Feb 8, 2024
07dbc42
Merge branch 'extrude-shape' into rework-open-boundaries
LasNikas Feb 8, 2024
1d5d99c
add `tlsph=true`
LasNikas Feb 8, 2024
f82d0a7
Merge branch 'extrude-shape' into rework-open-boundaries
LasNikas Feb 8, 2024
2b472c9
fix tuple bug
LasNikas Feb 8, 2024
19fdc26
Merge branch 'extrude-shape' into rework-open-boundaries
LasNikas Feb 8, 2024
8d3c622
fix typo
LasNikas Feb 8, 2024
b83fd26
Merge branch 'extrude-shape' into rework-open-boundaries
LasNikas Feb 8, 2024
a5e2f1c
fix again
LasNikas Feb 8, 2024
3177542
Merge branch 'extrude-shape' into rework-open-boundaries
LasNikas Feb 8, 2024
2aa9696
fix for tests
LasNikas Feb 8, 2024
bde240d
fix layers
LasNikas Feb 8, 2024
bef4605
Merge branch 'extrude-shape' into rework-open-boundaries
LasNikas Feb 8, 2024
b3a979b
calculate particle spacing differently
LasNikas Feb 9, 2024
284c474
Merge branch 'extrude-shape' into rework-open-boundaries
LasNikas Feb 9, 2024
3521b0d
Merge branch 'main' into extrude-shape
LasNikas Feb 9, 2024
e6abe8f
Merge branch 'main' into rework-open-boundaries
LasNikas Feb 9, 2024
4c6bcf9
add show-tests
LasNikas Feb 9, 2024
33f4fc9
add `within_boundary_zone`
LasNikas Feb 9, 2024
f4cd243
change `floor` to `ceil`
LasNikas Feb 9, 2024
7e01ecc
Merge branch 'main' into extrude-shape
LasNikas Feb 12, 2024
a6b16d8
Merge branch 'main' into rework-open-boundaries
LasNikas Feb 12, 2024
b74772d
Merge branch 'extrude-shape' into rework-open-boundaries
LasNikas Feb 12, 2024
6c6a464
boundary zone tests
LasNikas Feb 12, 2024
99645bb
add `evaluate_characteristics`
LasNikas Feb 13, 2024
2284733
add tests
LasNikas Feb 13, 2024
59bdaef
add reference functions
LasNikas Feb 13, 2024
e270102
add `update_quantities!`
LasNikas Feb 13, 2024
129c786
add buffer
LasNikas Feb 13, 2024
03dce7e
add `SystemBuffer` tests
LasNikas Feb 13, 2024
bd5fe1d
cosmetic change in tests
LasNikas Feb 13, 2024
199678b
change `round` to `isapprox`
LasNikas Feb 13, 2024
19523e8
Merge branch 'extrude-shape' into rework-open-boundaries
LasNikas Feb 13, 2024
4d3ea48
add update callback
LasNikas Feb 15, 2024
a5f3149
add `UpdateCallback`
LasNikas Feb 15, 2024
68fadad
add `update_open_boundaries`
LasNikas Feb 15, 2024
5be7af8
fix bugs
LasNikas Feb 15, 2024
b1fac9d
add timers
LasNikas Feb 15, 2024
8ed0966
write prescribed quantities
LasNikas Feb 16, 2024
dbd45a8
Merge branch 'main' into rework-open-boundaries
LasNikas Feb 16, 2024
faad377
improve dispatching
LasNikas Feb 16, 2024
c656604
add example `pipe_flow_2d.jl`
LasNikas Feb 16, 2024
b19577f
add docs `UpdateCallback`
LasNikas Feb 16, 2024
bdac960
Merge branch 'main' into rework-open-boundaries
LasNikas Feb 22, 2024
38902d9
add `UpdateCallback`
LasNikas Feb 22, 2024
cc3477c
fix typo
LasNikas Feb 22, 2024
47950d2
Merge branch 'main' into rework-open-boundaries
LasNikas Mar 5, 2024
77b120b
Merge branch 'main' into update-callback
LasNikas Mar 5, 2024
983080a
Merge branch 'main' into update-callback
LasNikas Mar 5, 2024
c6c0b11
apply formatter
LasNikas Mar 5, 2024
0fce642
Merge branch 'main' into rework-open-boundaries
LasNikas Mar 7, 2024
862a817
modify system buffer
LasNikas Mar 7, 2024
d55eb27
add docstring
LasNikas Mar 7, 2024
d6d80ff
add docs
LasNikas Mar 7, 2024
5eeecd5
fix tests
LasNikas Mar 7, 2024
cba3cff
fix typos
LasNikas Mar 7, 2024
9f52875
apply formatter
LasNikas Mar 7, 2024
96b15c6
fix tests
LasNikas Mar 7, 2024
84d5828
add comment
LasNikas Mar 7, 2024
ed9c86c
fix tests
LasNikas Mar 8, 2024
e3d72a9
Merge branch 'main' into update-callback
LasNikas Mar 16, 2024
f1a7758
Merge branch 'main' into update-callback
LasNikas Apr 2, 2024
b8e877e
Merge branch 'main' into rework-open-boundaries
LasNikas Apr 2, 2024
b73b5a4
Merge branch 'main' into update-callback
LasNikas Apr 5, 2024
d5bb8f9
Merge branch 'main' into rework-open-boundaries
LasNikas Apr 5, 2024
66f863b
Merge branch 'main' into update-callback
LasNikas Apr 19, 2024
08b47f2
remove update bool
LasNikas Apr 19, 2024
8769c85
Merge branch 'main' into rework-open-boundaries
LasNikas Apr 19, 2024
defe2e0
Merge branch 'update-callback' into rework-open-boundaries
LasNikas Apr 19, 2024
c240b47
adapt docstring
LasNikas Apr 19, 2024
824895a
Merge branch 'main' into update-callback
LasNikas Apr 26, 2024
896bcf4
implement suggestions
LasNikas Apr 26, 2024
75594d4
Merge branch 'main' into rework-open-boundaries
LasNikas Apr 26, 2024
00212fe
Merge branch 'update-callback' into rework-open-boundaries
LasNikas Apr 26, 2024
0346b00
Merge branch 'main' into rework-open-boundaries
LasNikas May 6, 2024
d15ba7a
fix test
LasNikas May 6, 2024
58baa9c
Merge branch 'main' into rework-open-boundaries
LasNikas May 14, 2024
fac85ad
add check if callback is used
LasNikas May 14, 2024
92d2fe9
add comments in example file
LasNikas May 14, 2024
3adbb7b
generic types
LasNikas May 14, 2024
81e0875
merge main
LasNikas May 21, 2024
27e71ab
undo combining compact support with DEM
LasNikas May 21, 2024
0203a3a
remove density and pressure setter
LasNikas May 21, 2024
d8a06e7
implement suggestions
LasNikas May 21, 2024
118ac97
fix tests
LasNikas May 21, 2024
8de1cc3
Merge branch 'main' into rework-open-boundaries
LasNikas May 21, 2024
b8831a4
Merge branch 'main' into rework-open-boundaries
LasNikas May 24, 2024
c77a71a
Revert "remove density and pressure setter"
LasNikas May 24, 2024
5a5b007
implement suggestions
LasNikas May 24, 2024
61b5ebb
Merge branch 'main' into rework-open-boundaries
LasNikas May 25, 2024
b12bc5e
rework in- and outflow
LasNikas May 25, 2024
147a18d
rename setter functions
LasNikas May 27, 2024
75615f2
rename function
LasNikas May 27, 2024
a3adf1d
adapt tests
LasNikas May 27, 2024
9401be9
add docs
LasNikas May 27, 2024
d55d084
Merge branch 'rework-inflow-outflow' into rework-open-boundaries
LasNikas May 27, 2024
1533a91
rename function
LasNikas May 27, 2024
a9e91ce
apply formatter
LasNikas May 27, 2024
38f5034
fix tests
LasNikas May 27, 2024
e293001
fix bug in plot recipes
LasNikas May 27, 2024
e2dcc01
apply formatter
LasNikas May 27, 2024
d191840
Merge branch 'main' into rework-open-boundaries
LasNikas May 29, 2024
b948fd5
Merge branch 'main' into rework-open-boundaries
LasNikas Jun 3, 2024
9de2c48
implement suggestions for `boundary_zone.jl`
LasNikas Jun 3, 2024
38c05ef
rename kwarg
LasNikas Jun 3, 2024
032e7da
implement suggestions
LasNikas Jun 4, 2024
e341098
implement suggestions
LasNikas Jun 5, 2024
4aa2a89
modify `check_domain!`
LasNikas Jun 5, 2024
d23f53e
add comments and check for fluid system with buffer
LasNikas Jun 6, 2024
6f3ed3e
modify error message
LasNikas Jun 6, 2024
39fe9f0
fix tests
LasNikas Jun 6, 2024
e1ed3fc
fix `callback_used`
LasNikas Jun 6, 2024
a17161a
using Measurements
LasNikas Jun 6, 2024
fb162a5
fix tests
LasNikas Jun 6, 2024
2dbc8bb
sqrt(eps())
LasNikas Jun 6, 2024
0495ab9
fix tests again
LasNikas Jun 6, 2024
079d5e1
add doc to `boundary.md`
LasNikas Jun 6, 2024
421743d
link single fluid system
LasNikas Jun 6, 2024
1b970e5
fix tests
LasNikas Jun 6, 2024
db97c6c
implement suggestions
LasNikas Jun 7, 2024
c12d8de
fix tests
LasNikas Jun 7, 2024
5647c20
change the order of functions
LasNikas Jun 7, 2024
b2f7ace
modify example
LasNikas Jun 7, 2024
2f32f91
fix tests
LasNikas Jun 7, 2024
6799dc7
fix test again
LasNikas Jun 7, 2024
172da98
implement doc suggestions
LasNikas Jun 7, 2024
19c3089
modify dos
LasNikas Jun 7, 2024
f340064
fix typos
LasNikas Jun 7, 2024
992cda3
implement suggestions
LasNikas Jun 17, 2024
cfcd470
Merge branch 'main' into rework-open-boundaries
LasNikas Jun 17, 2024
ed69a40
implement suggestions
LasNikas Jun 18, 2024
ad46679
Merge branch 'main' into rework-open-boundaries
LasNikas Jun 18, 2024
01819b4
add EDAC to the example
LasNikas Jun 18, 2024
417a5b3
implement suggestions
LasNikas Jun 19, 2024
9a0c81e
Merge branch 'main' into rework-open-boundaries
LasNikas Jun 19, 2024
b0f076e
modify tests
LasNikas Jun 19, 2024
7a45ddf
adapt docs
LasNikas Jun 19, 2024
aafb4b8
Merge branch 'main' into rework-open-boundaries
LasNikas Jun 19, 2024
57e2639
add `initial_callback_flag`
LasNikas Jun 19, 2024
9c80e3f
add to `NEWS.md` and `README.md`
LasNikas Jun 19, 2024
4fed7ad
implement suggestions
LasNikas Jun 19, 2024
b0d6563
fix typo
LasNikas Jun 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Changelog

TrixiParticles.jl follows the interpretation of [semantic versioning (semver)](https://julialang.github.io/Pkg.jl/dev/compatibility/#Version-specifier-format-1)
used in the Julia ecosystem. Notable changes will be documented in this file for human readability.
We aim at 3 to 4 month between major release versions and about 2 weeks between minor versions.
used in the Julia ecosystem. Notable changes will be documented in this file for human readability.
We aim at 3 to 4 month between major release versions and about 2 weeks between minor versions.

## Version 0.2.x

Expand All @@ -14,11 +14,15 @@ We aim at 3 to 4 month between major release versions and about 2 weeks between

### Deprecated

## Version 0.1.3

### Added
Open boundaries using the method of characteristics based on the work of Lastiwka et al., "Permeable and non-reflecting boundary conditions in SPH" (2009) were added for WCSPH and EDAC.

## Version 0.1.2

### Added
A surface tension and adhesion model based on the work by Akinci et al., "Versatile Surface Tension and Adhesion for SPH Fluids" (2013) was added to WCSPH
A surface tension and adhesion model based on the work by Akinci et al., "Versatile Surface Tension and Adhesion for SPH Fluids" (2013) was added to WCSPH.

## Version 0.1.1

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Its features include:
## Features
- Incompressible Navier-Stokes
- Methods: Weakly Compressible Smoothed Particle Hydrodynamics (WCSPH), Entropically Damped Artificial Compressibility (EDAC)
- Models: Surface Tension
- Models: Surface Tension, Open Boundaries
- Solid-body mechanics
- Methods: Total Lagrangian SPH (TLSPH), Discrete Element Method (DEM)
- Fluid-Structure Interaction
Expand Down
83 changes: 83 additions & 0 deletions docs/src/systems/boundary.md
Original file line number Diff line number Diff line change
Expand Up @@ -234,3 +234,86 @@ Pages = [joinpath("schemes", "boundary", "monaghan_kajtar", "monaghan_kajtar.jl"
- Alireza Valizadeh, Joseph J. Monaghan. "A study of solid wall models for weakly compressible SPH."
In: Journal of Computational Physics 300 (2015), pages 5–19.
[doi: 10.1016/J.JCP.2015.07.033](https://doi.org/10.1016/J.JCP.2015.07.033)

# [Open Boundaries](@id open_boundary)

```@autodocs
Modules = [TrixiParticles]
Pages = [joinpath("schemes", "boundary", "open_boundary", "system.jl")]
```

```@autodocs
Modules = [TrixiParticles]
Pages = [joinpath("schemes", "boundary", "open_boundary", "boundary_zones.jl")]
```

### [Method of characteristics](@id method_of_characteristics)

The difficulty in non-reflecting boundary conditions, also called open boundaries, is to determine
the appropriate boundary values of the exact characteristics of the Euler equations.
Assuming the flow near the boundaries is normal to the boundary
and free of shock waves and significant viscous effects, it can be shown that three characteristic variables exist:

- ``J_1``, associated with convection of entropy and propagates at flow velocity,
- ``J_2``, downstream-running characteristics,
- ``J_3``, upstream-running characteristics.

Giles (1990) derived those variables based on a linearized set of governing equations:
```math
J_1 = -c_s^2 (\rho - \rho_{\text{ref}}) + (p - p_{\text{ref}})
```
```math
J_2 = \rho c_s (v - v_{\text{ref}}) + (p - p_{\text{ref}})
```
```math
J_3 = - \rho c_s (v - v_{\text{ref}}) + (p - p_{\text{ref}})
```
where the subscript "ref" denotes the reference flow near the boundaries, which can be prescribed.

Specifying the reference variables is **not** equivalent to prescription of ``\rho``, ``v`` and ``p``
directly, since the perturbation from the reference flow is allowed.

Lastiwka et al. (2009) applied the method of characteristic to SPH and determined the number of variables that should be
**prescribed** at the boundary and the number which should be **propagated** from the fluid domain to the boundary:

- For an **inflow** boundary:
- Prescribe *downstream*-running characteristics ``J_1`` and ``J_2``
- Transmit ``J_3`` from the fluid domain (allow ``J_3`` to propagate upstream to the boundary).

- For an **outflow** boundary:
- Prescribe *upstream*-running characteristic ``J_3``
- Transmit ``J_1`` and ``J_2`` from the fluid domain.

Prescribing is done by simply setting the characteristics to zero. To transmit the characteristics from the fluid
domain, or in other words, to carry the information of the fluid to the boundaries, Negi et al. (2020) use a Shepard Interpolation
```math
f_i = \frac{\sum_j^N f_j W_{ij}}{\sum_j^N W_{ij}},
```
where the ``i``-th particle is a boundary particle, ``f`` is either ``J_1``, ``J_2`` or ``J_3`` and ``N`` is the set of
LasNikas marked this conversation as resolved.
Show resolved Hide resolved
neighboring fluid particles.

To express pressure ``p``, density ``\rho`` and velocity ``v`` as functions of the characteristic variables, the system of equations
from the characteristic variables is inverted and gives
```math
\rho - \rho_{\text{ref}} = \frac{1}{c_s^2} \left( -J_1 + \frac{1}{2} J_2 + \frac{1}{2} J_3 \right),
```
```math
u - u_{\text{ref}}= \frac{1}{2\rho c_s} \left( J_2 - J_3 \right),
```
```math
p - p_{\text{ref}} = \frac{1}{2} \left( J_2 + J_3 \right).
```
With ``J_1``, ``J_2`` and ``J_3`` determined, we can easily solve for the actual variables for each particle.

### References
- M. B. Giles. "Nonreflecting boundary conditions for Euler equation calculations".
In: AIAA Journal, 28.12 pages 2050--2058.
[doi: 10.2514/3.10521](https://doi.org/10.2514/3.10521)
- M. Lastiwka, M. Basa, N. J. Quinlan.
"Permeable and non-reflecting boundary conditions in SPH".
In: International Journal for Numerical Methods in Fluids 61, (2009), pages 709--724.
[doi: 10.1002/fld.1971](https://doi.org/10.1002/fld.1971)
- P. Negi, P. Ramachandran, A. Haftu.
"An improved non-reflecting outlet boundary condition for weakly-compressible SPH".
In: Computer Methods in Applied Mechanics and Engineering 367, (2020), pages 113--119.
[doi: 10.1016/j.cma.2020.113119](https://doi.org/10.1016/j.cma.2020.113119)
131 changes: 131 additions & 0 deletions examples/fluid/pipe_flow_2d.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
# 2D channel flow simulation with open boundaries.

using TrixiParticles
using OrdinaryDiffEq

# ==========================================================================================
# ==== Resolution
particle_spacing = 0.05

# Make sure that the kernel support of fluid particles at a boundary is always fully sampled
boundary_layers = 3

# Make sure that the kernel support of fluid particles at an open boundary is always
# fully sampled.
LasNikas marked this conversation as resolved.
Show resolved Hide resolved
# Note: Due to the dynamics at the inlets and outlets of open boundaries,
# it is recommended to use `open_boundary_layers > boundary_layers`
open_boundary_layers = 6
LasNikas marked this conversation as resolved.
Show resolved Hide resolved

# ==========================================================================================
# ==== Experiment Setup
tspan = (0.0, 2.0)

# Boundary geometry and initial fluid particle positions
domain_size = (1.0, 0.4)

flow_direction = [1.0, 0.0]
reynolds_number = 100
const prescribed_velocity = 2.0

boundary_size = (domain_size[1] + 2 * particle_spacing * open_boundary_layers,
domain_size[2])

fluid_density = 1000.0

# For this particular example, it is necessary to have a background pressure.
# Otherwise the suction at the outflow is to big and the simulation becomes unstable.
pressure = 1000.0
LasNikas marked this conversation as resolved.
Show resolved Hide resolved

sound_speed = 10 * prescribed_velocity

state_equation = StateEquationCole(; sound_speed, reference_density=fluid_density,
exponent=7, background_pressure=pressure)

pipe = RectangularTank(particle_spacing, domain_size, boundary_size, fluid_density,
pressure=pressure, n_layers=boundary_layers,
faces=(false, false, true, true))

# Shift pipe walls in negative x-direction for the inflow
pipe.boundary.coordinates[1, :] .-= particle_spacing * open_boundary_layers

n_buffer_particles = 4 * pipe.n_particles_per_dimension[2]

# ==========================================================================================
# ==== Fluid
smoothing_length = 3.0 * particle_spacing
smoothing_kernel = WendlandC2Kernel{2}()

fluid_density_calculator = ContinuityDensity()

kinematic_viscosity = prescribed_velocity * domain_size[2] / reynolds_number

viscosity = ViscosityAdami(nu=kinematic_viscosity)

fluid_system = EntropicallyDampedSPHSystem(pipe.fluid, smoothing_kernel, smoothing_length,
sound_speed, viscosity=viscosity,
density_calculator=fluid_density_calculator,
buffer_size=n_buffer_particles)

# Alternatively the WCSPH scheme can be used
# alpha = 8 * kinematic_viscosity / (smoothing_length * sound_speed)
# viscosity = ArtificialViscosityMonaghan(; alpha, beta=0.0)

# fluid_system = WeaklyCompressibleSPHSystem(pipe.fluid, fluid_density_calculator,
# state_equation, smoothing_kernel,
# smoothing_length, viscosity=viscosity,
# buffer_size=n_buffer_particles)

# ==========================================================================================
# ==== Open Boundary
function velocity_function(pos, t)
# Use this for a time-dependent inflow velocity
# return SVector(0.5prescribed_velocity * sin(2pi * t) + prescribed_velocity, 0)

return SVector(prescribed_velocity, 0.0)
end

inflow = InFlow(; plane=([0.0, 0.0], [0.0, domain_size[2]]), flow_direction,
open_boundary_layers, density=fluid_density, particle_spacing)

open_boundary_in = OpenBoundarySPHSystem(inflow; sound_speed, fluid_system,
buffer_size=n_buffer_particles,
reference_pressure=pressure,
reference_velocity=velocity_function)

outflow = OutFlow(; plane=([domain_size[1], 0.0], [domain_size[1], domain_size[2]]),
flow_direction, open_boundary_layers, density=fluid_density,
particle_spacing)

open_boundary_out = OpenBoundarySPHSystem(outflow; sound_speed, fluid_system,
buffer_size=n_buffer_particles,
reference_pressure=pressure,
reference_velocity=velocity_function)

# ==========================================================================================
# ==== Boundary

boundary_model = BoundaryModelDummyParticles(pipe.boundary.density, pipe.boundary.mass,
AdamiPressureExtrapolation(),
state_equation=state_equation,
#viscosity=ViscosityAdami(nu=1e-4),
smoothing_kernel, smoothing_length)

boundary_system = BoundarySPHSystem(pipe.boundary, boundary_model)

# ==========================================================================================
# ==== Simulation
semi = Semidiscretization(fluid_system, open_boundary_in, open_boundary_out,
boundary_system)

ode = semidiscretize(semi, tspan)

info_callback = InfoCallback(interval=100)
saving_callback = SolutionSavingCallback(dt=0.02, prefix="")

callbacks = CallbackSet(info_callback, saving_callback, UpdateCallback())

sol = solve(ode, RDPK3SpFSAL35(),
abstol=1e-5, # Default abstol is 1e-6 (may need to be tuned to prevent boundary penetration)
reltol=1e-3, # Default reltol is 1e-3 (may need to be tuned to prevent boundary penetration)
dtmax=1e-2, # Limit stepsize to prevent crashing
save_everystep=false, callback=callbacks);
3 changes: 2 additions & 1 deletion examples/n_body/n_body_system.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ struct NBodySystem{NDIMS, ELTYPE <: Real} <: TrixiParticles.System{NDIMS, Nothin
initial_condition :: InitialCondition{ELTYPE}
mass :: Array{ELTYPE, 1} # [particle]
LasNikas marked this conversation as resolved.
Show resolved Hide resolved
G :: ELTYPE
buffer :: Nothing

function NBodySystem(initial_condition, G)
mass = copy(initial_condition.mass)

new{size(initial_condition.coordinates, 1),
eltype(mass)}(initial_condition, mass, G)
eltype(mass)}(initial_condition, mass, G, nothing)
end
end

Expand Down
3 changes: 2 additions & 1 deletion src/TrixiParticles.jl
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ include("visualization/recipes_plots.jl")
export Semidiscretization, semidiscretize, restart_with!
export InitialCondition
export WeaklyCompressibleSPHSystem, EntropicallyDampedSPHSystem, TotalLagrangianSPHSystem,
BoundarySPHSystem, DEMSystem, BoundaryDEMSystem
BoundarySPHSystem, DEMSystem, BoundaryDEMSystem, OpenBoundarySPHSystem, InFlow,
OutFlow
export InfoCallback, SolutionSavingCallback, DensityReinitializationCallback,
PostprocessCallback, StepsizeCallback, UpdateCallback
export ContinuityDensity, SummationDensity
Expand Down
2 changes: 1 addition & 1 deletion src/callbacks/density_reinit.jl
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ function initialize_reinit_cb!(cb::DensityReinitializationCallback, u, t, integr
# Update systems to compute quantities like density and pressure.
semi = integrator.p
v_ode, u_ode = u.x
update_systems_and_nhs(v_ode, u_ode, semi, t)
update_systems_and_nhs(v_ode, u_ode, semi, t; update_from_callback=true)

# Apply the callback.
cb(integrator)
Expand Down
2 changes: 1 addition & 1 deletion src/callbacks/post_process.jl
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ function (pp::PostprocessCallback)(integrator)
new_data = false

# Update systems to compute quantities like density and pressure
update_systems_and_nhs(v_ode, u_ode, semi, t)
update_systems_and_nhs(v_ode, u_ode, semi, t; update_from_callback=true)

foreach_system(semi) do system
if system isa BoundarySystem && pp.exclude_boundary
Expand Down
2 changes: 1 addition & 1 deletion src/callbacks/solution_saving.jl
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ function initialize_save_cb!(solution_callback::SolutionSavingCallback, u, t, in
# Update systems to compute quantities like density and pressure
semi = integrator.p
v_ode, u_ode = u.x
update_systems_and_nhs(v_ode, u_ode, semi, t)
update_systems_and_nhs(v_ode, u_ode, semi, t; update_from_callback=true)

# Apply the callback
solution_callback(integrator)
Expand Down
25 changes: 16 additions & 9 deletions src/callbacks/update.jl
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,16 @@ function initial_update!(cb, u, t, integrator)
initial_update!(cb.affect!, u, t, integrator)
end

initial_update!(cb::UpdateCallback, u, t, integrator) = cb(integrator)
function initial_update!(cb::UpdateCallback, u, t, integrator)
semi = integrator.p

# Tell systems that `UpdateCallback` is used
foreach_system(semi) do system
update_callback_used!(system)
end

return cb(integrator)
end

# `condition`
function (update_callback!::UpdateCallback)(u, t, integrator)
Expand All @@ -69,16 +78,12 @@ function (update_callback!::UpdateCallback)(integrator)

# Update quantities that are stored in the systems. These quantities (e.g. pressure)
# still have the values from the last stage of the previous step if not updated here.
update_systems_and_nhs(v_ode, u_ode, semi, t)
update_systems_and_nhs(v_ode, u_ode, semi, t; update_from_callback=true)

# Other updates might be added here later (e.g. Transport Velocity Formulation).
# @trixi_timeit timer() "update open boundary" foreach_system(semi) do system
# update_open_boundary_eachstep!(system, v_ode, u_ode, semi, t)
# end
#
# @trixi_timeit timer() "update TVF" foreach_system(semi) do system
# update_transport_velocity_eachstep!(system, v_ode, u_ode, semi, t)
# end
@trixi_timeit timer() "update open boundary" foreach_system(semi) do system
update_open_boundary_eachstep!(system, v_ode, u_ode, semi, t)
end

# Tell OrdinaryDiffEq that `u` has been modified
u_modified!(integrator, true)
Expand Down Expand Up @@ -128,3 +133,5 @@ function Base.show(io::IO, ::MIME"text/plain",
summary_box(io, "UpdateCallback", setup)
end
end

update_callback_used!(system) = system
Loading