The density can be writtin in the slot normally used for Potentials (the default), or if write_at_phi=f be written to a tag named Density.
Ideally, it is best if particles are sorted by the local density itself. Since the local density is not available, the second choice is to sort particles with some quantity that has strong correlation with the local density. For example, if the potential is available, sort particles by potential.
In many cases the system is roughly spherically symmetric. That means the density has strong correlation with the distance from the center of the cluster. Then sorting particles by the distance from the center will improve the speed significantly.
snapcenter nbody.dat nbody.centered
snapsort nbody.centered nbody.sorted
hackdens nbody.sorted nbody.density
One can also weight the particles by its potential to some power. For this we create a Plummer sphere, without centering, and compute the center in two ways:
mkplummer - 100 zerocm=f | snapsort - - rank=r > p.dat
snapcenter p.dat . report=t
hackdens p.dat - | snapcenter - . weight=dens report=t
hackforce p.dat - | snapcenter - . weight="-phi*phi*phi" report=t
hackforce p.dat - | snapcenter - . weight="phi*phi*phi*phi" report=t
Note that in this case the Plummer sphere should have the correct mathematical
center, and not re-centered. This snippet of code is expanded in a script
$NEMO/scripts/csh/centering.sh, in which these different methods can also
be applied to different models, where some are expanded in the table below:
nbody=100 models: Plummer King1 King3 King5 DeVauc Dehnen
---------------------------------------------------------------------
halfmass radius: 0.769 0.427 0.418 0.408 1.3
snapcenter on m: 0.102 0.029* 0.030* 0.033 0.299 2.75
snapcenter on dens: 0.060 0.039 0.036 0.030 0.030* 0.074*
snapcenter on phi: 0.053
snapcenter on phi^2: 0.050*
snapcenter on phi^3: 0.052 0.032 0.030 0.026* 0.035 0.079
snapcenter on phi^4: 0.054 0.034 0.032 0.027 0.031 0.110
snapcenterp: 0.080
snapcenters: 0.119:
snapmnmx on min phi: 0.122
snapmnmx on m 50% phi: 0.058
snapmnmx on m 33% phi: 0.063 0.053
snapmnmx on m 25% phi: 0.067
rockstar on m: 0.082:
A (*) denotes the best method for that model. Values scale as 1/sqrt(nbody)
Although for a Plummer sphere the best method is more than twice as good than the worst method, this does not apply to other models. A normal mass-weighted centering for Dehnen and deVaucouleurs models is quite bad.
density(1falcON) is considerable faster, about twice with their K=32 default.
mkplummer - 100000 |\ snapscale - - mscale=10 |\
snapsort - - |\
density - - give=mxvr |\
snapshell - ’10**[-4:4:0.1]’ dens |\
tabmath - - ’log(%1),log(%4)’ all |\
tabplot - 1 2 -4 4 -14 2 line=1,1 point=2,0.1
vs.
mkplummer - 100000 |\ snapscale - - mscale=10 |\
snapsort - - |\
hackdens - - |\
snapshell - ’10**[-4:4:0.1]’ dens |\
tabmath - - ’log(%1),log(%4)’ all |\
tabplot - 1 2 -4 4 -14 2 line=1,1 point=2,0.1
The density in
snapdens(1NEMO)
and density(1falcON)
are in the correct units, but in
hackdens(1NEMO)
seem to be off by nbody for equal mass particles. For example,
a Plummer sphere in virial (nbody) units should have a central density
(32/(3.pi^2))^2 ~ 1.168
https://ui.adsabs.harvard.edu/abs/1985ApJ...298...80C/ - Casertano & Hut (1985)
Presorted snapshot: 5 minutes on Sun-3/60, particles are presorted by the distance from the center of mass of the system.
Random snapshot: 60 minutes
Sun-3/60
2-Dec-88 V1.0:Created Jun 6-jul-89 doc updated? Jun 23-oct-90 doc updated Peter 18-jul-92 printf -> dprintf to make it pipable Peter 24-may-02 fixed running out of bits for large-N PJT 11-aug-2022 added example hackforce vs. hackdens PJT 21-sep-2023 added direct= PJT 11-oct-2023 V3.0 added norm=1 as a new default PJT 12-oct-2023 V3.0 proper mass/nbody scaling PJT