Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
SWIFTsim
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
SWIFT
SWIFTsim
Commits
6c67b9a4
Commit
6c67b9a4
authored
7 years ago
by
James Willis
Browse files
Options
Downloads
Patches
Plain Diff
New script to compare particle neighbour lists when running swift in debug interactions mode.
parent
242d5a4c
Branches
Branches containing commit
Tags
Tags containing commit
1 merge request
!443
Debug interactions
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
examples/EAGLE_12/check_ngbs.py
+248
-0
248 additions, 0 deletions
examples/EAGLE_12/check_ngbs.py
with
248 additions
and
0 deletions
examples/EAGLE_12/check_ngbs.py
0 → 100644
+
248
−
0
View file @
6c67b9a4
import
h5py
as
h
import
numpy
as
np
import
matplotlib
matplotlib
.
use
(
"
Agg
"
)
from
pylab
import
*
import
os.path
kernel_gamma
=
1.825742
kernel_gamma2
=
kernel_gamma
*
kernel_gamma
kernel_gamma_dim
=
np
.
power
(
kernel_gamma
,
3
)
hydro_dimension_unit_sphere
=
4.
*
np
.
pi
/
3.
kernel_norm
=
hydro_dimension_unit_sphere
*
kernel_gamma_dim
error
=
False
inputFile1
=
""
inputFile2
=
""
# Check list of density neighbours and check that they are correct.
def
check_density_neighbours
(
pids
,
ngb_ids_naive
,
ngb_ids_sort
,
mask
,
pos
,
h
,
num_invalid
,
acc
):
error_val
=
False
for
k
in
range
(
0
,
num_invalid
):
# Filter neighbour lists for valid particle ids
filter_neigh_naive
=
[
i
for
i
in
ngb_ids_naive
[
mask
][
k
]
if
i
>
-
1
]
filter_neigh_sort
=
[
i
for
i
in
ngb_ids_sort
[
mask
][
k
]
if
i
>
-
1
]
# Check neighbour lists for differences
id_list
=
set
(
filter_neigh_naive
).
symmetric_difference
(
set
(
filter_neigh_sort
))
pid
=
pids
[
mask
][
k
]
# Loop over discrepancies and check if they are actually neighbours
for
pjd
in
id_list
:
pi_pos
=
pos
[
np
.
where
(
pids
==
pid
)]
pj_pos
=
pos
[
np
.
where
(
pids
==
pjd
)]
hi
=
h
[
np
.
where
(
pids
==
pid
)]
dx
=
pi_pos
[
0
][
0
]
-
pj_pos
[
0
][
0
]
dy
=
pi_pos
[
0
][
1
]
-
pj_pos
[
0
][
1
]
dz
=
pi_pos
[
0
][
2
]
-
pj_pos
[
0
][
2
]
r2
=
dx
*
dx
+
dy
*
dy
+
dz
*
dz
hig2
=
hi
*
hi
*
kernel_gamma2
diff
=
abs
(
r2
-
hig2
)
print
"
Particle {} is missing {}, hig2: {}, r2: {}, |r2 - hig2|: {}
"
.
format
(
pid
,
pjd
,
hig2
,
r2
,
diff
)
if
diff
<
acc
*
hig2
:
print
"
Missing interaction due to precision issue will be ignored.
"
else
:
error_val
=
True
return
error_val
# Check list of force neighbours and check that they are correct.
def
check_force_neighbours
(
pids
,
ngb_ids_naive
,
ngb_ids_sort
,
mask
,
pos
,
h
,
num_invalid
,
acc
):
error_val
=
False
for
k
in
range
(
0
,
num_invalid
):
# Filter neighbour lists for valid particle ids
filter_neigh_naive
=
[
i
for
i
in
ngb_ids_naive
[
mask
][
k
]
if
i
>
-
1
]
filter_neigh_sort
=
[
i
for
i
in
ngb_ids_sort
[
mask
][
k
]
if
i
>
-
1
]
# Check neighbour lists for differences
id_list
=
set
(
filter_neigh_naive
).
symmetric_difference
(
set
(
filter_neigh_sort
))
pid
=
pids
[
mask
][
k
]
# Loop over discrepancies and check if they are actually neighbours
for
pjd
in
id_list
:
pi_pos
=
pos
[
np
.
where
(
pids
==
pid
)]
pj_pos
=
pos
[
np
.
where
(
pids
==
pjd
)]
hi
=
h
[
np
.
where
(
pids
==
pid
)]
hj
=
h
[
np
.
where
(
pids
==
pjd
)]
dx
=
pi_pos
[
0
][
0
]
-
pj_pos
[
0
][
0
]
dy
=
pi_pos
[
0
][
1
]
-
pj_pos
[
0
][
1
]
dz
=
pi_pos
[
0
][
2
]
-
pj_pos
[
0
][
2
]
r2
=
dx
*
dx
+
dy
*
dy
+
dz
*
dz
hig2
=
hi
*
hi
*
kernel_gamma2
hjg2
=
hj
*
hj
*
kernel_gamma2
diff
=
abs
(
r2
-
max
(
hig2
,
hjg2
))
print
"
Particle {} is missing {}, hig2: {}, hjg2: {}, r2: {}, |r2 - max(hig2,hjg2)|: {}
"
.
format
(
pid
,
pjd
,
hig2
,
hjg2
,
r2
,
diff
)
if
diff
<
acc
*
max
(
hig2
,
hjg2
):
print
"
Missing interaction due to precision issue will be ignored.
"
else
:
error_val
=
True
return
error_val
# Parse command line arguments
if
len
(
sys
.
argv
)
<
3
:
print
"
Error: pass input files as arguments
"
sys
.
exit
()
else
:
inputFile1
=
sys
.
argv
[
1
]
inputFile2
=
sys
.
argv
[
2
]
if
os
.
path
.
exists
(
inputFile1
)
!=
1
:
print
"
\n
{} does not exist!
\n
"
.
format
(
inputFile1
)
sys
.
exit
()
if
os
.
path
.
exists
(
inputFile2
)
!=
1
:
print
"
\n
{} does not exist!
\n
"
.
format
(
inputFile2
)
sys
.
exit
()
# Open input files
file_naive
=
h
.
File
(
inputFile1
,
"
r
"
)
file_sort
=
h
.
File
(
inputFile2
,
"
r
"
)
# Read input file fields
ids_naive
=
file_naive
[
"
/PartType0/ParticleIDs
"
][:]
ids_sort
=
file_sort
[
"
/PartType0/ParticleIDs
"
][:]
h_naive
=
file_naive
[
"
/PartType0/SmoothingLength
"
][:]
h_sort
=
file_sort
[
"
/PartType0/SmoothingLength
"
][:]
pos_naive
=
file_naive
[
"
/PartType0/Coordinates
"
][:,:]
pos_sort
=
file_sort
[
"
/PartType0/Coordinates
"
][:,:]
num_density_naive
=
file_naive
[
"
/PartType0/Num_ngb_density
"
][:]
num_density_sort
=
file_sort
[
"
/PartType0/Num_ngb_density
"
][:]
num_force_naive
=
file_naive
[
"
/PartType0/Num_ngb_force
"
][:]
num_force_sort
=
file_sort
[
"
/PartType0/Num_ngb_force
"
][:]
neighbour_ids_density_naive
=
file_naive
[
"
/PartType0/Ids_ngb_density
"
][:]
neighbour_ids_density_sort
=
file_sort
[
"
/PartType0/Ids_ngb_density
"
][:]
neighbour_ids_force_naive
=
file_naive
[
"
/PartType0/Ids_ngb_force
"
][:]
neighbour_ids_force_sort
=
file_sort
[
"
/PartType0/Ids_ngb_force
"
][:]
#wcount_naive = file_naive["/PartType0/Wcount"][:]
#wcount_sort = file_sort["/PartType0/Wcount"][:]
#
#wcount_naive = wcount_naive * np.power(h_naive,3) * kernel_norm
#wcount_sort = wcount_sort * np.power(h_sort,3) * kernel_norm
# Cross check
print
"
Min Mean Max
"
print
"
---------------------
"
print
"
Ngbs density naiv:
"
,
np
.
min
(
num_density_naive
),
np
.
mean
(
num_density_naive
),
np
.
max
(
num_density_naive
)
print
"
Ngbs density sort:
"
,
np
.
min
(
num_density_sort
),
np
.
mean
(
num_density_sort
),
np
.
max
(
num_density_sort
)
print
"
Ngbs force naiv:
"
,
np
.
min
(
num_force_naive
),
np
.
mean
(
num_force_naive
),
np
.
max
(
num_force_naive
)
print
"
Ngbs force sort:
"
,
np
.
min
(
num_force_sort
),
np
.
mean
(
num_force_sort
),
np
.
max
(
num_force_sort
)
#print "Wcount naiv: ", np.min(wcount_naive), np.mean(wcount_naive), np.max(wcount_naive)
#print "Wcount sort: ", np.min(wcount_sort), np.mean(wcount_sort), np.max(wcount_sort)
# Sort
index_naive
=
np
.
argsort
(
ids_naive
)
index_sort
=
np
.
argsort
(
ids_sort
)
num_density_naive
=
num_density_naive
[
index_naive
]
num_density_sort
=
num_density_sort
[
index_sort
]
num_force_naive
=
num_force_naive
[
index_naive
]
num_force_sort
=
num_force_sort
[
index_sort
]
ids_naive
=
ids_naive
[
index_naive
]
ids_sort
=
ids_sort
[
index_sort
]
neighbour_ids_density_naive
=
neighbour_ids_density_naive
[
index_naive
]
neighbour_ids_density_sort
=
neighbour_ids_density_sort
[
index_sort
]
neighbour_ids_force_naive
=
neighbour_ids_force_naive
[
index_naive
]
neighbour_ids_force_sort
=
neighbour_ids_force_sort
[
index_sort
]
#wcount_naive = wcount_naive[index_naive]
#wcount_sort = wcount_sort[index_sort]
h_naive
=
h_naive
[
index_naive
]
h_sort
=
h_sort
[
index_sort
]
pos_naive
=
pos_naive
[
index_naive
]
pos_sort
=
pos_sort
[
index_sort
]
# First check
print
"
\n
Min Max
"
print
"
----------
"
print
"
Differences for density:
"
,
min
(
num_density_naive
-
num_density_sort
),
max
(
num_density_naive
-
num_density_sort
)
print
"
Differences for force:
"
,
min
(
num_force_naive
-
num_force_sort
),
max
(
num_force_naive
-
num_force_sort
)
# Get the IDs that are different
mask_density
=
num_density_naive
!=
num_density_sort
mask_force
=
num_force_naive
!=
num_force_sort
num_invalid_density
=
np
.
sum
(
mask_density
)
num_invalid_force
=
np
.
sum
(
mask_force
)
print
"
\n
Num non-zero density:
"
,
num_invalid_density
print
"
Num non-zero force:
"
,
num_invalid_force
print
"
\n
Particle IDs with incorrect densities
"
print
"
----------------------------------------
"
print
ids_naive
[
mask_density
]
# Check density neighbour lists
error
+=
check_density_neighbours
(
ids_naive
,
neighbour_ids_density_naive
,
neighbour_ids_density_sort
,
mask_density
,
pos_naive
,
h_naive
,
num_invalid_density
,
2e-6
)
print
"
Num of density interactions
"
,
inputFile1
print
num_density_naive
[
mask_density
]
print
"
Num of density interactions
"
,
inputFile2
print
num_density_sort
[
mask_density
]
print
"
\n
Particle IDs with incorrect forces
"
print
"
------------------------------------
"
print
ids_naive
[
mask_force
]
# Check force neighbour lists
error
+=
check_force_neighbours
(
ids_naive
,
neighbour_ids_force_naive
,
neighbour_ids_force_sort
,
mask_force
,
pos_naive
,
h_naive
,
num_invalid_force
,
2e-6
)
print
"
Num of force interactions
"
,
inputFile1
print
num_force_naive
[
mask_force
]
#print "Smoothing lengths", inputFile1
#print h_naive[mask_force]
print
"
Num of force interactions
"
,
inputFile2
print
num_force_sort
[
mask_force
]
#print "Smoothing lengths", inputFile2
#print h_sort[mask_force]
# Statistics of h difference
h_relative
=
(
h_naive
-
h_sort
)
/
h_naive
print
"
h statistics: {} {} (Min, 1st Percentile)
"
.
format
(
np
.
min
(
h_relative
),
np
.
percentile
(
h_relative
,
1
))
print
"
h statistics: {} {} (Mean, Median)
"
.
format
(
np
.
mean
(
h_relative
),
np
.
median
(
h_relative
))
print
"
h statistics: {} {} (Max, 99th Percentile)
"
.
format
(
np
.
max
(
h_relative
),
np
.
percentile
(
h_relative
,
99
))
if
error
:
print
"
\n
------------------
"
print
"
Differences found.
"
print
"
------------------
"
exit
(
1
)
else
:
print
"
\n
---------------------
"
print
"
No differences found.
"
print
"
---------------------
"
exit
(
0
)
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment