Add workbuffer for boundaries
This commit is contained in:
		@@ -350,7 +350,10 @@ impl System {
 | 
				
			|||||||
                            push,
 | 
					                            push,
 | 
				
			||||||
                            sbp,
 | 
					                            sbp,
 | 
				
			||||||
                            t: time,
 | 
					                            t: time,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            wb,
 | 
					                            wb,
 | 
				
			||||||
 | 
					                            wb_ns: Array2::zeros((4, nx)),
 | 
				
			||||||
 | 
					                            wb_ew: Array2::zeros((4, ny)),
 | 
				
			||||||
                        };
 | 
					                        };
 | 
				
			||||||
                        sys.advance();
 | 
					                        sys.advance();
 | 
				
			||||||
                    })
 | 
					                    })
 | 
				
			||||||
@@ -454,19 +457,24 @@ struct DistributedSystemPart {
 | 
				
			|||||||
    t: Float,
 | 
					    t: Float,
 | 
				
			||||||
    dt: Float,
 | 
					    dt: Float,
 | 
				
			||||||
    ntime: u64,
 | 
					    ntime: u64,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Work buffer for boundaries
 | 
				
			||||||
 | 
					    wb_ns: Array2<Float>,
 | 
				
			||||||
 | 
					    wb_ew: Array2<Float>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl DistributedSystemPart {
 | 
					impl DistributedSystemPart {
 | 
				
			||||||
    fn advance(&mut self) {
 | 
					    fn advance(&mut self) {
 | 
				
			||||||
        self.barrier.wait();
 | 
					        self.barrier.wait();
 | 
				
			||||||
        for _i in 0..self.ntime {
 | 
					        for _i in 0..self.ntime {
 | 
				
			||||||
            println!("step: {}", _i);
 | 
					 | 
				
			||||||
            let metrics = &self.grid.1;
 | 
					            let metrics = &self.grid.1;
 | 
				
			||||||
            let wb = &mut self.wb.0;
 | 
					            let wb = &mut self.wb.0;
 | 
				
			||||||
            let sbp = &self.sbp;
 | 
					            let sbp = &self.sbp;
 | 
				
			||||||
            let push = &self.push;
 | 
					            let push = &self.push;
 | 
				
			||||||
            let boundary_conditions = &self.boundary_conditions;
 | 
					            let boundary_conditions = &self.boundary_conditions;
 | 
				
			||||||
            let grid = &self.grid.0;
 | 
					            let grid = &self.grid.0;
 | 
				
			||||||
 | 
					            let wb_ns = &mut self.wb_ns;
 | 
				
			||||||
 | 
					            let wb_ew = &mut self.wb_ew;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            let rhs = |k: &mut euler::Diff, y: &euler::Field, time: Float| {
 | 
					            let rhs = |k: &mut euler::Diff, y: &euler::Field, time: Float| {
 | 
				
			||||||
                // Send off the boundaries optimistically, in case some grid is ready
 | 
					                // Send off the boundaries optimistically, in case some grid is ready
 | 
				
			||||||
@@ -499,13 +507,11 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        Some(select.recv(r))
 | 
					                        Some(select.recv(r))
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::This => {
 | 
					                    DistributedBoundaryConditions::This => {
 | 
				
			||||||
                        let data = y.south();
 | 
					                        euler::SAT_north(sbp.deref(), k, y, metrics, y.south());
 | 
				
			||||||
                        euler::SAT_north(sbp.deref(), k, y, metrics, data.view());
 | 
					 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::Vortex(vp) => {
 | 
					                    DistributedBoundaryConditions::Vortex(vp) => {
 | 
				
			||||||
                        let mut data = y.north().to_owned();
 | 
					                        let mut fiter = wb_ns.outer_iter_mut();
 | 
				
			||||||
                        let mut fiter = data.outer_iter_mut();
 | 
					 | 
				
			||||||
                        let (rho, rhou, rhov, e) = (
 | 
					                        let (rho, rhou, rhov, e) = (
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
@@ -515,12 +521,11 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        let (gx, gy) = grid.north();
 | 
					                        let (gx, gy) = grid.north();
 | 
				
			||||||
                        vp.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
					                        vp.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        euler::SAT_north(sbp.deref(), k, y, metrics, data.view());
 | 
					                        euler::SAT_north(sbp.deref(), k, y, metrics, wb_ns.view());
 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::Eval(eval) => {
 | 
					                    DistributedBoundaryConditions::Eval(eval) => {
 | 
				
			||||||
                        let mut data = y.north().to_owned();
 | 
					                        let mut fiter = wb_ns.outer_iter_mut();
 | 
				
			||||||
                        let mut fiter = data.outer_iter_mut();
 | 
					 | 
				
			||||||
                        let (rho, rhou, rhov, e) = (
 | 
					                        let (rho, rhou, rhov, e) = (
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
@@ -529,7 +534,7 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        let (gx, gy) = grid.north();
 | 
					                        let (gx, gy) = grid.north();
 | 
				
			||||||
                        eval.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
					                        eval.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
				
			||||||
                        euler::SAT_north(sbp.deref(), k, y, metrics, data.view());
 | 
					                        euler::SAT_north(sbp.deref(), k, y, metrics, wb_ns.view());
 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
@@ -540,13 +545,11 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        Some(select.recv(r))
 | 
					                        Some(select.recv(r))
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::This => {
 | 
					                    DistributedBoundaryConditions::This => {
 | 
				
			||||||
                        let data = y.north();
 | 
					                        euler::SAT_south(sbp.deref(), k, y, metrics, y.north());
 | 
				
			||||||
                        euler::SAT_south(sbp.deref(), k, y, metrics, data.view());
 | 
					 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::Vortex(vp) => {
 | 
					                    DistributedBoundaryConditions::Vortex(vp) => {
 | 
				
			||||||
                        let mut data = y.south().to_owned();
 | 
					                        let mut fiter = wb_ns.outer_iter_mut();
 | 
				
			||||||
                        let mut fiter = data.outer_iter_mut();
 | 
					 | 
				
			||||||
                        let (rho, rhou, rhov, e) = (
 | 
					                        let (rho, rhou, rhov, e) = (
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
@@ -556,12 +559,11 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        let (gx, gy) = grid.south();
 | 
					                        let (gx, gy) = grid.south();
 | 
				
			||||||
                        vp.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
					                        vp.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        euler::SAT_south(sbp.deref(), k, y, metrics, data.view());
 | 
					                        euler::SAT_south(sbp.deref(), k, y, metrics, wb_ns.view());
 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::Eval(eval) => {
 | 
					                    DistributedBoundaryConditions::Eval(eval) => {
 | 
				
			||||||
                        let mut data = y.south().to_owned();
 | 
					                        let mut fiter = wb_ns.outer_iter_mut();
 | 
				
			||||||
                        let mut fiter = data.outer_iter_mut();
 | 
					 | 
				
			||||||
                        let (rho, rhou, rhov, e) = (
 | 
					                        let (rho, rhou, rhov, e) = (
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
@@ -570,7 +572,7 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        let (gx, gy) = grid.south();
 | 
					                        let (gx, gy) = grid.south();
 | 
				
			||||||
                        eval.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
					                        eval.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
				
			||||||
                        euler::SAT_south(sbp.deref(), k, y, metrics, data.view());
 | 
					                        euler::SAT_south(sbp.deref(), k, y, metrics, wb_ns.view());
 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
@@ -581,13 +583,11 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        Some(select.recv(r))
 | 
					                        Some(select.recv(r))
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::This => {
 | 
					                    DistributedBoundaryConditions::This => {
 | 
				
			||||||
                        let data = y.west();
 | 
					                        euler::SAT_east(sbp.deref(), k, y, metrics, y.west());
 | 
				
			||||||
                        euler::SAT_east(sbp.deref(), k, y, metrics, data.view());
 | 
					 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::Vortex(vp) => {
 | 
					                    DistributedBoundaryConditions::Vortex(vp) => {
 | 
				
			||||||
                        let mut data = y.east().to_owned();
 | 
					                        let mut fiter = wb_ew.outer_iter_mut();
 | 
				
			||||||
                        let mut fiter = data.outer_iter_mut();
 | 
					 | 
				
			||||||
                        let (rho, rhou, rhov, e) = (
 | 
					                        let (rho, rhou, rhov, e) = (
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
@@ -597,12 +597,11 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        let (gx, gy) = grid.east();
 | 
					                        let (gx, gy) = grid.east();
 | 
				
			||||||
                        vp.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
					                        vp.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        euler::SAT_east(sbp.deref(), k, y, metrics, data.view());
 | 
					                        euler::SAT_east(sbp.deref(), k, y, metrics, wb_ew.view());
 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::Eval(eval) => {
 | 
					                    DistributedBoundaryConditions::Eval(eval) => {
 | 
				
			||||||
                        let mut data = y.east().to_owned();
 | 
					                        let mut fiter = wb_ew.outer_iter_mut();
 | 
				
			||||||
                        let mut fiter = data.outer_iter_mut();
 | 
					 | 
				
			||||||
                        let (rho, rhou, rhov, e) = (
 | 
					                        let (rho, rhou, rhov, e) = (
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
@@ -611,7 +610,7 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        let (gx, gy) = grid.east();
 | 
					                        let (gx, gy) = grid.east();
 | 
				
			||||||
                        eval.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
					                        eval.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
				
			||||||
                        euler::SAT_east(sbp.deref(), k, y, metrics, data.view());
 | 
					                        euler::SAT_east(sbp.deref(), k, y, metrics, wb_ew.view());
 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
@@ -622,13 +621,11 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        Some(select.recv(r))
 | 
					                        Some(select.recv(r))
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::This => {
 | 
					                    DistributedBoundaryConditions::This => {
 | 
				
			||||||
                        let data = y.east();
 | 
					                        euler::SAT_west(sbp.deref(), k, y, metrics, y.east());
 | 
				
			||||||
                        euler::SAT_west(sbp.deref(), k, y, metrics, data.view());
 | 
					 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::Vortex(vp) => {
 | 
					                    DistributedBoundaryConditions::Vortex(vp) => {
 | 
				
			||||||
                        let mut data = y.west().to_owned();
 | 
					                        let mut fiter = wb_ew.outer_iter_mut();
 | 
				
			||||||
                        let mut fiter = data.outer_iter_mut();
 | 
					 | 
				
			||||||
                        let (rho, rhou, rhov, e) = (
 | 
					                        let (rho, rhou, rhov, e) = (
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
@@ -638,12 +635,11 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        let (gx, gy) = grid.west();
 | 
					                        let (gx, gy) = grid.west();
 | 
				
			||||||
                        vp.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
					                        vp.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        euler::SAT_west(sbp.deref(), k, y, metrics, data.view());
 | 
					                        euler::SAT_west(sbp.deref(), k, y, metrics, wb_ew.view());
 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    DistributedBoundaryConditions::Eval(eval) => {
 | 
					                    DistributedBoundaryConditions::Eval(eval) => {
 | 
				
			||||||
                        let mut data = y.west().to_owned();
 | 
					                        let mut fiter = wb_ew.outer_iter_mut();
 | 
				
			||||||
                        let mut fiter = data.outer_iter_mut();
 | 
					 | 
				
			||||||
                        let (rho, rhou, rhov, e) = (
 | 
					                        let (rho, rhou, rhov, e) = (
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
                            fiter.next().unwrap(),
 | 
					                            fiter.next().unwrap(),
 | 
				
			||||||
@@ -652,7 +648,7 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        let (gx, gy) = grid.west();
 | 
					                        let (gx, gy) = grid.west();
 | 
				
			||||||
                        eval.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
					                        eval.evaluate(time, gx, gy, rho, rhou, rhov, e);
 | 
				
			||||||
                        euler::SAT_west(sbp.deref(), k, y, metrics, data.view());
 | 
					                        euler::SAT_west(sbp.deref(), k, y, metrics, wb_ew.view());
 | 
				
			||||||
                        None
 | 
					                        None
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
@@ -669,24 +665,28 @@ impl DistributedSystemPart {
 | 
				
			|||||||
                            let r = s
 | 
					                            let r = s
 | 
				
			||||||
                                .recv(boundary_conditions.north().channel().unwrap())
 | 
					                                .recv(boundary_conditions.north().channel().unwrap())
 | 
				
			||||||
                                .unwrap();
 | 
					                                .unwrap();
 | 
				
			||||||
 | 
					                            // TODO: Interpolation
 | 
				
			||||||
                            euler::SAT_north(sbp.deref(), k, y, metrics, r.view());
 | 
					                            euler::SAT_north(sbp.deref(), k, y, metrics, r.view());
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        x if x == recv_south => {
 | 
					                        x if x == recv_south => {
 | 
				
			||||||
                            let r = s
 | 
					                            let r = s
 | 
				
			||||||
                                .recv(boundary_conditions.south().channel().unwrap())
 | 
					                                .recv(boundary_conditions.south().channel().unwrap())
 | 
				
			||||||
                                .unwrap();
 | 
					                                .unwrap();
 | 
				
			||||||
 | 
					                            // TODO: Interpolation
 | 
				
			||||||
                            euler::SAT_south(sbp.deref(), k, y, metrics, r.view());
 | 
					                            euler::SAT_south(sbp.deref(), k, y, metrics, r.view());
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        x if x == recv_west => {
 | 
					                        x if x == recv_west => {
 | 
				
			||||||
                            let r = s
 | 
					                            let r = s
 | 
				
			||||||
                                .recv(boundary_conditions.west().channel().unwrap())
 | 
					                                .recv(boundary_conditions.west().channel().unwrap())
 | 
				
			||||||
                                .unwrap();
 | 
					                                .unwrap();
 | 
				
			||||||
 | 
					                            // TODO: Interpolation
 | 
				
			||||||
                            euler::SAT_west(sbp.deref(), k, y, metrics, r.view());
 | 
					                            euler::SAT_west(sbp.deref(), k, y, metrics, r.view());
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        x if x == recv_east => {
 | 
					                        x if x == recv_east => {
 | 
				
			||||||
                            let r = s
 | 
					                            let r = s
 | 
				
			||||||
                                .recv(boundary_conditions.east().channel().unwrap())
 | 
					                                .recv(boundary_conditions.east().channel().unwrap())
 | 
				
			||||||
                                .unwrap();
 | 
					                                .unwrap();
 | 
				
			||||||
 | 
					                            // TODO: Interpolation
 | 
				
			||||||
                            euler::SAT_east(sbp.deref(), k, y, metrics, r.view());
 | 
					                            euler::SAT_east(sbp.deref(), k, y, metrics, r.view());
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        _ => unreachable!(),
 | 
					                        _ => unreachable!(),
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user