Files
lj_monte_carlo/src/density_z.rs
2017-01-30 09:40:35 +01:00

97 lines
2.7 KiB
Rust

mod trajectory;
use trajectory::*;
use std::env;
fn main() {
// open file
let args: Vec<String> = env::args().collect();
let mut filename : String = "montecarlo.xyz".to_string();
let mut skip_frames : usize = 0;
let mut slabs : usize = 256;
for i in 0..args.len() {
if args[i] == "-f" {
filename = args[i+1].clone();
} else if args[i] == "-s" {
skip_frames = args[i+1].parse::<usize>().unwrap();
} else if args[i] == "--slabs" {
slabs = args[i+1].parse::<usize>().unwrap();
}
}
let mut trj_reader = TrjReader::new(&filename);
// skip some frames
println!("# Skipping {} frames.", skip_frames);
trj_reader.skip(skip_frames);
let mut frame = trj_reader.next_frame();
let slab_height = frame.box_z / slabs as f64;
let slab_volume = slab_height * frame.box_x * frame.box_y;
println!("# Density calculation with {} slabs (height={})", slabs, slab_height);
let mut slab_particles : Vec<f64> = vec![0.0; slabs];
let mut frame_count : usize = 0;
// loop over frames
loop {
frame_count += 1;
for i in 0..frame.num_particles {
let slab_no : usize = get_slab_number_for_position(frame.rz[i], slab_height) - 1;
slab_particles[slab_no] += 1.0;
}
if !trj_reader.update_with_next(&mut frame) {
break;
}
}
println!("# Averaged over {} frames", frame_count);
println!("# Position Density");
for i in 0..slab_particles.len() {
let p_max = slab_height * (i as f64 + 1.0);
let position =(p_max + p_max-slab_height) / 2.0;
let particles = slab_particles[i] / frame_count as f64;
let density = particles / slab_volume;
println!("{}\t{}\t{}", position, density, particles);
}
}
pub fn get_slab_number_for_position(z: f64, slab_height: f64) -> usize {
let mut slab = 0;
let mut z_counter = 0.0_f64;
while z_counter <= z {
z_counter += slab_height;
slab += 1;
}
return slab;
}
#[test]
fn test_get_slab_no() {
let z = 3.5;
let slab_height = 1.0;
assert_eq!(4, get_slab_number_for_position(z, slab_height));
let z = 0.0;
let slab_height = 1.0;
assert_eq!(1, get_slab_number_for_position(z, slab_height));
let z = 0.1;
let slab_height = 0.2;
assert_eq!(1, get_slab_number_for_position(z, slab_height));
let z = 0.0001;
let slab_height = 0.2;
assert_eq!(1, get_slab_number_for_position(z, slab_height));
let z = 0.19999999_f64;
let slab_height = 0.2;
assert_eq!(1, get_slab_number_for_position(z, slab_height));
let z = 1.0;
let slab_height = 1.0;
assert_eq!(2, get_slab_number_for_position(z, slab_height));
}