Add error output for single/multi
This commit is contained in:
parent
67884c38c6
commit
a843ad9974
|
@ -138,27 +138,9 @@ fn main() {
|
||||||
|
|
||||||
//output.add_timestep(ntime, &sys.fnow);
|
//output.add_timestep(ntime, &sys.fnow);
|
||||||
|
|
||||||
/*
|
|
||||||
if opt.error {
|
if opt.error {
|
||||||
let time = ntime as Float * dt;
|
outinfo.error = Some(sys.error())
|
||||||
let mut e = 0.0;
|
|
||||||
for ((fmod, grid), op) in sys.fnow.iter().zip(&sys.grids).zip(&sys.operators) {
|
|
||||||
let mut fvort = fmod.clone();
|
|
||||||
match &initial_conditions {
|
|
||||||
parsing::InitialConditions::Vortex(vortexparams) => {
|
|
||||||
fvort.vortex(grid.x(), grid.y(), time, &vortexparams);
|
|
||||||
}
|
|
||||||
parsing::InitialConditions::Expressions(expr) => {
|
|
||||||
let (rho, rhou, rhov, e) = fvort.components_mut();
|
|
||||||
expr.as_ref()
|
|
||||||
.evaluate(time, grid.x(), grid.y(), rho, rhou, rhov, e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
e += fmod.h2_err(&fvort, &**op);
|
|
||||||
}
|
|
||||||
outinfo.error = Some(e);
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
if opt.output_json {
|
if opt.output_json {
|
||||||
println!("{}", json5::to_string(&outinfo).unwrap());
|
println!("{}", json5::to_string(&outinfo).unwrap());
|
||||||
|
|
|
@ -126,6 +126,7 @@ impl BaseSystem {
|
||||||
operators: self.operators,
|
operators: self.operators,
|
||||||
output: (self.output, outputs),
|
output: (self.output, outputs),
|
||||||
progressbar: None,
|
progressbar: None,
|
||||||
|
initial_conditions: self.initial_conditions.clone(),
|
||||||
};
|
};
|
||||||
match &self.initial_conditions {
|
match &self.initial_conditions {
|
||||||
/*
|
/*
|
||||||
|
@ -250,7 +251,7 @@ impl BaseSystem {
|
||||||
|
|
||||||
let output = self.output.clone();
|
let output = self.output.clone();
|
||||||
|
|
||||||
let initial = self.initial_conditions.clone();
|
let initial_conditions = self.initial_conditions.clone();
|
||||||
|
|
||||||
tids.push(
|
tids.push(
|
||||||
builder
|
builder
|
||||||
|
@ -258,7 +259,7 @@ impl BaseSystem {
|
||||||
let (ny, nx) = (grid.ny(), grid.nx());
|
let (ny, nx) = (grid.ny(), grid.nx());
|
||||||
let mut current = Field::new(ny, nx);
|
let mut current = Field::new(ny, nx);
|
||||||
|
|
||||||
match &initial {
|
match &initial_conditions {
|
||||||
parsing::InitialConditions::Vortex(vortexparams) => {
|
parsing::InitialConditions::Vortex(vortexparams) => {
|
||||||
current.vortex(grid.x(), grid.y(), time, vortexparams)
|
current.vortex(grid.x(), grid.y(), time, vortexparams)
|
||||||
}
|
}
|
||||||
|
@ -321,6 +322,7 @@ impl BaseSystem {
|
||||||
sbp,
|
sbp,
|
||||||
t: time,
|
t: time,
|
||||||
dt: Float::NAN,
|
dt: Float::NAN,
|
||||||
|
initial_conditions,
|
||||||
|
|
||||||
_name: name,
|
_name: name,
|
||||||
id,
|
id,
|
||||||
|
@ -416,6 +418,24 @@ impl System {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn error(&self) -> Float {
|
||||||
|
match self {
|
||||||
|
Self::SingleThreaded(sys) => sys.error(),
|
||||||
|
Self::MultiThreaded(sys) => {
|
||||||
|
for sender in &sys.send {
|
||||||
|
sender.send(MsgFromHost::Error).unwrap();
|
||||||
|
}
|
||||||
|
let mut e = 0.0;
|
||||||
|
for _ in 0..sys.sys.len() {
|
||||||
|
e += match sys.recv.recv().unwrap() {
|
||||||
|
(_, MsgToHost::Error(e)) => e,
|
||||||
|
(_, m) => panic!("Unexpected message: {:?}", m),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct SingleThreadedSystem {
|
pub struct SingleThreadedSystem {
|
||||||
|
@ -432,6 +452,7 @@ pub struct SingleThreadedSystem {
|
||||||
pub operators: Vec<Box<dyn SbpOperator2d>>,
|
pub operators: Vec<Box<dyn SbpOperator2d>>,
|
||||||
pub output: (hdf5::File, Vec<hdf5::Group>),
|
pub output: (hdf5::File, Vec<hdf5::Group>),
|
||||||
pub progressbar: Option<indicatif::ProgressBar>,
|
pub progressbar: Option<indicatif::ProgressBar>,
|
||||||
|
pub initial_conditions: parsing::InitialConditions,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl integrate::Integrable for SingleThreadedSystem {
|
impl integrate::Integrable for SingleThreadedSystem {
|
||||||
|
@ -579,6 +600,25 @@ impl SingleThreadedSystem {
|
||||||
eds.write_slice(e, ndarray::s![tpos, .., ..]).unwrap();
|
eds.write_slice(e, ndarray::s![tpos, .., ..]).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn error(&self) -> Float {
|
||||||
|
let mut e = 0.0;
|
||||||
|
for ((fmod, grid), op) in self.fnow.iter().zip(&self.grids).zip(&self.operators) {
|
||||||
|
let mut fvort = fmod.clone();
|
||||||
|
match &self.initial_conditions {
|
||||||
|
parsing::InitialConditions::Vortex(vortexparams) => {
|
||||||
|
fvort.vortex(grid.x(), grid.y(), self.time, &vortexparams);
|
||||||
|
}
|
||||||
|
parsing::InitialConditions::Expressions(expr) => {
|
||||||
|
let (rho, rhou, rhov, e) = fvort.components_mut();
|
||||||
|
expr.as_ref()
|
||||||
|
.evaluate(self.time, grid.x(), grid.y(), rho, rhou, rhov, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e += fmod.h2_err(&fvort, &**op);
|
||||||
|
}
|
||||||
|
e
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct DistributedSystem {
|
pub struct DistributedSystem {
|
||||||
|
@ -641,17 +681,32 @@ impl Drop for DistributedSystem {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Messages sent from the host to each compute thread
|
||||||
|
#[derive(Debug)]
|
||||||
enum MsgFromHost {
|
enum MsgFromHost {
|
||||||
|
/// Advance n steps
|
||||||
Advance(u64),
|
Advance(u64),
|
||||||
|
/// Compute the maximum dt allowed by this grid
|
||||||
DtRequest,
|
DtRequest,
|
||||||
|
/// Set dt
|
||||||
DtSet(Float),
|
DtSet(Float),
|
||||||
|
/// Output the current time to file
|
||||||
Output(u64),
|
Output(u64),
|
||||||
|
/// Stop all computing
|
||||||
Stop,
|
Stop,
|
||||||
|
/// Request the current error
|
||||||
|
Error,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Messages sent back to the host
|
||||||
|
#[derive(Debug)]
|
||||||
enum MsgToHost {
|
enum MsgToHost {
|
||||||
|
/// Maximum dt allowed by the current grid
|
||||||
MaxDt(Float),
|
MaxDt(Float),
|
||||||
|
/// Timestep which we have currently computed
|
||||||
CurrentTimestep(u64),
|
CurrentTimestep(u64),
|
||||||
|
/// Error from the current grid
|
||||||
|
Error(Float),
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[derive(Debug)]
|
// #[derive(Debug)]
|
||||||
|
@ -687,6 +742,7 @@ struct DistributedSystemPart {
|
||||||
send: Sender<(usize, MsgToHost)>,
|
send: Sender<(usize, MsgToHost)>,
|
||||||
|
|
||||||
output: hdf5::Group,
|
output: hdf5::Group,
|
||||||
|
initial_conditions: crate::parsing::InitialConditions,
|
||||||
|
|
||||||
k: [Diff; 4],
|
k: [Diff; 4],
|
||||||
wb: WorkBuffers,
|
wb: WorkBuffers,
|
||||||
|
@ -708,6 +764,10 @@ impl DistributedSystemPart {
|
||||||
MsgFromHost::Advance(ntime) => self.advance(ntime),
|
MsgFromHost::Advance(ntime) => self.advance(ntime),
|
||||||
MsgFromHost::Output(ntime) => self.output(ntime),
|
MsgFromHost::Output(ntime) => self.output(ntime),
|
||||||
MsgFromHost::Stop => return,
|
MsgFromHost::Stop => return,
|
||||||
|
MsgFromHost::Error => self
|
||||||
|
.send
|
||||||
|
.send((self.id, MsgToHost::Error(self.error())))
|
||||||
|
.unwrap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1066,4 +1126,19 @@ impl DistributedSystemPart {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn error(&self) -> Float {
|
||||||
|
let mut fvort = self.current.clone();
|
||||||
|
match &self.initial_conditions {
|
||||||
|
parsing::InitialConditions::Vortex(vortexparams) => {
|
||||||
|
fvort.vortex(self.grid.0.x(), self.grid.0.y(), self.t, &vortexparams);
|
||||||
|
}
|
||||||
|
parsing::InitialConditions::Expressions(expr) => {
|
||||||
|
let (rho, rhou, rhov, e) = fvort.components_mut();
|
||||||
|
expr.as_ref()
|
||||||
|
.evaluate(self.t, self.grid.0.x(), self.grid.0.y(), rho, rhou, rhov, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.current.h2_err(&fvort, &*self.sbp)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue