|
1 | 1 | use super::*; |
| 2 | +use rand_distr::{Normal, Distribution, Uniform}; |
2 | 3 |
|
3 | 4 | pub trait InputFile: GeometryInput { |
4 | 5 | fn new(string: &str) -> Self; |
@@ -332,25 +333,53 @@ where <T as Geometry>::InputFileFormat: Deserialize<'static> + 'static { |
332 | 333 | let Ec = particle_parameters.Ec[particle_index]; |
333 | 334 | let Es = particle_parameters.Es[particle_index]; |
334 | 335 | let interaction_index = particle_parameters.interaction_index[particle_index]; |
| 336 | + |
335 | 337 | let (x, y, z) = particle_parameters.pos[particle_index]; |
336 | 338 | let (cosx, cosy, cosz) = particle_parameters.dir[particle_index]; |
337 | | - assert!(cosx < 1., |
338 | | - "Input error: particle x-direction cannot be exactly equal to 1 to avoid numerical gimbal lock."); |
| 339 | + |
339 | 340 | for sub_particle_index in 0..N_ { |
340 | 341 | //Add new particle to particle vector |
341 | 342 | particle_input.push( |
342 | 343 | particle::ParticleInput{ |
343 | 344 | m: m*mass_unit, |
344 | 345 | Z: Z, |
345 | | - E: E*energy_unit, |
| 346 | + E: match E { |
| 347 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*energy_unit}, |
| 348 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*energy_unit}, |
| 349 | + Distributions::POINT(x) => x*energy_unit, |
| 350 | + }, |
346 | 351 | Ec: Ec*energy_unit, |
347 | 352 | Es: Es*energy_unit, |
348 | | - x: x*length_unit, |
349 | | - y: y*length_unit, |
350 | | - z: z*length_unit, |
351 | | - ux: cosx, |
352 | | - uy: cosy, |
353 | | - uz: cosz, |
| 353 | + x: match x { |
| 354 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 355 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 356 | + Distributions::POINT(x) => x*length_unit, |
| 357 | + }, |
| 358 | + y: match y { |
| 359 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 360 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 361 | + Distributions::POINT(x) => x*length_unit, |
| 362 | + }, |
| 363 | + z: match z { |
| 364 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 365 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 366 | + Distributions::POINT(x) => x*length_unit, |
| 367 | + }, |
| 368 | + ux: match cosx { |
| 369 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 370 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 371 | + Distributions::POINT(x) => {assert!(x != 1.0, "ux cannot equal exactly 1.0 to prevent gimbal lock"); x*length_unit} |
| 372 | + }, |
| 373 | + uy: match cosy { |
| 374 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 375 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 376 | + Distributions::POINT(x) => x*length_unit, |
| 377 | + }, |
| 378 | + uz: match cosz { |
| 379 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 380 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 381 | + Distributions::POINT(x) => x*length_unit, |
| 382 | + }, |
354 | 383 | interaction_index: interaction_index, |
355 | 384 | tag: 0, |
356 | 385 | weight: 1.0, |
@@ -379,27 +408,54 @@ where <T as Geometry>::InputFileFormat: Deserialize<'static> + 'static { |
379 | 408 | let interaction_index = particle_parameters.interaction_index[particle_index]; |
380 | 409 | let (x, y, z) = particle_parameters.pos[particle_index]; |
381 | 410 | let (cosx, cosy, cosz) = particle_parameters.dir[particle_index]; |
382 | | - assert!(cosx < 1., |
383 | | - "Input error: particle x-direction cannot be exactly equal to 1 to avoid numerical gimbal lock."); |
| 411 | + |
384 | 412 | for sub_particle_index in 0..N_ { |
385 | 413 |
|
386 | 414 | //Add new particle to particle vector |
387 | 415 | particle_input.push( |
388 | 416 | particle::ParticleInput{ |
389 | 417 | m: m*mass_unit, |
390 | 418 | Z: Z, |
391 | | - E: E*energy_unit, |
| 419 | + E: match E { |
| 420 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*energy_unit}, |
| 421 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*energy_unit}, |
| 422 | + Distributions::POINT(x) => x*energy_unit, |
| 423 | + }, |
392 | 424 | Ec: Ec*energy_unit, |
393 | 425 | Es: Es*energy_unit, |
394 | | - x: x*length_unit, |
395 | | - y: y*length_unit, |
396 | | - z: z*length_unit, |
397 | | - ux: cosx, |
398 | | - uy: cosy, |
399 | | - uz: cosz, |
400 | | - interaction_index, |
401 | | - weight: 1.0, |
| 426 | + x: match x { |
| 427 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 428 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 429 | + Distributions::POINT(x) => x*length_unit, |
| 430 | + }, |
| 431 | + y: match y { |
| 432 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 433 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 434 | + Distributions::POINT(x) => x*length_unit, |
| 435 | + }, |
| 436 | + z: match z { |
| 437 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 438 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 439 | + Distributions::POINT(x) => x*length_unit, |
| 440 | + }, |
| 441 | + ux: match cosx { |
| 442 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 443 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 444 | + Distributions::POINT(x) => {assert!(x != 1.0, "ux cannot equal exactly 1.0 to prevent gimbal lock"); x*length_unit}, |
| 445 | + }, |
| 446 | + uy: match cosy { |
| 447 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 448 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 449 | + Distributions::POINT(x) => x*length_unit, |
| 450 | + }, |
| 451 | + uz: match cosz { |
| 452 | + Distributions::NORMAL{mean, std} => {let normal = Normal::new(mean, std).unwrap(); normal.sample(&mut rand::thread_rng())*length_unit}, |
| 453 | + Distributions::UNIFORM{min, max} => {let uniform = Uniform::from(min..max); uniform.sample(&mut rand::thread_rng())*length_unit}, |
| 454 | + Distributions::POINT(x) => x*length_unit, |
| 455 | + }, |
| 456 | + interaction_index: interaction_index, |
402 | 457 | tag: 0, |
| 458 | + weight: 1.0, |
403 | 459 | } |
404 | 460 | ); |
405 | 461 | } |
|
0 commit comments