-
Notifications
You must be signed in to change notification settings - Fork 18
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
Switch particle storage to struct of array #195
Conversation
src/core/src/sys/config/particles.rs
Outdated
/// Particle velocity, if needed | ||
pub velocity: Vector3D, | ||
#[allow(missing_docs)] | ||
mod derive { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it mandatory to put the struct into an own module here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not at all, but it is the only way I found to use the #[allow(missing_docs)]
here. I'll check if it is still necessary.
Nice work! I really like that we can use exactly those fields in a particle that are needed within the given context. Sure, it is a bit less convenient to use.
Would you provide functions that yield iterators that zip commonly used fields or would every user be responsible zipping what they need? Say, e.g. I'd implement a loop that needs positions and velocities, I'd zip them together? |
I think I'll go with the user zipping what they need for now. Having convenience methods can be interesting, but we need to pick which fields are available and which one are not. I am also a bit afraid of combinatorial explosion of methods here. My ideal interface here would be something like this: for (mass, position, velocity) in system.get((&Mass, &mut Position, &Velocity)) {
position += mass * velocity / WHATEVER;
} where we can easily specify what we want and how we need it. But making this syntax work with the borrow checker might be very hard, or even impossible: we need to prove to the compiler that |
Actually, I might be able to work around this by generating the corresponding code (for all permutations of all combination of all fields with and without a mutable reference ^^) in soa-derive. I'll give it a look =) |
So I implemented this in soa-derive (see the zip branch), and the API is a bit better. See for example the corresponding test. The strategy I took was to implement a given trait for all combination of 1, 2, 3, 4, 5, 6 and 7 fields, with all possible
We could use this solution, but we need to pick which fields (4 maximum) are allowed in a zip. I think we need at least mass, position and velocity. This solution also does not yet support 'external data', i.e. adding an iterator from a vector not in the ParticleVec to the zip. I also pushed a different solution, with a very convoluted macro (c8e60eb) that works a bit like the izip! macro. I am not really convinced by this solution, as it does still require to introduce new scopes to deal with borrowing issues. But it easily supports external data. Here is a comparison of the solutions: // current version
impl Control for RemoveRotation {
fn control(&mut self, system: &mut System) {
let com = system.center_of_mass();
let mut moment = Vector3D::zero();
let mut inertia = Matrix3::zero();
{
let masses = system.particles().mass;
let positions = system.particles().position;
let velocities = system.particles().velocity;
for (&mass, position, velocity) in izip!(masses, positions, velocities) {
let delta = position - com;
moment += mass * (delta ^ velocity);
inertia += - mass * delta.tensorial(&delta);
}
}
let trace = inertia.trace();
inertia[(0, 0)] += trace;
inertia[(1, 1)] += trace;
inertia[(2, 2)] += trace;
let angular = inertia.inverse() * moment;
let particles = system.particles_mut();
let positions = &*particles.position;
let velocities = particles.velocity;
for (position, velocity) in izip!(positions, velocities) {
*velocity -= (position - com) ^ angular;
}
}
} // with particles_zip!
impl Control for RemoveRotation {
fn control(&mut self, system: &mut System) {
let com = system.center_of_mass();
let mut moment = Vector3D::zero();
let mut inertia = Matrix3::zero();
{
let particles = system.particles();
for (&mass, position, velocity) in particles_zip!(particles, &Mass, &Position, &Velocity) {
let delta = position - com;
moment += mass * (delta ^ velocity);
inertia += - mass * delta.tensorial(&delta);
}
}
let trace = inertia.trace();
inertia[(0, 0)] += trace;
inertia[(1, 1)] += trace;
inertia[(2, 2)] += trace;
let angular = inertia.inverse() * moment;
let particles = system.particles_mut();
for (position, velocity) in particles_zip!(particles, &Position, &mut Velocity) {
*velocity -= (position - com) ^ angular;
}
}
} // with soa-derive zip
impl Control for RemoveRotation {
fn control(&mut self, system: &mut System) {
let com = system.center_of_mass();
let mut moment = Vector3D::zero();
let mut inertia = Matrix3::zero();
for (&mass, position, velocity) in system.particles().zip(&Mass, &Position, &Velocity) {
let delta = position - com;
moment += mass * (delta ^ velocity);
inertia += - mass * delta.tensorial(&delta);
}
let trace = inertia.trace();
inertia[(0, 0)] += trace;
inertia[(1, 1)] += trace;
inertia[(2, 2)] += trace;
let angular = inertia.inverse() * moment;
for (position, velocity) in system.particles_mut().zip_mut(&Position, &mut Velocity) {
*velocity -= (position - com) ^ angular;
}
}
} What do you think of all this ? |
(travis failure is due to https://github.com/azerupi/mdBook/issues/416, and us not having done #193 yet 😄) |
Looking at the APIs, the SoA-derive feels like the cleanest option but the implementation is an issue. But I could also live with the current implementation even though we need to write a bit more code (and the What do you prefer? |
There is no need to have getter and setter if they are not enforcing an invariant
The `Alternator` code is tested in the related file
The izip! macro will be useful
This uses the soa_derive crate to automatically derive all the needed methods from the struct definition.
Sorry, I though I answered that. I prefer the Let's check Travis and run some benchmarks. |
Comparing to master ()using ddae811 Switch the particle storage to struct of arrays
name .txt ns/iter ddae811d.txt ns/iter diff ns/iter diff % speedup
argon::cache_move_particle 354,829 (+/- 4264) 367,438 (+/- 4917) 12,609 3.55% x 0.97
argon::energy 298,992 (+/- 25064) 288,445 (+/- 17467) -10,547 -3.53% x 1.04
nacl::cache_move_particle_wolf 94,530 (+/- 119583) 91,542 (+/- 118946) -2,988 -3.16% x 1.03
nacl::energy_wolf 92,424 (+/- 8407) 102,441 (+/- 3418) 10,017 10.84% x 0.90
nacl::virial_ewald 8,315,287 (+/- 1716617) 8,131,541 (+/- 2162340) -183,746 -2.21% x 1.02
nacl::virial_wolf 109,742 (+/- 9644) 113,114 (+/- 11776) 3,372 3.07% x 0.97
propane::cache_move_particles 462,847 (+/- 4746) 428,097 (+/- 5757) -34,750 -7.51% x 1.08
water::cache_move_all_rigid_molecules_wolf 9,662,817 (+/- 7264180) 10,771,353 (+/- 5145624) 1,108,536 11.47% x 0.90
water::cache_move_particles_wolf 621,728 (+/- 299477) 424,201 (+/- 86380) -197,527 -31.77% x 1.47
water::virial_ewald 12,012,884 (+/- 2539845) 13,500,396 (+/- 2111133) 1,487,512 12.38% x 0.89
f62e90a Add an explicit dependency on itertools
name .txt ns/iter f62e90a8.txt ns/iter diff ns/iter diff % speedup
argon::energy 298,992 (+/- 25064) 291,905 (+/- 33549) -7,087 -2.37% x 1.02
nacl::cache_move_particle_wolf 94,530 (+/- 119583) 90,641 (+/- 21128) -3,889 -4.11% x 1.04
nacl::energy_wolf 92,424 (+/- 8407) 86,575 (+/- 1719) -5,849 -6.33% x 1.07
nacl::virial_ewald 8,315,287 (+/- 1716617) 8,066,196 (+/- 2132177) -249,091 -3.00% x 1.03
nacl::virial_wolf 109,742 (+/- 9644) 120,207 (+/- 1811) 10,465 9.54% x 0.91
water::cache_move_all_rigid_molecules_wolf 9,662,817 (+/- 7264180) 7,656,349 (+/- 5564389) -2,006,468 -20.76% x 1.26
water::cache_move_particles_wolf 621,728 (+/- 299477) 589,038 (+/- 258589) -32,690 -5.26% x 1.06
water::energy_ewald 1,292,118 (+/- 132429) 3,038,714 (+/- 1747773) 1,746,596 135.17% x 0.43
water::virial_ewald 12,012,884 (+/- 2539845) 13,049,924 (+/- 2679815) 1,037,040 8.63% x 0.92
water::virial_wolf 162,176 (+/- 2857) 151,251 (+/- 15454) -10,925 -6.74% x 1.07
ceaaf17 Only test control in controls unit tests
name .txt ns/iter ceaaf17a.txt ns/iter diff ns/iter diff % speedup
argon::cache_move_particle 354,829 (+/- 4264) 365,509 (+/- 12248) 10,680 3.01% x 0.97
argon::energy 298,992 (+/- 25064) 288,310 (+/- 5561) -10,682 -3.57% x 1.04
nacl::cache_move_particle_wolf 94,530 (+/- 119583) 90,461 (+/- 7157) -4,069 -4.30% x 1.04
nacl::energy_wolf 92,424 (+/- 8407) 88,482 (+/- 6585) -3,942 -4.27% x 1.04
nacl::virial_wolf 109,742 (+/- 9644) 121,305 (+/- 22574) 11,563 10.54% x 0.90
water::cache_move_particles_wolf 621,728 (+/- 299477) 731,623 (+/- 380783) 109,895 17.68% x 0.85
water::virial_ewald 12,012,884 (+/- 2539845) 13,665,800 (+/- 2625751) 1,652,916 13.76% x 0.88
3a0ba57 Implement XxxAssign operators for Complex
name .txt ns/iter 3a0ba573.txt ns/iter diff ns/iter diff % speedup
argon::energy 298,992 (+/- 25064) 273,658 (+/- 25912) -25,334 -8.47% x 1.09
nacl::cache_move_particle_wolf 94,530 (+/- 119583) 89,335 (+/- 7490) -5,195 -5.50% x 1.06
nacl::virial_ewald 8,315,287 (+/- 1716617) 8,617,827 (+/- 2431884) 302,540 3.64% x 0.96
nacl::virial_wolf 109,742 (+/- 9644) 122,704 (+/- 45964) 12,962 11.81% x 0.89
water::cache_move_all_rigid_molecules_wolf 9,662,817 (+/- 7264180) 8,440,412 (+/- 7441354) -1,222,405 -12.65% x 1.14
water::cache_move_particles_wolf 621,728 (+/- 299477) 388,350 (+/- 29642) -233,378 -37.54% x 1.60
water::virial_ewald 12,012,884 (+/- 2539845) 13,593,811 (+/- 2455071) 1,580,927 13.16% x 0.88
8e92ae5 Make Particle::name public
name .txt ns/iter 8e92ae56.txt ns/iter diff ns/iter diff % speedup
argon::cache_move_particle 354,829 (+/- 4264) 365,394 (+/- 15389) 10,565 2.98% x 0.97
argon::energy 298,992 (+/- 25064) 290,505 (+/- 8332) -8,487 -2.84% x 1.03
argon::virial 354,986 (+/- 23800) 331,914 (+/- 45790) -23,072 -6.50% x 1.07
nacl::cache_move_particle_wolf 94,530 (+/- 119583) 88,871 (+/- 4382) -5,659 -5.99% x 1.06
nacl::virial_ewald 8,315,287 (+/- 1716617) 8,007,878 (+/- 1883087) -307,409 -3.70% x 1.04
water::cache_move_all_rigid_molecules_wolf 9,662,817 (+/- 7264180) 8,516,182 (+/- 6693782) -1,146,635 -11.87% x 1.13
water::cache_move_particles_wolf 621,728 (+/- 299477) 435,408 (+/- 96376) -186,320 -29.97% x 1.43
water::virial_ewald 12,012,884 (+/- 2539845) 12,578,293 (+/- 2677974) 565,409 4.71% x 0.96
bbecbcc More warning fixes
name .txt ns/iter bbecbccf.txt ns/iter diff ns/iter diff % speedup
nacl::cache_move_particle_wolf 94,530 (+/- 119583) 89,467 (+/- 8470) -5,063 -5.36% x 1.06
nacl::virial_ewald 8,315,287 (+/- 1716617) 7,992,590 (+/- 2010687) -322,697 -3.88% x 1.04
nacl::virial_wolf 109,742 (+/- 9644) 102,578 (+/- 18642) -7,164 -6.53% x 1.07
water::cache_move_all_rigid_molecules_wolf 9,662,817 (+/- 7264180) 9,215,829 (+/- 6561096) -446,988 -4.63% x 1.05
water::cache_move_particles_ewald 643,034 (+/- 32994) 664,245 (+/- 45477) 21,211 3.30% x 0.97
water::cache_move_particles_wolf 621,728 (+/- 299477) 723,156 (+/- 566242) 101,428 16.31% x 0.86
water::virial_ewald 12,012,884 (+/- 2539845) 13,772,206 (+/- 2996449) 1,759,322 14.65% x 0.87
Individual benchmarksddae811 Switch the particle storage to struct of arrays
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
running 4 tests
test argon::cache_move_particle ... bench: 367,438 ns/iter (+/- 4,917)
test argon::energy ... bench: 288,445 ns/iter (+/- 17,467)
test argon::forces ... bench: 486,827 ns/iter (+/- 8,290)
test argon::virial ... bench: 352,949 ns/iter (+/- 63,569)
test result: ok. 0 passed; 0 failed; 0 ignored; 4 measured
running 8 tests
test nacl::cache_move_particle_ewald ... bench: 286,947 ns/iter (+/- 2,523)
test nacl::cache_move_particle_wolf ... bench: 91,542 ns/iter (+/- 118,946)
test nacl::energy_ewald ... bench: 753,181 ns/iter (+/- 5,413)
test nacl::energy_wolf ... bench: 102,441 ns/iter (+/- 3,418)
test nacl::forces_ewald ... bench: 19,833,408 ns/iter (+/- 136,886)
test nacl::forces_wolf ... bench: 232,356 ns/iter (+/- 6,142)
test nacl::virial_ewald ... bench: 8,131,541 ns/iter (+/- 2,162,340)
test nacl::virial_wolf ... bench: 113,114 ns/iter (+/- 11,776)
test result: ok. 0 passed; 0 failed; 0 ignored; 8 measured
running 5 tests
test propane::cache_move_all_rigid_molecules ... bench: 1,631,436 ns/iter (+/- 23,084)
test propane::cache_move_particles ... bench: 428,097 ns/iter (+/- 5,757)
test propane::energy ... bench: 811,071 ns/iter (+/- 38,685)
test propane::forces ... bench: 1,154,272 ns/iter (+/- 68,755)
test propane::virial ... bench: 434,600 ns/iter (+/- 17,580)
test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured
running 10 tests
test water::cache_move_all_rigid_molecules_ewald ... bench: 6,033,298 ns/iter (+/- 752,905)
test water::cache_move_all_rigid_molecules_wolf ... bench: 10,771,353 ns/iter (+/- 5,145,624)
test water::cache_move_particles_ewald ... bench: 646,800 ns/iter (+/- 35,644)
test water::cache_move_particles_wolf ... bench: 424,201 ns/iter (+/- 86,380)
test water::energy_ewald ... bench: 1,277,137 ns/iter (+/- 15,186)
test water::energy_wolf ... bench: 130,557 ns/iter (+/- 3,902)
test water::forces_ewald ... bench: 26,640,074 ns/iter (+/- 415,997)
test water::forces_wolf ... bench: 283,713 ns/iter (+/- 4,917)
test water::virial_ewald ... bench: 13,500,396 ns/iter (+/- 2,111,133)
test water::virial_wolf ... bench: 162,663 ns/iter (+/- 1,715)
test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured
f62e90a Add an explicit dependency on itertools
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
running 4 tests
test argon::cache_move_particle ... bench: 355,755 ns/iter (+/- 7,246)
test argon::energy ... bench: 291,905 ns/iter (+/- 33,549)
test argon::forces ... bench: 496,406 ns/iter (+/- 33,143)
test argon::virial ... bench: 354,934 ns/iter (+/- 36,080)
test result: ok. 0 passed; 0 failed; 0 ignored; 4 measured
running 8 tests
test nacl::cache_move_particle_ewald ... bench: 292,594 ns/iter (+/- 2,144)
test nacl::cache_move_particle_wolf ... bench: 90,641 ns/iter (+/- 21,128)
test nacl::energy_ewald ... bench: 753,274 ns/iter (+/- 4,262)
test nacl::energy_wolf ... bench: 86,575 ns/iter (+/- 1,719)
test nacl::forces_ewald ... bench: 19,707,983 ns/iter (+/- 117,186)
test nacl::forces_wolf ... bench: 233,836 ns/iter (+/- 3,452)
test nacl::virial_ewald ... bench: 8,066,196 ns/iter (+/- 2,132,177)
test nacl::virial_wolf ... bench: 120,207 ns/iter (+/- 1,811)
test result: ok. 0 passed; 0 failed; 0 ignored; 8 measured
running 5 tests
test propane::cache_move_all_rigid_molecules ... bench: 1,651,927 ns/iter (+/- 13,349)
test propane::cache_move_particles ... bench: 461,878 ns/iter (+/- 4,013)
test propane::energy ... bench: 807,796 ns/iter (+/- 20,827)
test propane::forces ... bench: 1,174,780 ns/iter (+/- 56,430)
test propane::virial ... bench: 434,345 ns/iter (+/- 36,832)
test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured
running 10 tests
test water::cache_move_all_rigid_molecules_ewald ... bench: 6,021,512 ns/iter (+/- 65,862)
test water::cache_move_all_rigid_molecules_wolf ... bench: 7,656,349 ns/iter (+/- 5,564,389)
test water::cache_move_particles_ewald ... bench: 651,733 ns/iter (+/- 42,889)
test water::cache_move_particles_wolf ... bench: 589,038 ns/iter (+/- 258,589)
test water::energy_ewald ... bench: 3,038,714 ns/iter (+/- 1,747,773)
test water::energy_wolf ... bench: 131,166 ns/iter (+/- 30,091)
test water::forces_ewald ... bench: 26,474,532 ns/iter (+/- 641,494)
test water::forces_wolf ... bench: 283,267 ns/iter (+/- 5,688)
test water::virial_ewald ... bench: 13,049,924 ns/iter (+/- 2,679,815)
test water::virial_wolf ... bench: 151,251 ns/iter (+/- 15,454)
test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured
ceaaf17 Only test control in controls unit tests
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
running 4 tests
test argon::cache_move_particle ... bench: 365,509 ns/iter (+/- 12,248)
test argon::energy ... bench: 288,310 ns/iter (+/- 5,561)
test argon::forces ... bench: 489,540 ns/iter (+/- 52,380)
test argon::virial ... bench: 354,530 ns/iter (+/- 30,870)
test result: ok. 0 passed; 0 failed; 0 ignored; 4 measured
running 8 tests
test nacl::cache_move_particle_ewald ... bench: 292,435 ns/iter (+/- 2,097)
test nacl::cache_move_particle_wolf ... bench: 90,461 ns/iter (+/- 7,157)
test nacl::energy_ewald ... bench: 752,368 ns/iter (+/- 8,824)
test nacl::energy_wolf ... bench: 88,482 ns/iter (+/- 6,585)
test nacl::forces_ewald ... bench: 19,710,197 ns/iter (+/- 109,878)
test nacl::forces_wolf ... bench: 232,517 ns/iter (+/- 2,994)
test nacl::virial_ewald ... bench: 8,190,099 ns/iter (+/- 1,603,839)
test nacl::virial_wolf ... bench: 121,305 ns/iter (+/- 22,574)
test result: ok. 0 passed; 0 failed; 0 ignored; 8 measured
running 5 tests
test propane::cache_move_all_rigid_molecules ... bench: 1,650,657 ns/iter (+/- 6,699)
test propane::cache_move_particles ... bench: 460,538 ns/iter (+/- 5,813)
test propane::energy ... bench: 810,931 ns/iter (+/- 63,504)
test propane::forces ... bench: 1,181,854 ns/iter (+/- 72,554)
test propane::virial ... bench: 433,471 ns/iter (+/- 10,660)
test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured
running 10 tests
test water::cache_move_all_rigid_molecules_ewald ... bench: 6,022,486 ns/iter (+/- 49,339)
test water::cache_move_all_rigid_molecules_wolf ... bench: 9,581,275 ns/iter (+/- 6,340,907)
test water::cache_move_particles_ewald ... bench: 653,222 ns/iter (+/- 32,995)
test water::cache_move_particles_wolf ... bench: 731,623 ns/iter (+/- 380,783)
test water::energy_ewald ... bench: 1,292,130 ns/iter (+/- 7,503)
test water::energy_wolf ... bench: 130,757 ns/iter (+/- 3,661)
test water::forces_ewald ... bench: 26,492,568 ns/iter (+/- 198,111)
test water::forces_wolf ... bench: 285,751 ns/iter (+/- 178,509)
test water::virial_ewald ... bench: 13,665,800 ns/iter (+/- 2,625,751)
test water::virial_wolf ... bench: 162,395 ns/iter (+/- 1,571)
test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured
3a0ba57 Implement XxxAssign operators for Complex
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
running 4 tests
test argon::cache_move_particle ... bench: 352,307 ns/iter (+/- 5,957)
test argon::energy ... bench: 273,658 ns/iter (+/- 25,912)
test argon::forces ... bench: 492,495 ns/iter (+/- 53,803)
test argon::virial ... bench: 350,310 ns/iter (+/- 7,324)
test result: ok. 0 passed; 0 failed; 0 ignored; 4 measured
running 8 tests
test nacl::cache_move_particle_ewald ... bench: 292,359 ns/iter (+/- 1,459)
test nacl::cache_move_particle_wolf ... bench: 89,335 ns/iter (+/- 7,490)
test nacl::energy_ewald ... bench: 752,521 ns/iter (+/- 5,490)
test nacl::energy_wolf ... bench: 92,727 ns/iter (+/- 8,707)
test nacl::forces_ewald ... bench: 19,718,349 ns/iter (+/- 257,483)
test nacl::forces_wolf ... bench: 232,484 ns/iter (+/- 3,731)
test nacl::virial_ewald ... bench: 8,617,827 ns/iter (+/- 2,431,884)
test nacl::virial_wolf ... bench: 122,704 ns/iter (+/- 45,964)
test result: ok. 0 passed; 0 failed; 0 ignored; 8 measured
running 5 tests
test propane::cache_move_all_rigid_molecules ... bench: 1,650,354 ns/iter (+/- 12,964)
test propane::cache_move_particles ... bench: 460,807 ns/iter (+/- 4,304)
test propane::energy ... bench: 818,578 ns/iter (+/- 13,375)
test propane::forces ... bench: 1,165,934 ns/iter (+/- 70,580)
test propane::virial ... bench: 435,175 ns/iter (+/- 11,749)
test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured
running 10 tests
test water::cache_move_all_rigid_molecules_ewald ... bench: 6,023,303 ns/iter (+/- 72,095)
test water::cache_move_all_rigid_molecules_wolf ... bench: 8,440,412 ns/iter (+/- 7,441,354)
test water::cache_move_particles_ewald ... bench: 654,515 ns/iter (+/- 19,616)
test water::cache_move_particles_wolf ... bench: 388,350 ns/iter (+/- 29,642)
test water::energy_ewald ... bench: 1,291,802 ns/iter (+/- 8,210)
test water::energy_wolf ... bench: 132,346 ns/iter (+/- 11,142)
test water::forces_ewald ... bench: 26,474,894 ns/iter (+/- 148,033)
test water::forces_wolf ... bench: 282,849 ns/iter (+/- 29,313)
test water::virial_ewald ... bench: 13,593,811 ns/iter (+/- 2,455,071)
test water::virial_wolf ... bench: 162,994 ns/iter (+/- 34,517)
test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured
8e92ae5 Make Particle::name public
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
running 4 tests
test argon::cache_move_particle ... bench: 365,394 ns/iter (+/- 15,389)
test argon::energy ... bench: 290,505 ns/iter (+/- 8,332)
test argon::forces ... bench: 491,462 ns/iter (+/- 8,169)
test argon::virial ... bench: 331,914 ns/iter (+/- 45,790)
test result: ok. 0 passed; 0 failed; 0 ignored; 4 measured
running 8 tests
test nacl::cache_move_particle_ewald ... bench: 292,879 ns/iter (+/- 3,007)
test nacl::cache_move_particle_wolf ... bench: 88,871 ns/iter (+/- 4,382)
test nacl::energy_ewald ... bench: 752,423 ns/iter (+/- 5,824)
test nacl::energy_wolf ... bench: 94,129 ns/iter (+/- 3,556)
test nacl::forces_ewald ... bench: 19,710,033 ns/iter (+/- 339,744)
test nacl::forces_wolf ... bench: 235,989 ns/iter (+/- 19,887)
test nacl::virial_ewald ... bench: 8,007,878 ns/iter (+/- 1,883,087)
test nacl::virial_wolf ... bench: 110,473 ns/iter (+/- 9,583)
test result: ok. 0 passed; 0 failed; 0 ignored; 8 measured
running 5 tests
test propane::cache_move_all_rigid_molecules ... bench: 1,655,184 ns/iter (+/- 51,491)
test propane::cache_move_particles ... bench: 462,868 ns/iter (+/- 5,826)
test propane::energy ... bench: 812,004 ns/iter (+/- 18,580)
test propane::forces ... bench: 1,181,257 ns/iter (+/- 82,243)
test propane::virial ... bench: 441,117 ns/iter (+/- 136,669)
test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured
running 10 tests
test water::cache_move_all_rigid_molecules_ewald ... bench: 6,019,926 ns/iter (+/- 25,993)
test water::cache_move_all_rigid_molecules_wolf ... bench: 8,516,182 ns/iter (+/- 6,693,782)
test water::cache_move_particles_ewald ... bench: 653,222 ns/iter (+/- 37,403)
test water::cache_move_particles_wolf ... bench: 435,408 ns/iter (+/- 96,376)
test water::energy_ewald ... bench: 1,292,020 ns/iter (+/- 14,330)
test water::energy_wolf ... bench: 131,346 ns/iter (+/- 6,517)
test water::forces_ewald ... bench: 26,475,416 ns/iter (+/- 137,135)
test water::forces_wolf ... bench: 281,017 ns/iter (+/- 7,302)
test water::virial_ewald ... bench: 12,578,293 ns/iter (+/- 2,677,974)
test water::virial_wolf ... bench: 162,966 ns/iter (+/- 3,207)
test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured
bbecbcc More warning fixes
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
running 4 tests
test argon::cache_move_particle ... bench: 354,066 ns/iter (+/- 3,740)
test argon::energy ... bench: 295,121 ns/iter (+/- 33,354)
test argon::forces ... bench: 490,970 ns/iter (+/- 5,761)
test argon::virial ... bench: 356,582 ns/iter (+/- 89,253)
test result: ok. 0 passed; 0 failed; 0 ignored; 4 measured
running 8 tests
test nacl::cache_move_particle_ewald ... bench: 292,595 ns/iter (+/- 2,447)
test nacl::cache_move_particle_wolf ... bench: 89,467 ns/iter (+/- 8,470)
test nacl::energy_ewald ... bench: 751,981 ns/iter (+/- 4,304)
test nacl::energy_wolf ... bench: 92,182 ns/iter (+/- 16,671)
test nacl::forces_ewald ... bench: 19,713,913 ns/iter (+/- 359,656)
test nacl::forces_wolf ... bench: 233,041 ns/iter (+/- 3,414)
test nacl::virial_ewald ... bench: 7,992,590 ns/iter (+/- 2,010,687)
test nacl::virial_wolf ... bench: 102,578 ns/iter (+/- 18,642)
test result: ok. 0 passed; 0 failed; 0 ignored; 8 measured
running 5 tests
test propane::cache_move_all_rigid_molecules ... bench: 1,653,461 ns/iter (+/- 7,408)
test propane::cache_move_particles ... bench: 462,897 ns/iter (+/- 9,742)
test propane::energy ... bench: 822,915 ns/iter (+/- 52,048)
test propane::forces ... bench: 1,157,835 ns/iter (+/- 83,143)
test propane::virial ... bench: 434,512 ns/iter (+/- 11,048)
test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured
running 10 tests
test water::cache_move_all_rigid_molecules_ewald ... bench: 6,036,379 ns/iter (+/- 751,510)
test water::cache_move_all_rigid_molecules_wolf ... bench: 9,215,829 ns/iter (+/- 6,561,096)
test water::cache_move_particles_ewald ... bench: 664,245 ns/iter (+/- 45,477)
test water::cache_move_particles_wolf ... bench: 723,156 ns/iter (+/- 566,242)
test water::energy_ewald ... bench: 1,291,979 ns/iter (+/- 12,113)
test water::energy_wolf ... bench: 130,688 ns/iter (+/- 6,559)
test water::forces_ewald ... bench: 26,513,173 ns/iter (+/- 201,910)
test water::forces_wolf ... bench: 283,317 ns/iter (+/- 4,529)
test water::virial_ewald ... bench: 13,772,206 ns/iter (+/- 2,996,449)
test water::virial_wolf ... bench: 163,377 ns/iter (+/- 15,300)
test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
running 4 tests
test argon::cache_move_particle ... bench: 354,829 ns/iter (+/- 4,264)
test argon::energy ... bench: 298,992 ns/iter (+/- 25,064)
test argon::forces ... bench: 491,932 ns/iter (+/- 8,903)
test argon::virial ... bench: 354,986 ns/iter (+/- 23,800)
test result: ok. 0 passed; 0 failed; 0 ignored; 4 measured
running 8 tests
test nacl::cache_move_particle_ewald ... bench: 292,761 ns/iter (+/- 2,801)
test nacl::cache_move_particle_wolf ... bench: 94,530 ns/iter (+/- 119,583)
test nacl::energy_ewald ... bench: 751,782 ns/iter (+/- 4,145)
test nacl::energy_wolf ... bench: 92,424 ns/iter (+/- 8,407)
test nacl::forces_ewald ... bench: 19,701,067 ns/iter (+/- 371,803)
test nacl::forces_wolf ... bench: 233,726 ns/iter (+/- 3,870)
test nacl::virial_ewald ... bench: 8,315,287 ns/iter (+/- 1,716,617)
test nacl::virial_wolf ... bench: 109,742 ns/iter (+/- 9,644)
test result: ok. 0 passed; 0 failed; 0 ignored; 8 measured
running 5 tests
test propane::cache_move_all_rigid_molecules ... bench: 1,653,836 ns/iter (+/- 1,657,163)
test propane::cache_move_particles ... bench: 462,847 ns/iter (+/- 4,746)
test propane::energy ... bench: 821,331 ns/iter (+/- 17,587)
test propane::forces ... bench: 1,164,685 ns/iter (+/- 71,668)
test propane::virial ... bench: 432,908 ns/iter (+/- 8,886)
test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured
running 10 tests
test water::cache_move_all_rigid_molecules_ewald ... bench: 6,041,672 ns/iter (+/- 72,893)
test water::cache_move_all_rigid_molecules_wolf ... bench: 9,662,817 ns/iter (+/- 7,264,180)
test water::cache_move_particles_ewald ... bench: 643,034 ns/iter (+/- 32,994)
test water::cache_move_particles_wolf ... bench: 621,728 ns/iter (+/- 299,477)
test water::energy_ewald ... bench: 1,292,118 ns/iter (+/- 132,429)
test water::energy_wolf ... bench: 130,115 ns/iter (+/- 7,503)
test water::forces_ewald ... bench: 26,485,075 ns/iter (+/- 318,619)
test water::forces_wolf ... bench: 281,810 ns/iter (+/- 44,562)
test water::virial_ewald ... bench: 12,012,884 ns/iter (+/- 2,539,845)
test water::virial_wolf ... bench: 162,176 ns/iter (+/- 2,857)
test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured
|
If no one disagree, I'll merge this tomorrow =) |
Fixes #18
This is a work in progress, it needs benchmarks and feedback on the API!
The meat of the code is not in this repository, but in soa-derive.
Most of the changes here consists in
system.particle(i).<xxx> => system.particles().<xxx>[i]
, or handling of the fact that when usingfor p in system.particles()
,p.position
is a reference.The main issue with the code right now is the fact that the naive looping
for p in system.particles()
might be slower than in previous versions, due to the fact that a newParticleRef
is generated at each iteration step. To improve this, I will change the code so that it usesizip!
iterators and directly access the needed fields.Please have a look and tell me what you think !