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
use ind_hlp;
use lattice2d::Lattice2d;
use cell;

fn o2_centered(u_p1: &f64, u_m1: &f64) -> f64 {
	0.5f64*(u_p1-u_m1)
}

fn o1_forward(u0: &f64, u_p1: &f64) -> f64 {
	u_p1-u0
}

fn o1_backward(u0: &f64, u_m1: &f64) -> f64 {
	o1_forward(u_m1, u0)
}

pub fn o1_vel_derivative(lat: &Lattice2d, ix: i32, iy:i32, dir:i32, ori:i32, centered: bool) -> [f64; 2]
{

	match centered {
		true => {
			let (ix_p1, iy_p1) = ind_hlp::get_next(ix, iy, dir,  1);
			let (ix_m1, iy_m1) = ind_hlp::get_next(ix, iy, dir, -1);

			let i_p1 = ind_hlp::get_grid_idx(ix_p1 as usize, iy_p1 as usize, lat.get_nx(), lat.get_ny());
			let i_m1 = ind_hlp::get_grid_idx(ix_m1 as usize, iy_m1 as usize, lat.get_nx(), lat.get_ny());

			let u_p1 = lat.get_dyn(i_p1).compute_u(lat.get_pops(i_p1));
			let u_m1 = lat.get_dyn(i_m1).compute_u(lat.get_pops(i_m1));

			let mut d_u = [0f64, 0f64];
			for id in 0..cell::D {
				d_u[id] = o2_centered(&u_p1[id], &u_m1[id]);
			}
			d_u
		}
		false => {
			let i = ind_hlp::get_grid_idx(ix as usize, iy as usize, lat.get_nx(), lat.get_ny());
			let (ix_n, iy_n) = ind_hlp::get_next(ix, iy, dir, -ori);

			let i_n = ind_hlp::get_grid_idx(ix_n as usize, iy_n as usize, lat.get_nx(), lat.get_ny());

			let u_0 = lat.get_dyn(i).compute_u(lat.get_pops(i));
			let u_n = lat.get_dyn(i_n).compute_u(lat.get_pops(i_n));

			let mut d_u = [0f64, 0f64];
			for id in 0..cell::D {
				d_u[id] = ori as f64 * o1_backward(&u_0[id], &u_n[id]);
			}
			d_u
		}
	}
}