anl/
implicit_saw_tooth.rs

1use super::implicit_base::{ImplicitModuleBase, ScalarParameter};
2use super::ImplicitModule;
3
4use std::rc::Rc;
5use std::cell::RefCell;
6
7pub struct ImplicitSawTooth {
8    base: ImplicitModuleBase,
9    source: ScalarParameter,
10    period: ScalarParameter,
11}
12
13impl ImplicitSawTooth {
14    pub fn with_period(period: f64) -> ImplicitSawTooth {
15        ImplicitSawTooth {
16            base: Default::default(),
17            source: ScalarParameter::Value(0.0),
18            period: ScalarParameter::Value(period),
19        }
20    }
21
22    pub fn set_period_module(&mut self, m: Rc<RefCell<ImplicitModule>>) {
23        self.period = ScalarParameter::Source(m);
24    }
25    pub fn set_period_value(&mut self, v: f64) {
26        self.period = ScalarParameter::Value(v);
27    }
28
29    pub fn set_source_module(&mut self, m: Rc<RefCell<ImplicitModule>>) {
30        self.source = ScalarParameter::Source(m);
31    }
32    pub fn set_source_value(&mut self, v: f64) {
33        self.source = ScalarParameter::Value(v);
34    }
35}
36
37impl ImplicitModule for ImplicitSawTooth {
38    fn get_2d(&mut self, x: f64, y: f64) -> f64 {
39        let val = self.source.get_2d(x, y);
40        let p = self.period.get_2d(x, y);
41        2.0 * (val / p - (0.5 + val / p).floor())
42    }
43    fn get_3d(&mut self, x: f64, y: f64, z: f64) -> f64 {
44        let val = self.source.get_3d(x, y, z);
45        let p = self.period.get_3d(x, y, z);
46        2.0 * (val / p - (0.5 + val / p).floor())
47    }
48    fn get_4d(&mut self, x: f64, y: f64, z: f64, w: f64) -> f64 {
49        let val = self.source.get_4d(x, y, z, w);
50        let p = self.period.get_4d(x, y, z, w);
51        2.0 * (val / p - (0.5 + val / p).floor())
52    }
53    fn get_6d(&mut self, x: f64, y: f64, z: f64, w: f64, u: f64, v: f64) -> f64 {
54        let val = self.source.get_6d(x, y, z, w, u, v);
55        let p = self.period.get_6d(x, y, z, w, u, v);
56        2.0 * (val / p - (0.5 + val / p).floor())
57    }
58
59    fn spacing(&self) -> f64 {
60        self.base.spacing
61    }
62    fn set_deriv_spacing(&mut self, s: f64) {
63        self.base.spacing = s;
64    }
65}