-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathewald.rs
112 lines (94 loc) · 2.82 KB
/
ewald.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Lumol, an extensible molecular simulation engine
// Copyright (C) 2015-2016 G. Fraux — BSD license
#![feature(test)]
extern crate test;
extern crate lumol;
use lumol::sys::{System, Trajectory, UnitCell};
use lumol::energy::{Ewald, PairRestriction, CoulombicPotential};
use std::path::Path;
use std::sync::{Once, ONCE_INIT};
pub static START: Once = ONCE_INIT;
pub fn get_system(name: &str) -> System {
let data_dir = Path::new(file!()).parent().unwrap();
let configuration = data_dir.join("data").join(name);
let mut system = Trajectory::open(configuration)
.and_then(|mut traj| traj.read())
.unwrap();
let cell = if name == "NaCl.xyz" {
UnitCell::cubic(11.2804)
} else if name == "water.xyz" {
UnitCell::cubic(18.0)
} else { unreachable!() };
system.set_cell(cell);
// Use a smaller system to have faster benches and more iteration
if name == "water.xyz" {
for _ in 0..50 {
let last = system.molecules().len() - 1;
system.remove_molecule(last);
}
}
for p in &mut system {
let charge = match p.name() {
"O" => -0.82,
"H" => 0.41,
"Na" => 1.0,
"Cl" => -1.0,
_ => panic!("Missing charge value for {}", p.name())
};
p.charge = charge;
}
return system;
}
pub fn get_ewald() -> Ewald {
let mut ewald = Ewald::new(5.5, 7);
ewald.set_restriction(PairRestriction::InterMolecular);
return ewald;
}
mod nacl {
use lumol::Logger;
use lumol::energy::GlobalPotential;
use test::Bencher;
use super::*;
#[bench]
fn energy(bencher: &mut Bencher) {
START.call_once(|| {Logger::stdout();});
let system = get_system("NaCl.xyz");
let mut ewald = get_ewald();
bencher.iter(||{
let _ = ewald.energy(&system);
})
}
#[bench]
fn forces(bencher: &mut Bencher) {
START.call_once(|| {Logger::stdout();});
let system = get_system("NaCl.xyz");
let mut ewald = get_ewald();
bencher.iter(||{
let _ = ewald.forces(&system);
})
}
}
mod water {
use lumol::Logger;
use lumol::energy::GlobalPotential;
use test::Bencher;
use super::*;
#[bench]
fn energy(bencher: &mut Bencher) {
START.call_once(|| {Logger::stdout();});
let system = get_system("water.xyz");
let mut ewald = get_ewald();
bencher.iter(||{
let _ = ewald.energy(&system);
})
}
#[bench]
fn forces(bencher: &mut Bencher) {
START.call_once(|| {Logger::stdout();});
let system = get_system("water.xyz");
let mut ewald = get_ewald();
bencher.iter(||{
let _ = ewald.forces(&system);
})
}
}