anl/
implicit_saw_tooth.rs1use 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}