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 } } }