From c60a148b23f8a58323ff86d5f63608d395cb953e Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Fri, 10 May 2024 10:23:56 +0200 Subject: [PATCH 01/16] Implement NHS based on static neighbor lists --- src/PointNeighbors.jl | 1 + src/nhs_neighbor_lists.jl | 86 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/nhs_neighbor_lists.jl diff --git a/src/PointNeighbors.jl b/src/PointNeighbors.jl index 2c53aef..4dc9a3c 100644 --- a/src/PointNeighbors.jl +++ b/src/PointNeighbors.jl @@ -10,6 +10,7 @@ include("util.jl") include("neighborhood_search.jl") include("nhs_trivial.jl") include("nhs_grid.jl") +include("nhs_neighbor_lists.jl") export for_particle_neighbor export TrivialNeighborhoodSearch, GridNeighborhoodSearch diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl new file mode 100644 index 0000000..e0db019 --- /dev/null +++ b/src/nhs_neighbor_lists.jl @@ -0,0 +1,86 @@ +struct NeighborListsNeighborhoodSearch{NDIMS, NHS, NL, PB} + neighborhood_search :: NHS + neighbor_lists :: NL + periodic_box :: PB + + function NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles; + periodic_box_min_corner = nothing, + periodic_box_max_corner = nothing) where { + NDIMS + } + backend = GridNeighborhoodSearch{NDIMS}(search_radius, n_particles, + periodic_box_min_corner = periodic_box_min_corner, + periodic_box_max_corner = periodic_box_max_corner) + + neighbor_lists = Vector{Vector{Int}}() + + new{NDIMS, typeof(backend), + typeof(neighbor_lists), + typeof(backend.periodic_box)}(backend, neighbor_lists, backend.periodic_box) + end +end + +@inline function Base.ndims(neighborhood_search::NeighborListsNeighborhoodSearch{NDIMS}) where { + NDIMS + } + return NDIMS +end + +function initialize!(search::NeighborListsNeighborhoodSearch, + x::AbstractMatrix, y::AbstractMatrix) + (; neighborhood_search, neighbor_lists) = search + + initialize!(neighborhood_search, x, y) + + initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) +end + +function update!(search::NeighborListsNeighborhoodSearch, x::AbstractMatrix, + y::AbstractMatrix; + particles_moving = (true, true)) + (; neighborhood_search, neighbor_lists) = search + + update!(neighborhood_search, x, y, particles_moving = particles_moving) + + initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) +end + +function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) + # Initialize neighbor lists + empty!(neighbor_lists) + resize!(neighbor_lists, size(x, 2)) + for i in eachindex(neighbor_lists) + neighbor_lists[i] = Int[] + end + + # Compute neighbor lists + for_particle_neighbor(x, y, neighborhood_search) do particle, neighbor, _, _ + push!(neighbor_lists[particle], neighbor) + end +end + +@inline function for_particle_neighbor_inner(f, system_coords, neighbor_system_coords, + neighborhood_search::NeighborListsNeighborhoodSearch, + particle) + (; periodic_box, neighbor_lists) = neighborhood_search + (; search_radius) = neighborhood_search.neighborhood_search + + particle_coords = extract_svector(system_coords, Val(ndims(neighborhood_search)), + particle) + for neighbor in neighbor_lists[particle] + neighbor_coords = extract_svector(neighbor_system_coords, + Val(ndims(neighborhood_search)), neighbor) + + pos_diff = particle_coords - neighbor_coords + distance2 = dot(pos_diff, pos_diff) + + pos_diff, distance2 = compute_periodic_distance(pos_diff, distance2, search_radius, + periodic_box) + + distance = sqrt(distance2) + + # Inline to avoid loss of performance + # compared to not using `for_particle_neighbor`. + @inline f(particle, neighbor, pos_diff, distance) + end +end From 13b310a98315495a5fac9fc30a043bb0e4acdd20 Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Fri, 10 May 2024 11:23:01 +0200 Subject: [PATCH 02/16] Reformat code --- src/nhs_neighbor_lists.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl index e0db019..6ff1f22 100644 --- a/src/nhs_neighbor_lists.jl +++ b/src/nhs_neighbor_lists.jl @@ -35,8 +35,8 @@ function initialize!(search::NeighborListsNeighborhoodSearch, initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) end -function update!(search::NeighborListsNeighborhoodSearch, x::AbstractMatrix, - y::AbstractMatrix; +function update!(search::NeighborListsNeighborhoodSearch, + x::AbstractMatrix, y::AbstractMatrix; particles_moving = (true, true)) (; neighborhood_search, neighbor_lists) = search From 3b6d15e34299b36609c8e1af916c2a64149a5ab8 Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Thu, 16 May 2024 16:45:42 +0200 Subject: [PATCH 03/16] Export `NeighborListsNeighborhoodSearch` --- src/PointNeighbors.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PointNeighbors.jl b/src/PointNeighbors.jl index 4dc9a3c..80c9baa 100644 --- a/src/PointNeighbors.jl +++ b/src/PointNeighbors.jl @@ -13,7 +13,7 @@ include("nhs_grid.jl") include("nhs_neighbor_lists.jl") export for_particle_neighbor -export TrivialNeighborhoodSearch, GridNeighborhoodSearch +export TrivialNeighborhoodSearch, GridNeighborhoodSearch, NeighborListsNeighborhoodSearch export initialize!, update!, initialize_grid!, update_grid! end # module PointNeighbors From 81fe6f11db95c862ac73ad2dcabc80623a27ca3f Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Thu, 16 May 2024 16:46:59 +0200 Subject: [PATCH 04/16] Add `NeighborListsNeighborhoodSearch` to tests --- test/neighborhood_search.jl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/neighborhood_search.jl b/test/neighborhood_search.jl index 2045d1d..278b579 100644 --- a/test/neighborhood_search.jl +++ b/test/neighborhood_search.jl @@ -45,10 +45,14 @@ GridNeighborhoodSearch{NDIMS}(search_radius, n_particles, periodic_box_min_corner = periodic_boxes[i][1], periodic_box_max_corner = periodic_boxes[i][2]), + NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles, + periodic_box_min_corner = periodic_boxes[i][1], + periodic_box_max_corner = periodic_boxes[i][2]), ] neighborhood_searches_names = [ "`TrivialNeighborhoodSearch`", "`GridNeighborhoodSearch`", + "`NeighborListsNeighborhoodSearch`", ] # Run this for every neighborhood search From 3018e0c8951c4de04a6afdc073d17bb35af4b513 Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Wed, 29 May 2024 13:15:40 +0200 Subject: [PATCH 05/16] Rename variable --- src/nhs_neighbor_lists.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl index 6ff1f22..3b9cc79 100644 --- a/src/nhs_neighbor_lists.jl +++ b/src/nhs_neighbor_lists.jl @@ -8,15 +8,15 @@ struct NeighborListsNeighborhoodSearch{NDIMS, NHS, NL, PB} periodic_box_max_corner = nothing) where { NDIMS } - backend = GridNeighborhoodSearch{NDIMS}(search_radius, n_particles, - periodic_box_min_corner = periodic_box_min_corner, - periodic_box_max_corner = periodic_box_max_corner) + nhs = GridNeighborhoodSearch{NDIMS}(search_radius, n_particles, + periodic_box_min_corner = periodic_box_min_corner, + periodic_box_max_corner = periodic_box_max_corner) neighbor_lists = Vector{Vector{Int}}() - new{NDIMS, typeof(backend), + new{NDIMS, typeof(nhs), typeof(neighbor_lists), - typeof(backend.periodic_box)}(backend, neighbor_lists, backend.periodic_box) + typeof(nhs.periodic_box)}(nhs, neighbor_lists, nhs.periodic_box) end end From 7d53ff7fa4bb4ebbf96c33cd6875dc806289a9c2 Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:38:08 +0200 Subject: [PATCH 06/16] Fix `foreach_neighbor` --- src/nhs_neighbor_lists.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl index 3b9cc79..4d8ecbb 100644 --- a/src/nhs_neighbor_lists.jl +++ b/src/nhs_neighbor_lists.jl @@ -59,9 +59,9 @@ function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) end end -@inline function for_particle_neighbor_inner(f, system_coords, neighbor_system_coords, - neighborhood_search::NeighborListsNeighborhoodSearch, - particle) +@inline function foreach_neighbor(f, system_coords, neighbor_system_coords, + neighborhood_search::NeighborListsNeighborhoodSearch, + particle, search_radius = nothing) (; periodic_box, neighbor_lists) = neighborhood_search (; search_radius) = neighborhood_search.neighborhood_search From e51f9e83ddfc54362f5ce33a13bdd6f24b50f52d Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:48:20 +0200 Subject: [PATCH 07/16] Improve comments --- src/nhs_neighbor_lists.jl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl index 4d8ecbb..ecdc641 100644 --- a/src/nhs_neighbor_lists.jl +++ b/src/nhs_neighbor_lists.jl @@ -30,6 +30,7 @@ function initialize!(search::NeighborListsNeighborhoodSearch, x::AbstractMatrix, y::AbstractMatrix) (; neighborhood_search, neighbor_lists) = search + # Initialize grid NHS initialize!(neighborhood_search, x, y) initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) @@ -40,9 +41,13 @@ function update!(search::NeighborListsNeighborhoodSearch, particles_moving = (true, true)) (; neighborhood_search, neighbor_lists) = search + # Update grid NHS update!(neighborhood_search, x, y, particles_moving = particles_moving) - initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) + # Skip update if both point sets are static + if any(particles_moving) + initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) + end end function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) @@ -53,7 +58,7 @@ function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) neighbor_lists[i] = Int[] end - # Compute neighbor lists + # Fill neighbor lists for_particle_neighbor(x, y, neighborhood_search) do particle, neighbor, _, _ push!(neighbor_lists[particle], neighbor) end @@ -61,7 +66,7 @@ end @inline function foreach_neighbor(f, system_coords, neighbor_system_coords, neighborhood_search::NeighborListsNeighborhoodSearch, - particle, search_radius = nothing) + particle; search_radius = nothing) (; periodic_box, neighbor_lists) = neighborhood_search (; search_radius) = neighborhood_search.neighborhood_search From 0260b603d4cf901feca365efc08ba7890d2aa99e Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:56:25 +0200 Subject: [PATCH 08/16] Add docs for `NeighborListsNeighborhoodSearch` --- src/nhs_neighbor_lists.jl | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl index ecdc641..3c337b4 100644 --- a/src/nhs_neighbor_lists.jl +++ b/src/nhs_neighbor_lists.jl @@ -1,3 +1,29 @@ +@doc raw""" + NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles; + periodic_box_min_corner = nothing, + periodic_box_max_corner = nothing) + +Neighborhood search with precomputed neighbor lists. A list of all neighbors is computed +for each particle during initialization and update. +This neighborhood search maximizes the performance of neighbor loops at the cost of a much +slower [`update!`](@ref). + +A [`GridNeighborhoodSearch`](@ref) is used internally to compute the neighbor lists during +initialization and update. + +# Arguments +- `NDIMS`: Number of dimensions. +- `search_radius`: The uniform search radius. +- `n_particles`: Total number of particles. + +# Keywords +- `periodic_box_min_corner`: In order to use a (rectangular) periodic domain, pass the + coordinates of the domain corner in negative coordinate + directions. +- `periodic_box_max_corner`: In order to use a (rectangular) periodic domain, pass the + coordinates of the domain corner in positive coordinate + directions. +""" struct NeighborListsNeighborhoodSearch{NDIMS, NHS, NL, PB} neighborhood_search :: NHS neighbor_lists :: NL @@ -20,9 +46,7 @@ struct NeighborListsNeighborhoodSearch{NDIMS, NHS, NL, PB} end end -@inline function Base.ndims(neighborhood_search::NeighborListsNeighborhoodSearch{NDIMS}) where { - NDIMS - } +@inline function Base.ndims(::NeighborListsNeighborhoodSearch{NDIMS}) where {NDIMS} return NDIMS end From 7b56e96f5d1888115d8831d3726119a28b2ba3c1 Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:20:59 +0200 Subject: [PATCH 09/16] Add neighbor lists NHS to tests --- test/neighborhood_search.jl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/test/neighborhood_search.jl b/test/neighborhood_search.jl index 278b579..9559f0a 100644 --- a/test/neighborhood_search.jl +++ b/test/neighborhood_search.jl @@ -90,11 +90,14 @@ ] seeds = [1, 2] - @testset verbose=true "$(length(cloud_size))D with $(prod(cloud_size)) Particles ($(seed == 1 ? "`initialize!`" : "`update!`"))" for cloud_size in cloud_sizes, - seed in seeds + name(size, seed) = "$(length(size))D with $(prod(size)) Particles " * + "($(seed == 1 ? "`initialize!`" : "`update!`"))" + @testset verbose=true "$(name(cloud_size, seed)))" for cloud_size in cloud_sizes, + seed in seeds coords = point_cloud(cloud_size, seed = seed) NDIMS = length(cloud_size) + n_particles = size(coords, 2) search_radius = 2.5 # Use different coordinates for `initialize!` and then `update!` with the @@ -114,11 +117,13 @@ end neighborhood_searches = [ - GridNeighborhoodSearch{NDIMS}(search_radius, size(coords, 2)), + GridNeighborhoodSearch{NDIMS}(search_radius, n_particles), + NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles), ] neighborhood_searches_names = [ "`GridNeighborhoodSearch`", + "`NeighborListsNeighborhoodSearch`", ] @testset "$(neighborhood_searches_names[i])" for i in eachindex(neighborhood_searches_names) From 47981f851853033a40ed80817b01888d54aa5630 Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Sat, 11 May 2024 12:43:43 +0200 Subject: [PATCH 10/16] Use contiguous memory layout for neighbor lists --- Project.toml | 2 ++ src/PointNeighbors.jl | 1 + src/nhs_neighbor_lists.jl | 23 +++++++++++++++++------ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Project.toml b/Project.toml index a327029..a4ad4ad 100644 --- a/Project.toml +++ b/Project.toml @@ -4,12 +4,14 @@ authors = ["Erik Faulhaber "] version = "0.2.4-dev" [deps] +ArraysOfArrays = "65a8f2f4-9b39-5baf-92e2-a9cc46fdf018" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Polyester = "f517fe37-dbe3-4b94-8317-1923a5111588" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" [compat] +ArraysOfArrays = "0.6 LinearAlgebra = "1" Polyester = "0.7.5" Reexport = "1" diff --git a/src/PointNeighbors.jl b/src/PointNeighbors.jl index f04c6dd..4bf29e9 100644 --- a/src/PointNeighbors.jl +++ b/src/PointNeighbors.jl @@ -2,6 +2,7 @@ module PointNeighbors using Reexport: @reexport +using ArraysOfArrays: VectorOfVectors using LinearAlgebra: dot using Polyester: @batch @reexport using StaticArrays: SVector diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl index 3c337b4..9d6e257 100644 --- a/src/nhs_neighbor_lists.jl +++ b/src/nhs_neighbor_lists.jl @@ -31,17 +31,17 @@ struct NeighborListsNeighborhoodSearch{NDIMS, NHS, NL, PB} function NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles; periodic_box_min_corner = nothing, - periodic_box_max_corner = nothing) where { - NDIMS - } + periodic_box_max_corner = nothing + backend = VectorOfVectors{Int}) where { + NDIMS + } nhs = GridNeighborhoodSearch{NDIMS}(search_radius, n_particles, periodic_box_min_corner = periodic_box_min_corner, periodic_box_max_corner = periodic_box_max_corner) - neighbor_lists = Vector{Vector{Int}}() + neighbor_lists = backend() - new{NDIMS, typeof(nhs), - typeof(neighbor_lists), + new{NDIMS, typeof(nhs), typeof(neighbor_lists), typeof(nhs.periodic_box)}(nhs, neighbor_lists, nhs.periodic_box) end end @@ -88,6 +88,17 @@ function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) end end +function initialize_neighbor_lists!(neighbor_lists::VectorOfVectors, neighborhood_search, x, + y) + neighbor_lists_ = Vector{Vector{Int}}() + initialize_neighbor_lists!(neighbor_lists_, neighborhood_search, x, y) + + empty!(neighbor_lists) + for i in eachindex(neighbor_lists_) + push!(neighbor_lists, neighbor_lists_[i]) + end +end + @inline function foreach_neighbor(f, system_coords, neighbor_system_coords, neighborhood_search::NeighborListsNeighborhoodSearch, particle; search_radius = nothing) From fef619a2be0ca883becf67aff8ac8e18e218f12d Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Sat, 11 May 2024 12:47:01 +0200 Subject: [PATCH 11/16] Fix missing comma --- src/nhs_neighbor_lists.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl index 9d6e257..41cd85e 100644 --- a/src/nhs_neighbor_lists.jl +++ b/src/nhs_neighbor_lists.jl @@ -31,7 +31,7 @@ struct NeighborListsNeighborhoodSearch{NDIMS, NHS, NL, PB} function NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles; periodic_box_min_corner = nothing, - periodic_box_max_corner = nothing + periodic_box_max_corner = nothing, backend = VectorOfVectors{Int}) where { NDIMS } From 88adc6c475502a06007c0ed1b3c5e421125a84b8 Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Sat, 11 May 2024 12:48:17 +0200 Subject: [PATCH 12/16] Fix syntax error in Project.toml --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index a4ad4ad..ff05601 100644 --- a/Project.toml +++ b/Project.toml @@ -11,7 +11,7 @@ Reexport = "189a3867-3050-52da-a836-e630ba90ab69" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" [compat] -ArraysOfArrays = "0.6 +ArraysOfArrays = "0.6" LinearAlgebra = "1" Polyester = "0.7.5" Reexport = "1" From eb233830b2cc0a3dc12955d844a360c5f8fc7689 Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:15:27 +0200 Subject: [PATCH 13/16] Improve docs --- src/nhs_neighbor_lists.jl | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl index 41cd85e..4d04157 100644 --- a/src/nhs_neighbor_lists.jl +++ b/src/nhs_neighbor_lists.jl @@ -1,7 +1,8 @@ @doc raw""" NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles; periodic_box_min_corner = nothing, - periodic_box_max_corner = nothing) + periodic_box_max_corner = nothing, + backend = VectorOfVectors{Int32}) Neighborhood search with precomputed neighbor lists. A list of all neighbors is computed for each particle during initialization and update. @@ -23,6 +24,13 @@ initialization and update. - `periodic_box_max_corner`: In order to use a (rectangular) periodic domain, pass the coordinates of the domain corner in positive coordinate directions. +- `backend=VectorOfVectors{Int32}`: Data structure to store the neighbor lists. The default + `VectorOfVectors` is a data structure from + [ArraysOfArrays.jl](https://github.com/JuliaArrays/ArraysOfArrays.jl), + which behaves like a `Vector` of `Vector`s, but uses + a single `Vector` for a contiguous memory layout. + Use `backend=Vector{Vector{Int32}}` to benchmark + the benefits of this representation. """ struct NeighborListsNeighborhoodSearch{NDIMS, NHS, NL, PB} neighborhood_search :: NHS @@ -32,7 +40,7 @@ struct NeighborListsNeighborhoodSearch{NDIMS, NHS, NL, PB} function NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles; periodic_box_min_corner = nothing, periodic_box_max_corner = nothing, - backend = VectorOfVectors{Int}) where { + backend = VectorOfVectors{Int32}) where { NDIMS } nhs = GridNeighborhoodSearch{NDIMS}(search_radius, n_particles, @@ -74,7 +82,8 @@ function update!(search::NeighborListsNeighborhoodSearch, end end -function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) +function initialize_neighbor_lists!(neighbor_lists::Vector{<:Vector}, neighborhood_search, + x, y) # Initialize neighbor lists empty!(neighbor_lists) resize!(neighbor_lists, size(x, 2)) @@ -88,9 +97,8 @@ function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) end end -function initialize_neighbor_lists!(neighbor_lists::VectorOfVectors, neighborhood_search, x, - y) - neighbor_lists_ = Vector{Vector{Int}}() +function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y) + neighbor_lists_ = Vector{Vector{Int32}}() initialize_neighbor_lists!(neighbor_lists_, neighborhood_search, x, y) empty!(neighbor_lists) From ce9153f5eadcf9f59cefca5d9e40e2cf50e88f5e Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:16:46 +0200 Subject: [PATCH 14/16] Test both backends --- test/neighborhood_search.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/neighborhood_search.jl b/test/neighborhood_search.jl index 9559f0a..6961217 100644 --- a/test/neighborhood_search.jl +++ b/test/neighborhood_search.jl @@ -48,11 +48,16 @@ NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles, periodic_box_min_corner = periodic_boxes[i][1], periodic_box_max_corner = periodic_boxes[i][2]), + NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles, + periodic_box_min_corner = periodic_boxes[i][1], + periodic_box_max_corner = periodic_boxes[i][2], + backend=Vector{Vector{Int32}}), ] neighborhood_searches_names = [ "`TrivialNeighborhoodSearch`", "`GridNeighborhoodSearch`", "`NeighborListsNeighborhoodSearch`", + "`NeighborListsNeighborhoodSearch` with `Vector{Vector}` backend", ] # Run this for every neighborhood search @@ -119,11 +124,14 @@ neighborhood_searches = [ GridNeighborhoodSearch{NDIMS}(search_radius, n_particles), NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles), + NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles, + backend=Vector{Vector{Int32}}), ] neighborhood_searches_names = [ "`GridNeighborhoodSearch`", "`NeighborListsNeighborhoodSearch`", + "`NeighborListsNeighborhoodSearch` with `Vector{Vector}` backend", ] @testset "$(neighborhood_searches_names[i])" for i in eachindex(neighborhood_searches_names) From 4c964a0cbaa78be485dd41f9a65ba6a53c1350fe Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:26:42 +0200 Subject: [PATCH 15/16] Reformat --- src/nhs_neighbor_lists.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nhs_neighbor_lists.jl b/src/nhs_neighbor_lists.jl index 4d04157..e3bfda5 100644 --- a/src/nhs_neighbor_lists.jl +++ b/src/nhs_neighbor_lists.jl @@ -41,8 +41,8 @@ struct NeighborListsNeighborhoodSearch{NDIMS, NHS, NL, PB} periodic_box_min_corner = nothing, periodic_box_max_corner = nothing, backend = VectorOfVectors{Int32}) where { - NDIMS - } + NDIMS + } nhs = GridNeighborhoodSearch{NDIMS}(search_radius, n_particles, periodic_box_min_corner = periodic_box_min_corner, periodic_box_max_corner = periodic_box_max_corner) From ac18b79662422ef422e8ba1a336d16ca05bd3616 Mon Sep 17 00:00:00 2001 From: Erik Faulhaber <44124897+efaulhaber@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:35:28 +0200 Subject: [PATCH 16/16] Reformat again --- test/neighborhood_search.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/neighborhood_search.jl b/test/neighborhood_search.jl index 6961217..2483f78 100644 --- a/test/neighborhood_search.jl +++ b/test/neighborhood_search.jl @@ -51,7 +51,7 @@ NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles, periodic_box_min_corner = periodic_boxes[i][1], periodic_box_max_corner = periodic_boxes[i][2], - backend=Vector{Vector{Int32}}), + backend = Vector{Vector{Int32}}), ] neighborhood_searches_names = [ "`TrivialNeighborhoodSearch`", @@ -125,7 +125,7 @@ GridNeighborhoodSearch{NDIMS}(search_radius, n_particles), NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles), NeighborListsNeighborhoodSearch{NDIMS}(search_radius, n_particles, - backend=Vector{Vector{Int32}}), + backend = Vector{Vector{Int32}}), ] neighborhood_searches_names = [