Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
192 commits
Select commit Hold shift + click to select a range
4044dc6
start implementing
Sep 9, 2025
f783467
first working prototype
Sep 10, 2025
5f81c2f
impose rest density and pressure
Sep 10, 2025
b499d2b
add shifting
Sep 10, 2025
807f853
rename function
Sep 11, 2025
a7aa3de
move interaction to rhs.jl
Sep 11, 2025
e9dd9d8
modify momentum equation and fix density
Sep 12, 2025
374992c
boundary pressure and rest pressure
Sep 12, 2025
16252ef
remove modify momentum equation
Sep 12, 2025
1c9842b
add poiseuille flow
Sep 12, 2025
a371eef
make edac consistent with wcsph
Sep 12, 2025
e1399e5
fix tests
Sep 12, 2025
991b6e6
formatting
Sep 12, 2025
2095b3a
Merge branch 'dev' into consistent-rhs
Sep 12, 2025
15c9c90
Merge branch 'dev' into dynamical-pressure-boundaries
Sep 12, 2025
08fb961
Merge branch 'dev' into consistent-rhs
Sep 15, 2025
237d781
fix tests
Sep 15, 2025
4ea373f
Merge branch 'dev' into dynamical-pressure-boundaries
Sep 15, 2025
5145746
move example file
Sep 15, 2025
767b5fb
fix merge bugs
Sep 15, 2025
b370b8a
Merge branch 'dev' into dynamical-pressure-boundaries
Sep 15, 2025
032b95d
Merge branch 'dev' into consistent-rhs
Sep 15, 2025
3bc93d6
Merge branch 'dev' into dynamical-pressure-boundaries
Sep 16, 2025
9c60947
fix
Sep 16, 2025
594cedf
Merge branch 'consistent-rhs' into dynamical-pressure-boundaries
Sep 16, 2025
177c2f2
todo ddt
Sep 16, 2025
e2a08d4
fix `atol` in dam break validation
Sep 16, 2025
5b8e1b2
Merge branch 'dev' into consistent-rhs
Sep 16, 2025
683f33e
Merge branch 'dev' into dynamical-pressure-boundaries
Sep 16, 2025
ba71f7b
clean source acceleration
Sep 16, 2025
6c62c2f
add DDT
Sep 16, 2025
e3d64ed
implement suggestions
Sep 16, 2025
4b18b4c
Merge branch 'dev' into shifting-buffer-particles
Sep 16, 2025
7aac5a1
Merge branch 'consistent-rhs' into dynamical-pressure-boundaries
Sep 16, 2025
a13c330
Merge branch 'shifting-buffer-particles' into dynamical-pressure-boun…
Sep 16, 2025
c127645
Merge branch 'dev' into dynamical-pressure-boundaries
Sep 16, 2025
f649ff6
revise example file
Sep 17, 2025
5bd94e2
add density diffusion to cache
Sep 17, 2025
55fdae3
fix tests
Sep 17, 2025
70377b4
add example tests
Sep 17, 2025
1b7bebf
quick fixes
Sep 17, 2025
d77e4ff
add validation test
Sep 17, 2025
796a9ab
rm compact support
Sep 17, 2025
a6a9817
fix stupid bug
Sep 17, 2025
c5083d3
fix validation test
Sep 17, 2025
3ac6b66
fix typo
Sep 17, 2025
c133ad2
add validation scripts
Sep 17, 2025
ffd7ceb
fix duplicated variable
Sep 17, 2025
17fabc3
add gpu tests
Sep 17, 2025
c2b54bb
fix gpu
Sep 18, 2025
bee3f6b
fix minimum distance kernel
Sep 18, 2025
c8d33fe
adapt threshold kernel gradient
Sep 18, 2025
48ded74
add link
Sep 18, 2025
bdea1e2
apply formatter
Sep 18, 2025
d555420
fix tests
Sep 18, 2025
72cd1f5
add check in ddt
Sep 18, 2025
ef139ec
consistent comments
Sep 18, 2025
0ea7a42
fix
Sep 18, 2025
17cccb2
make volume check consistent
Sep 18, 2025
f29111b
fix again
Sep 18, 2025
33f0028
rm saving callback
Sep 18, 2025
8001ef5
fix tests
Sep 18, 2025
4df839c
add docs
Sep 18, 2025
5739f81
add conservation tests
Sep 18, 2025
2058c36
fix formatting
Sep 18, 2025
9dbb6ce
Merge branch 'adapt-threshold' into dynamical-pressure-boundaries
Sep 18, 2025
6513713
Merge branch 'gpu-hotfix' into dynamical-pressure-boundaries
Sep 18, 2025
c70c930
Merge branch 'dev' into dynamical-pressure-boundaries
Sep 19, 2025
d6646af
Merge branch 'main' into dynamical-pressure-boundaries
Sep 19, 2025
20f655c
Merge branch 'main' into adapt-threshold
Sep 19, 2025
24d2da2
implement suggestions
Sep 19, 2025
3f046ee
Merge branch 'main' into adapt-threshold
Sep 21, 2025
f252c77
fix gpu tests
Sep 21, 2025
a59bee7
fix sqrt
Sep 21, 2025
aa4b948
fix sqrt bugs
Sep 21, 2025
24297a9
Merge branch 'adapt-threshold' into dynamical-pressure-boundaries
Sep 21, 2025
b927d74
fix numerical precision
Sep 22, 2025
7157724
remove TODOs
Sep 22, 2025
9bd853f
revise validation
Sep 22, 2025
cd46eb4
add comment in example
Sep 22, 2025
c1e87f7
implement suggestions
Sep 22, 2025
9a10c84
fix tests
Sep 22, 2025
c521898
Merge branch 'main' into adapt-threshold
LasNikas Sep 22, 2025
56fffb0
remove test steady state interval
Sep 22, 2025
2dab56e
add results
Sep 22, 2025
0b46fab
Merge branch 'main' into dynamical-pressure-boundaries
Sep 22, 2025
2a5d0e7
Merge branch 'adapt-threshold' into dynamical-pressure-boundaries
Sep 22, 2025
0ba74ea
label plot axis
Sep 22, 2025
c9521a8
Merge branch 'main' into adapt-threshold
LasNikas Sep 22, 2025
12b93df
Merge branch 'main' into dynamical-pressure-boundaries
Sep 22, 2025
354d768
implement suggestions
Sep 22, 2025
062da92
rm validation
Sep 22, 2025
a78ecca
move example test
Sep 22, 2025
d9dbe6d
Merge branch 'adapt-threshold' into dynamical-pressure-boundaries
Sep 22, 2025
de34170
Merge branch 'remove-steady-state-interval' into dynamical-pressure-b…
Sep 22, 2025
5f85f44
Merge branch 'main' into dynamical-pressure-boundaries
Sep 22, 2025
0e5b1af
Merge branch 'main' into dynamical-pressure-boundaries
Sep 23, 2025
2cff31f
add comments in example file
Sep 23, 2025
9e0fd90
add scripts
Sep 23, 2025
6759fb4
add 3D examples
Sep 23, 2025
0bc0390
update validation script
Sep 23, 2025
a4ece96
adapt example file
Sep 23, 2025
dc2f619
Merge branch 'dynamical-pressure-boundaries' into dynamical-pressure-…
Sep 23, 2025
c4c8a7e
POC interpolate wall velocity
Sep 23, 2025
4fcfb4b
revise 2D validation
Sep 23, 2025
9ecc767
add results
Sep 23, 2025
d270dc1
revise scripts
Sep 23, 2025
3aca385
fix
Sep 23, 2025
1c7e35a
Merge branch 'dynamical-pressure-boundaries' into dynamical-pressure-…
Sep 23, 2025
1ad4861
revise pulsatile channel flow example
Sep 23, 2025
471a71b
add results 3D
Sep 23, 2025
32c74ea
fix gpu
Sep 23, 2025
ff1aba8
Merge branch 'dynamical-pressure-boundaries' into dynamical-pressure-…
Sep 23, 2025
ae07a20
revise scripts
Sep 23, 2025
f514201
add pulsatile flow validation
Sep 24, 2025
2edd71f
increase resolution
Sep 24, 2025
8704b73
add results
Sep 24, 2025
8a56a46
revise plot pulsatile flow
Sep 24, 2025
38b7dbf
gpu hagen poiseuille
Sep 24, 2025
d3d26b4
update dp30
Sep 24, 2025
8a32dca
finish plot script
Sep 24, 2025
cf88d61
change particle spacing
Sep 24, 2025
efeafff
Merge branch 'main' into dynamical-pressure-boundaries
Sep 24, 2025
a986913
Merge branch 'dynamical-pressure-boundaries' into dynamical-pressure-…
Sep 24, 2025
c995e71
apply formatter
Sep 24, 2025
ca35d05
fix
Sep 25, 2025
e86638f
Merge branch 'more-robust-particle-conversion' into dynamical-pressur…
Sep 25, 2025
eccd21b
Merge branch 'more-robust-particle-conversion' into dynamical-pressur…
Sep 25, 2025
71ea09b
todo: validate VIPO
Sep 25, 2025
865a755
initial prototype - not tested yet
Sep 25, 2025
e9992fe
add check
Sep 25, 2025
5c982b2
make full velocity optional
Sep 26, 2025
876635b
make full velocity optional
Sep 26, 2025
13ede4a
fix wrong face normal
Sep 26, 2025
b018989
implement suggestions
Sep 26, 2025
6b80c8b
Merge branch 'dynamical-pressure-boundaries' into dynamical-pressure-…
Sep 26, 2025
6f4a8d4
fix face normal
Sep 26, 2025
ccc7b5e
revert impose full velocity
Sep 27, 2025
f42ba61
Merge branch 'dynamical-pressure-validation' into add-rcr-windkessel-…
Sep 27, 2025
b0b31d9
FSI for dynamical pressure bc
Sep 27, 2025
c5b553c
add example file
Sep 27, 2025
8def112
1st try to make it GPU compatible
Sep 28, 2025
57259bd
Merge branch 'main' into dynamical-pressure-boundaries
Sep 30, 2025
c1072f4
Merge branch 'main' into more-robust-particle-conversion
Sep 30, 2025
83879b6
fix again
Sep 30, 2025
c608b8e
avoid signbit
Sep 30, 2025
0740a38
fix unit test
Sep 30, 2025
6268cc6
Update src/preprocessing/geometries/geometries.jl
LasNikas Sep 30, 2025
068222e
Merge branch 'more-robust-particle-conversion' into dynamical-pressur…
Sep 30, 2025
714fe68
Merge branch 'more-robust-particle-conversion' into dynamical-pressur…
Sep 30, 2025
7b4d205
implement suggestions
Sep 30, 2025
d805093
Merge branch 'dynamical-pressure-boundaries' into dynamical-pressure-…
Sep 30, 2025
2e90692
add comment
Sep 30, 2025
c36bbf9
Merge branch 'dynamical-pressure-boundaries' into dynamical-pressure-…
Sep 30, 2025
0aa56ea
revise comment
Sep 30, 2025
8f29a5f
add comment
Sep 30, 2025
7d107fb
Merge branch 'main' into dynamical-pressure-boundaries
Sep 30, 2025
07a0724
Merge branch 'main' into dynamical-pressure-boundaries
Sep 30, 2025
fa6161f
Merge branch 'dynamical-pressure-boundaries' into dynamical-pressure-…
Oct 1, 2025
7a0f84c
Merge branch 'dynamical-pressure-validation' into add-rcr-windkessel-…
Oct 1, 2025
da87d13
add comment
Oct 1, 2025
258b0a0
make it work on GPU
Oct 1, 2025
56ee253
add comment
Oct 1, 2025
dd0d653
revise show
Oct 1, 2025
148546d
add initial pressure
Oct 2, 2025
4ca007d
fix flow rate
Oct 2, 2025
0f0574b
fix stupid bug
Oct 2, 2025
e6af2c7
add test
Oct 2, 2025
50c7bcf
Merge branch 'main' into dynamical-pressure-validation
Oct 2, 2025
17ae842
Merge branch 'dynamical-pressure-validation' into add-rcr-windkessel-…
Oct 2, 2025
1c25f49
adapt for other boundary model
Oct 2, 2025
61f036f
add docs
Oct 2, 2025
efd83e2
add literature
Oct 2, 2025
22a39e2
fix
Oct 2, 2025
3639501
Merge branch 'main' into dynamical-pressure-validation
Oct 2, 2025
cde8717
Merge branch 'dynamical-pressure-validation' into add-rcr-windkessel-…
Oct 2, 2025
987959b
revise
Oct 2, 2025
1a20a62
update result poiseuille flow
Oct 2, 2025
dcae72d
fix typos
Oct 2, 2025
9722783
fix
Oct 2, 2025
6405a52
add results dp30 hpf
Oct 2, 2025
fbace6a
update hpf 40
Oct 2, 2025
391840f
Merge branch 'main' into dynamical-pressure-validation
Oct 2, 2025
8cde525
Merge branch 'dynamical-pressure-validation' into add-rcr-windkessel-…
Oct 2, 2025
ce1b14a
Merge branch 'main' into add-rcr-windkessel-model
Oct 8, 2025
610dabf
Merge branch 'add-rcr-windkessel-model' into obc-fsi-validation
Oct 8, 2025
26f2e00
setup pulse wave propagation with plot
Oct 8, 2025
00fbb98
increase buffer particles
Oct 9, 2025
f7afe0b
add RCR experiment
Oct 9, 2025
13e11b7
add pinthreads
Oct 9, 2025
14a5702
fix script
Oct 9, 2025
820ef04
try to improve start-up phase
Oct 10, 2025
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
23 changes: 23 additions & 0 deletions docs/src/refs.bib
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,15 @@ @Article{Ganzenmueller2015
publisher = {Elsevier {BV}},
}

@Book{Gasser2021,
author = {Gasser, T. Christian},
title = {Vascular Biomechanics: Concepts, Models, and Applications},
year = {2021},
isbn = {9783030709662},
doi = {10.1007/978-3-030-70966-2},
publisher = {Springer International Publishing},
}

@Article{Giles1990,
author = {Giles, Michael B.},
title = {Nonreflecting boundary conditions for {Euler} equation calculations},
Expand Down Expand Up @@ -817,6 +826,20 @@ @Article{Wendland1995
publisher = {Springer Science and Business Media LLC},
}

@Article{Westerhof2008,
author = {Westerhof, Nico and Lankhaar, Jan-Willem and Westerhof, Berend E.},
journal = {Medical \& Biological Engineering \& Computing},
title = {The arterial Windkessel},
year = {2008},
issn = {1741-0444},
month = jun,
number = {2},
pages = {131--141},
volume = {47},
doi = {10.1007/s11517-008-0359-2},
publisher = {Springer Science and Business Media LLC},
}

@Article{Zhang2025,
author = {Zhang, Shuoguo and Fan, Yu and Wu, Dong and Zhang, Chi and Hu, Xiangyu},
journal = {Physics of Fluids},
Expand Down
6 changes: 6 additions & 0 deletions docs/src/systems/boundary.md
Original file line number Diff line number Diff line change
Expand Up @@ -342,3 +342,9 @@ without the need to specifically identify those near the free surface.
To further handle incomplete kernel support, for example in the viscous term of the momentum equation,
the updated velocity of particles within the [`BoundaryZone`](@ref) is projected onto the face normal,
so that only the component in flow direction is kept.

# Pressure Models
```@autodocs
Modules = [TrixiParticles]
Pages = [joinpath("schemes", "boundary", "open_boundary", "pressure_model.jl")]
```
174 changes: 174 additions & 0 deletions examples/fluid/hagen_poiseuille_flow_3d.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
# ==========================================================================================
# 3D Hagen-Poiseuille Flow Simulation (Weakly Compressible SPH)
#
# Based on:
# Zhan, X., et al. "Dynamical pressure boundary condition for weakly compressible smoothed particle hydrodynamics"
# Physics of Fluids, Volume 37
# https://doi.org/10.1063/5.0254575
#
# This example sets up a 3D Hagen-Poiseuille flow simulation in a circular pipe
# including open boundary conditions.
# ==========================================================================================
using TrixiParticles
using OrdinaryDiffEq

# ==========================================================================================
# ==== Resolution
const flow_length = 0.004
const pipe_radius = 0.0005
pipe_diameter = 2 * pipe_radius

particle_spacing_factor = 30
particle_spacing = pipe_diameter / particle_spacing_factor

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

# Make sure that the kernel support of fluid particles at an open boundary is always
# fully sampled.
open_boundary_layers = 10

# ==========================================================================================
# ==== Experiment Setup
tspan = (0.0, 1.0)
domain_size = (flow_length, pipe_diameter)

open_boundary_size = (open_boundary_layers * particle_spacing, domain_size[2])

fluid_density = 1000.0
reynolds_number = 50
const pressure_drop = 0.1
const dynamic_viscosity = sqrt(fluid_density * pipe_radius^2 * pressure_drop /
(4 * reynolds_number))

v_max = pipe_radius^2 * pressure_drop / (4 * dynamic_viscosity * flow_length)

sound_speed_factor = 100
sound_speed = sound_speed_factor * v_max

flow_direction = (1.0, 0.0, 0.0)

n_particles_length = ceil(Int, flow_length / particle_spacing)
wall_2d = SphereShape(particle_spacing, pipe_radius, (0.0, 0.0),
fluid_density, n_layers=boundary_layers, layer_outwards=true,
sphere_type=RoundSphere())
# Extend 2d coordinates to 3d by adding x-coordinates
wall_2d_coordinates = hcat(particle_spacing / 2 * ones(nparticles(wall_2d)),
wall_2d.coordinates')'

pipe_wall = extrude_geometry(wall_2d_coordinates; particle_spacing,
direction=collect(flow_direction), density=fluid_density,
n_extrude=n_particles_length)

circle = SphereShape(particle_spacing, pipe_radius, (0.0, 0.0), fluid_density,
sphere_type=RoundSphere())
# Extend 2d coordinates to 3d by adding x-coordinates
circle_coordinates = hcat(particle_spacing / 2 * ones(nparticles(circle)),
circle.coordinates')'

inlet = extrude_geometry(circle_coordinates; particle_spacing,
direction=collect(flow_direction), density=fluid_density,
n_extrude=open_boundary_layers)
offset_fluid = [open_boundary_layers * particle_spacing, 0, 0]
fluid = extrude_geometry(circle_coordinates .+ offset_fluid; particle_spacing,
direction=collect(flow_direction), density=fluid_density,
n_extrude=(n_particles_length - 2 * open_boundary_layers))

offset_outlet = [(n_particles_length - open_boundary_layers) * particle_spacing, 0, 0]
outlet = extrude_geometry(circle_coordinates .+ offset_outlet;
particle_spacing, direction=collect(flow_direction),
n_extrude=open_boundary_layers, density=fluid_density)

n_buffer_particles = 10 * nparticles(circle)

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

fluid_density_calculator = ContinuityDensity()

kinematic_viscosity = dynamic_viscosity / fluid_density

viscosity = ViscosityAdami(nu=kinematic_viscosity)

background_pressure = 7 * sound_speed_factor / 10 * fluid_density * v_max^2
shifting_technique = TransportVelocityAdami(; background_pressure)

state_equation = StateEquationCole(; sound_speed, reference_density=fluid_density,
exponent=1)
fluid_system = WeaklyCompressibleSPHSystem(fluid, fluid_density_calculator,
state_equation, smoothing_kernel,
buffer_size=n_buffer_particles,
shifting_technique=shifting_technique,
density_diffusion=DensityDiffusionMolteniColagrossi(delta=0.1),
smoothing_length, viscosity=viscosity)

# ==========================================================================================
# ==== Open Boundary
open_boundary_model = BoundaryModelDynamicalPressureZhang()

boundary_type_in = BidirectionalFlow()
face_in = ([open_boundary_layers * particle_spacing, -pipe_diameter, -pipe_diameter],
[open_boundary_layers * particle_spacing, -pipe_diameter, pipe_diameter],
[open_boundary_layers * particle_spacing, pipe_diameter, pipe_diameter])
reference_velocity_in = nothing
reference_pressure_in = 0.2
inflow = BoundaryZone(; boundary_face=face_in, face_normal=flow_direction,
open_boundary_layers, density=fluid_density, particle_spacing,
reference_velocity=reference_velocity_in,
reference_pressure=reference_pressure_in,
initial_condition=inlet, boundary_type=boundary_type_in)

boundary_type_out = BidirectionalFlow()
face_out = ([offset_outlet[1], -pipe_diameter, -pipe_diameter],
[offset_outlet[1], -pipe_diameter, pipe_diameter],
[offset_outlet[1], pipe_diameter, pipe_diameter])
reference_velocity_out = nothing
reference_pressure_out = 0.1
outflow = BoundaryZone(; boundary_face=face_out, face_normal=(.-(flow_direction)),
open_boundary_layers, density=fluid_density, particle_spacing,
reference_velocity=reference_velocity_out,
reference_pressure=reference_pressure_out,
initial_condition=outlet, boundary_type=boundary_type_out)

open_boundary = OpenBoundarySystem(inflow, outflow; fluid_system,
boundary_model=open_boundary_model,
buffer_size=n_buffer_particles)
# ==========================================================================================
# ==== Boundary

boundary_model = BoundaryModelDummyParticles(pipe_wall.density, pipe_wall.mass,
AdamiPressureExtrapolation(),
state_equation=state_equation,
viscosity=viscosity,
smoothing_kernel, smoothing_length)

boundary_system = WallBoundarySystem(pipe_wall, boundary_model)

# ==========================================================================================
# ==== Simulation
min_corner = minimum(pipe_wall.coordinates .- 2 * particle_spacing, dims=2)
max_corner = maximum(pipe_wall.coordinates .+ 2 * particle_spacing, dims=2)

nhs = GridNeighborhoodSearch{3}(; cell_list=FullGridCellList(; min_corner, max_corner),
update_strategy=ParallelUpdate())

semi = Semidiscretization(fluid_system, open_boundary,
boundary_system, neighborhood_search=nhs,
parallelization_backend=PolyesterBackend())

ode = semidiscretize(semi, tspan)

info_callback = InfoCallback(interval=20)
saving_callback = SolutionSavingCallback(dt=0.01, prefix="", output_directory="out")

extra_callback = nothing

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

sol = solve(ode, RDPK3SpFSAL35(),
abstol=1e-6, # Default abstol is 1e-6 (may need to be tuned to prevent boundary penetration)
reltol=1e-4, # 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);
33 changes: 33 additions & 0 deletions examples/fluid/pulsatile_channel_flow_3d.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# ==========================================================================================
# 3D Pulsatile Channel Flow Simulation (Weakly Compressible SPH)
#
# Based on:
# Zhan, X., et al. "Dynamical pressure boundary condition for weakly compressible smoothed particle hydrodynamics"
# Physics of Fluids, Volume 37
# https://doi.org/10.1063/5.0254575
#
# This example sets up a 3D pulsatile channel flow simulation in a circular pipe
# including open boundary conditions.
# ==========================================================================================
using TrixiParticles

particle_spacing_factor = 30

trixi_include(@__MODULE__, joinpath(examples_dir(), "fluid", "hagen_poiseuille_flow_3d.jl"),
tspan=(0.0, 1.0), sol=nothing,
particle_spacing_factor=particle_spacing_factor)

v_max = pipe_diameter^2 * pressure_drop / (8 * dynamic_viscosity * flow_length)

function dynamic_pressure_drop(pos, t)
return pressure_drop + (flow_length - pos[1]) / flow_length * pressure_drop * cos(t)
end

saving_callback = SolutionSavingCallback(dt=0.01, prefix="", output_directory="out")
extra_callback = nothing

trixi_include(@__MODULE__, joinpath(examples_dir(), "fluid", "hagen_poiseuille_flow_3d.jl"),
tspan=(0.0, 12.6), particle_spacing_factor=particle_spacing_factor,
extra_callback=extra_callback, saving_callback=saving_callback, v_max=v_max,
reference_pressure_in=dynamic_pressure_drop,
reference_pressure_out=dynamic_pressure_drop)
Loading
Loading