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

initarray! julia 1.8 #2665

Closed
wants to merge 32 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
e871835
fixed interpolation
simone-silvestri Mar 30, 2022
8d0924e
Update src/Fields/interpolate.jl
simone-silvestri Mar 30, 2022
bb27a78
Test Lagrangian particles on stretched grid
glwagner Mar 31, 2022
c909cb0
Adds a validation experiment for Lagrangian particles
glwagner Mar 31, 2022
5c35f5d
Couple bugfixes in new test
glwagner Mar 31, 2022
4917bf2
Updates validation
glwagner Mar 31, 2022
1f4cf69
Improves show method
glwagner Mar 31, 2022
8452ade
Updates validation experiment
glwagner Mar 31, 2022
f35fa9b
Better show again
glwagner Mar 31, 2022
fcc6fff
Updates show for Particle so we can see their location
glwagner Mar 31, 2022
1840778
scalar_summary -> prettysummary
glwagner Mar 31, 2022
352923f
Merge branch 'main' into ss/on_architecture
navidcy Apr 22, 2022
5800c1e
Update prescribed_hydrostatic_velocity_fields.jl
simone-silvestri Jul 13, 2022
93f0d28
typo
simone-silvestri Jul 13, 2022
b73d71e
initial commit
simone-silvestri Jul 13, 2022
23be519
add preliminary IBG
simone-silvestri Jul 13, 2022
c2900fd
fixed bugs
simone-silvestri Jul 13, 2022
74d62c9
IBG before particles
simone-silvestri Jul 13, 2022
66650c5
added immersed restitution
simone-silvestri Jul 13, 2022
6b1ced7
fixed test bug
simone-silvestri Jul 13, 2022
96b033c
immersed restitution
simone-silvestri Jul 13, 2022
5c18a0c
angular velocity for particles
simone-silvestri Jul 13, 2022
bc9a7f7
correct kernel for immersed boundary
simone-silvestri Jul 13, 2022
6087bf7
fixed bunch of stuff
simone-silvestri Jul 13, 2022
ade05a2
better immersed restitution
simone-silvestri Jul 13, 2022
4686726
little bit of comment
simone-silvestri Jul 13, 2022
4cc17cb
better adjust coord
simone-silvestri Jul 13, 2022
a4ee00e
fixed all tests
simone-silvestri Jul 13, 2022
3df934f
Particles are fast!!!
simone-silvestri Jul 15, 2022
a59c8ab
changes interpolation and bugfixes
simone-silvestri Jul 15, 2022
40d0745
first commit
simone-silvestri Jul 15, 2022
6fc8150
fixed problem
simone-silvestri Jul 15, 2022
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
14 changes: 9 additions & 5 deletions docs/src/model_setup/lagrangian_particles.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@ z₀ = -0.5 * ones(n_particles);
lagrangian_particles = LagrangianParticles(x=x₀, y=y₀, z=z₀)

# output
10 Lagrangian particles with
10 LagrangianParticles with eltype Particle:
├── 3 properties: (:x, :y, :z)
└── 0 tracked fields: ()
├── particle-wall restitution coefficient: 1.0
├── 0 tracked fields: ()
└── dynamics: no_dynamics
```

then pass it to a model constructor
Expand All @@ -46,7 +48,7 @@ NonhydrostaticModel{CPU, RectilinearGrid}(time = 0 seconds, iteration = 0)
├── closure: Nothing
├── buoyancy: Nothing
├── coriolis: Nothing
└── particles: 10 Lagrangian particles with 3 properties: (:x, :y, :z)
└── particles: 10 LagrangianParticles with eltype Particle and properties (:x, :y, :z)
```

!!! warn "Lagrangian particles on GPUs"
Expand Down Expand Up @@ -87,9 +89,11 @@ particles = StructArray{LagrangianMicrobe}((x₀, y₀, z₀, species, dna));
lagrangian_particles = LagrangianParticles(particles)

# output
3 Lagrangian particles with
3 LagrangianParticles with eltype LagrangianMicrobe:
├── 5 properties: (:x, :y, :z, :species, :dna)
└── 0 tracked fields: ()
├── particle-wall restitution coefficient: 1.0
├── 0 tracked fields: ()
└── dynamics: no_dynamics
```

!!! warn "Custom properties on GPUs"
Expand Down
1 change: 1 addition & 0 deletions src/BoundaryConditions/fill_halo_regions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ using KernelAbstractions.Extras.LoopInfo: @unroll
#####

fill_halo_regions!(::Nothing, args...) = nothing
fill_halo_regions!(::NamedTuple{(), Tuple{}}, args...) = nothing

"""
fill_halo_regions!(fields::Union{Tuple, NamedTuple}, arch, args...)
Expand Down
4 changes: 2 additions & 2 deletions src/BuoyancyModels/linear_equation_of_state.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ struct LinearEquationOfState{FT} <: AbstractEquationOfState
end

Base.summary(eos::LinearEquationOfState) =
string("LinearEquationOfState(thermal_expansion=", scalar_summary(eos.thermal_expansion),
", haline_contraction=", scalar_summary(eos.haline_contraction), ")")
string("LinearEquationOfState(thermal_expansion=", prettysummary(eos.thermal_expansion),
", haline_contraction=", prettysummary(eos.haline_contraction), ")")

Base.show(io, eos::LinearEquationOfState) = print(io, summary(eos))

Expand Down
4 changes: 2 additions & 2 deletions src/BuoyancyModels/seawater_buoyancy.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Oceananigans.BoundaryConditions: NoFluxBoundaryCondition
using Oceananigans.Grids: scalar_summary
using Oceananigans.Utils: prettysummary

"""
SeawaterBuoyancy{FT, EOS, T, S} <: AbstractBuoyancyModel{EOS}
Expand All @@ -20,7 +20,7 @@ required_tracers(::SeawaterBuoyancy{FT, EOS, <:Nothing, <:Number}) where {FT, EO
required_tracers(::SeawaterBuoyancy{FT, EOS, <:Number, <:Nothing}) where {FT, EOS} = (:S,) # active salinity only

Base.nameof(::Type{SeawaterBuoyancy}) = "SeawaterBuoyancy"
Base.summary(b::SeawaterBuoyancy) = string(nameof(typeof(b)), " with g=", scalar_summary(b.gravitational_acceleration),
Base.summary(b::SeawaterBuoyancy) = string(nameof(typeof(b)), " with g=", prettysummary(b.gravitational_acceleration),
" and ", summary(b.equation_of_state))

function Base.show(io::IO, b::SeawaterBuoyancy{FT}) where FT
Expand Down
4 changes: 2 additions & 2 deletions src/Coriolis/beta_plane.jl
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ end
@inline z_f_cross_U(i, j, k, grid::AbstractGrid{FT}, coriolis::BetaPlane, U) where FT = zero(FT)

function Base.summary(βplane::BetaPlane{FT}) where FT
fstr = scalar_summary(βplane.f₀)
βstr = scalar_summary(βplane.β)
fstr = prettysummary(βplane.f₀)
βstr = prettysummary(βplane.β)
return "BetaPlane{$FT}(f₀=$fstr, β=$βstr)"
end

Expand Down
4 changes: 2 additions & 2 deletions src/Coriolis/f_plane.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Oceananigans.Grids: scalar_summary
using Oceananigans.Utils: prettysummary

"""
FPlane{FT} <: AbstractRotation
Expand Down Expand Up @@ -44,7 +44,7 @@ end
@inline z_f_cross_U(i, j, k, grid, coriolis::FPlane, U) = zero(eltype(grid))

function Base.summary(fplane::FPlane{FT}) where FT
fstr = scalar_summary(fplane.f)
fstr = prettysummary(fplane.f)
return "FPlane{$FT}(f=$fstr)"
end

Expand Down
10 changes: 6 additions & 4 deletions src/Fields/field.jl
Original file line number Diff line number Diff line change
Expand Up @@ -508,10 +508,12 @@ const MinimumReduction = typeof(Base.minimum!)
const AllReduction = typeof(Base.all!)
const AnyReduction = typeof(Base.any!)

initialize_reduced_field!(::SumReduction, f, r::ReducedField, c) = Base.initarray!(interior(r), Base.add_sum, true, interior(c))
initialize_reduced_field!(::ProdReduction, f, r::ReducedField, c) = Base.initarray!(interior(r), Base.mul_prod, true, interior(c))
initialize_reduced_field!(::AllReduction, f, r::ReducedField, c) = Base.initarray!(interior(r), &, true, interior(c))
initialize_reduced_field!(::AnyReduction, f, r::ReducedField, c) = Base.initarray!(interior(r), |, true, interior(c))
check_version(VERSION) = VERSION.minor > 7

initialize_reduced_field!(::SumReduction, f, r::ReducedField, c) = check_version(VERSION) ? Base.initarray!(interior(r), f, Base.add_sum, true, interior(c)) : Base.initarray!(interior(r), Base.add_sum, true, interior(c))
initialize_reduced_field!(::ProdReduction, f, r::ReducedField, c) = check_version(VERSION) ? Base.initarray!(interior(r), f, Base.mul_prod, true, interior(c)) : Base.initarray!(interior(r), Base.mul_prod, true, interior(c))
initialize_reduced_field!(::AllReduction, f, r::ReducedField, c) = check_version(VERSION) ? Base.initarray!(interior(r), f, &, true, interior(c)) : Base.initarray!(interior(r), &, true, interior(c))
initialize_reduced_field!(::AnyReduction, f, r::ReducedField, c) = check_version(VERSION) ? Base.initarray!(interior(r), f, |, true, interior(c)) : Base.initarray!(interior(r), |, true, interior(c))

initialize_reduced_field!(::MaximumReduction, f, r::ReducedField, c) = Base.mapfirst!(f, interior(r), interior(c))
initialize_reduced_field!(::MinimumReduction, f, r::ReducedField, c) = Base.mapfirst!(f, interior(r), interior(c))
Expand Down
60 changes: 40 additions & 20 deletions src/Fields/interpolate.jl
Original file line number Diff line number Diff line change
@@ -1,19 +1,39 @@
using Oceananigans.Grids: XRegRectilinearGrid, YRegRectilinearGrid, ZRegRectilinearGrid
using CUDA: allowscalar

@inline function linear_interpolate_sorted_vector(vec, val)
function binary_search(list, query; rev=false, lt=<, by=identity)
if issorted(list) || issorted(list; rev=true)
low = !rev ? 0 : length(list) - 1
high = !rev ? length(list) - 1 : 0
middle(l, h) = round(Int, (l + h)//2)
query = by(query)

while !rev ? low + 1 < high : high + 1 < low
mid = middle(low, high)
by(list[mid+1]) === query && return mid:mid
if lt(by(list[mid+1]), query)
low = mid
else
high = mid
end
end
return !rev ? (low:high).+1 : (high:low).+1

allowscalar(true)
y2 = searchsortedfirst(vec, val)
y1 = searchsortedlast(vec, val)
x2 = vec[y2]
x1 = vec[y1]
allowscalar(false)
else
throw(error("List not sorted, unable to search value"))
end
end

@inline function fractional_index(vec, val)

y₁, y₂ = binary_search(vec, val)
x₂ = vec[y₂]
x₁ = vec[y₁]

if y1 == y2
return y1
if y₁ == y₂
return y₁
else
return (y2 - y1) / (x2 - x1) * (val - x1) + y1
return (y₂ - y₁) / (x₂ - x₁) * (val - x₁) + y₁
end
end

Expand All @@ -22,20 +42,20 @@ end
#### Use other methods if a more accurate interpolation is required
####

@inline fractional_x_index(x, ::Face, grid::RectilinearGrid) = linear_interpolate_sorted_vector(grid.xᶠᵃᵃ, x)
@inline fractional_x_index(x, ::Center, grid::RectilinearGrid) = linear_interpolate_sorted_vector(grid.xᶜᵃᵃ, x)
@inline fractional_y_index(y, ::Face, grid::RectilinearGrid) = linear_interpolate_sorted_vector(grid.yᵃᶠᵃ, y)
@inline fractional_y_index(y, ::Center, grid::RectilinearGrid) = linear_interpolate_sorted_vector(grid.yᵃᶜᵃ, y)
@inline fractional_x_index(x, ::Face, grid::RectilinearGrid) = fractional_index(grid.xᶠᵃᵃ, x)
@inline fractional_x_index(x, ::Center, grid::RectilinearGrid) = fractional_index(grid.xᶜᵃᵃ, x)
@inline fractional_y_index(y, ::Face, grid::RectilinearGrid) = fractional_index(grid.yᵃᶠᵃ, y)
@inline fractional_y_index(y, ::Center, grid::RectilinearGrid) = fractional_index(grid.yᵃᶜᵃ, y)

@inline fractional_x_index(x, ::Face, grid::XRegRectilinearGrid) = @inbounds (x - grid.xᶠᵃᵃ[1]) / grid.Δxᶠᵃᵃ
@inline fractional_x_index(x, ::Center, grid::XRegRectilinearGrid) = @inbounds (x - grid.xᶜᵃᵃ[1]) / grid.Δxᶜᵃᵃ
@inline fractional_y_index(y, ::Face, grid::YRegRectilinearGrid) = @inbounds (y - grid.yᵃᶠᵃ[1]) / grid.Δyᵃᶠᵃ
@inline fractional_y_index(y, ::Center, grid::YRegRectilinearGrid) = @inbounds (y - grid.yᵃᶜᵃ[1]) / grid.Δyᵃᶜᵃ

@inline fractional_x_index(λ, ::Face, grid::LatitudeLongitudeGrid) = linear_interpolate_sorted_vector(grid.λᶠᵃᵃ, λ)
@inline fractional_x_index(λ, ::Center, grid::LatitudeLongitudeGrid) = linear_interpolate_sorted_vector(grid.λᶜᵃᵃ, λ)
@inline fractional_y_index(φ, ::Face, grid::LatitudeLongitudeGrid) = linear_interpolate_sorted_vector(grid.φᵃᶠᵃ, φ)
@inline fractional_y_index(φ, ::Center, grid::LatitudeLongitudeGrid) = linear_interpolate_sorted_vector(grid.φᵃᶜᵃ, φ)
@inline fractional_x_index(λ, ::Face, grid::LatitudeLongitudeGrid) = fractional_index(grid.λᶠᵃᵃ, λ)
@inline fractional_x_index(λ, ::Center, grid::LatitudeLongitudeGrid) = fractional_index(grid.λᶜᵃᵃ, λ)
@inline fractional_y_index(φ, ::Face, grid::LatitudeLongitudeGrid) = fractional_index(grid.φᵃᶠᵃ, φ)
@inline fractional_y_index(φ, ::Center, grid::LatitudeLongitudeGrid) = fractional_index(grid.φᵃᶜᵃ, φ)

@inline fractional_x_index(λ, ::Face, grid::XRegLatLonGrid) = @inbounds (λ - grid.λᶠᵃᵃ[1]) / grid.Δλᶠᵃᵃ
@inline fractional_x_index(λ, ::Center, grid::XRegLatLonGrid) = @inbounds (λ - grid.λᶜᵃᵃ[1]) / grid.Δλᶜᵃᵃ
Expand All @@ -44,8 +64,8 @@ end

const ZReg = Union{ZRegRectilinearGrid, ZRegLatLonGrid}

@inline fractional_z_index(z, ::Face, grid) = linear_interpolate_sorted_vector(grid.zᵃᵃᶠ, z)
@inline fractional_z_index(z, ::Center, grid) = linear_interpolate_sorted_vector(grid.zᵃᵃᶜ, z)
@inline fractional_z_index(z, ::Face, grid) = fractional_index(grid.zᵃᵃᶠ, z)
@inline fractional_z_index(z, ::Center, grid) = fractional_index(grid.zᵃᵃᶜ, z)

@inline fractional_z_index(z, ::Face, grid::ZReg) = @inbounds (z - grid.zᵃᵃᶠ[1]) / grid.Δzᵃᵃᶠ
@inline fractional_z_index(z, ::Center, grid::ZReg) = @inbounds (z - grid.zᵃᵃᶜ[1]) / grid.Δzᵃᵃᶜ
Expand Down
2 changes: 1 addition & 1 deletion src/Fields/show_fields.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Printf
using Oceananigans.Grids: size_summary, scalar_summary
using Oceananigans.Grids: size_summary
using Oceananigans.Utils: prettysummary
using Oceananigans.BoundaryConditions: bc_str

Expand Down
16 changes: 8 additions & 8 deletions src/Grids/grid_utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ Base.summary(::ZDirection) = "ZDirection"
#####

size_summary(sz) = string(sz[1], "×", sz[2], "×", sz[3])
scalar_summary(σ) = writeshortest(σ, false, false, true, -1, UInt8('e'), false, UInt8('.'), false, true)
prettysummary(σ::AbstractFloat, plus=false) = writeshortest(σ, plus, false, true, -1, UInt8('e'), false, UInt8('.'), false, true)
dimension_summary(topo::Flat, name, args...) = "Flat $name"

function domain_summary(topo, name, left, right)
Expand All @@ -414,10 +414,10 @@ function domain_summary(topo, name, left, right)
topo isa FullyConnected ? "FullyConnected " :
topo isa LeftConnected ? "LeftConnected " :
"RightConnected "
prefix = string(topo_string, name, " ∈ [",
scalar_summary(left), ", ",
scalar_summary(right), interval)

return string(topo_string, name, " ∈ [",
prettysummary(left), ", ",
prettysummary(right), interval)
end

function dimension_summary(topo, name, left, right, spacing, pad_domain=0)
Expand All @@ -426,7 +426,7 @@ function dimension_summary(topo, name, left, right, spacing, pad_domain=0)
return string(prefix, padding, coordinate_summary(spacing, name))
end

coordinate_summary(Δ::Number, name) = @sprintf("regularly spaced with Δ%s=%s", name, scalar_summary(Δ))
coordinate_summary(Δ::Number, name) = @sprintf("regularly spaced with Δ%s=%s", name, prettysummary(Δ))
coordinate_summary(Δ::AbstractVector, name) = @sprintf("variably spaced with min(Δ%s)=%s, max(Δ%s)=%s",
name, scalar_summary(minimum(parent(Δ))),
name, scalar_summary(maximum(parent(Δ))))
name, prettysummary(minimum(parent(Δ))),
name, prettysummary(maximum(parent(Δ))))
30 changes: 25 additions & 5 deletions src/LagrangianParticleTracking/LagrangianParticleTracking.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@ module LagrangianParticleTracking

export LagrangianParticles, update_particle_properties!

using Printf
using Adapt
using KernelAbstractions
using StructArrays

using Oceananigans.Grids
using Oceananigans.Architectures: device
using Oceananigans.Fields: interpolate, datatuple, compute!, location
using Oceananigans.Grids: xnode, ynode, znode
using Oceananigans.Grids: AbstractUnderlyingGrid, AbstractGrid, hack_cosd
using Oceananigans.ImmersedBoundaries
using Oceananigans.ImmersedBoundaries: immersed_cell
using Oceananigans.Architectures: device, architecture
using Oceananigans.Fields: interpolate, datatuple, compute!, location, fractional_indices, fractional_y_index
using Oceananigans.Utils: prettysummary, launch!

import Base: size, length, show

Expand All @@ -20,6 +26,11 @@ struct Particle{T} <: AbstractParticle
z :: T
end

Base.show(io::IO, p::Particle) = print(io, "Particle at (",
@sprintf("%-8s", prettysummary(p.x, true) * ", "),
@sprintf("%-8s", prettysummary(p.y, true) * ", "),
@sprintf("%-8s", prettysummary(p.z, true) * ")"))

struct LagrangianParticles{P, R, T, D, Π}
properties :: P
restitution :: R
Expand Down Expand Up @@ -79,13 +90,22 @@ end
size(lagrangian_particles::LagrangianParticles) = size(lagrangian_particles.properties)
length(lagrangian_particles::LagrangianParticles) = length(lagrangian_particles.properties)

Base.summary(particles::LagrangianParticles) =
string(length(particles), " LagrangianParticles with eltype ", nameof(eltype(particles.properties)),
" and properties ", propertynames(particles.properties))

function Base.show(io::IO, lagrangian_particles::LagrangianParticles)
particles = lagrangian_particles.properties
Tparticle = nameof(eltype(particles))
properties = propertynames(particles)
fields = lagrangian_particles.tracked_fields
print(io, "$(length(particles)) Lagrangian particles with\n",
"├── $(length(properties)) properties: $properties\n",
"└── $(length(fields)) tracked fields: $(propertynames(fields))")
Nparticles = length(particles)

print(io, Nparticles, " LagrangianParticles with eltype ", Tparticle, ":", '\n',
"├── ", length(properties), " properties: ", properties, '\n',
"├── particle-wall restitution coefficient: ", lagrangian_particles.restitution, '\n',
"├── ", length(fields), " tracked fields: ", propertynames(fields), '\n',
"└── dynamics: ", prettysummary(lagrangian_particles.dynamics, false))
end

include("update_particle_properties.jl")
Expand Down
Loading