code (1)
code (1)
#[cfg(feature = "plot")]
use gnuplot::{Axes2D, Figure, PlotOption};
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[arg(short = 'c', long, default_value = "100.0")]
cond: f64,
#[arg(short = 'p', long, default_value = "1000.0")]
cp: f64,
#[arg(short = 'a', long, default_value = "0.1")]
area: f64,
#[arg(short = 'l', long, default_value = "5.0")]
length: f64,
#[arg(short = 'n', long, default_value = "100")]
n_cells: usize,
#[arg(short = 'L', long, default_value = "100.0")]
temp_left: f64,
#[arg(short = 'R', long, default_value = "200.0")]
temp_right: f64,
#[arg(short = 'q', long, default_value = "1000.0")]
heat_source_per_vol: f64,
#[arg(short = 'v', long, default_value = "0.01")]
flow_velocity: f64,
#[arg(short = 'd', long, default_value = "1.0")]
fluid_density: f64,
#[arg(long, default_value = "true")]
plot: bool,
#[arg(long, default_value = "true")]
print_setup: bool,
#[arg(long, default_value = "true")]
print_solution: bool,
}
#[derive(Debug, Clone, Copy)]
struct SimulationParameters {
cond: f64,
cp: f64,
area: f64,
length: f64,
n_cells: usize,
temp_left: f64,
temp_right: f64,
heat_source_per_vol: f64,
flow_velocity: f64,
fluid_density: f64,
peclet_number: f64,
}
#[derive(Debug)]
enum SimulationError {
InvalidInput(String),
MatrixSolveError(String),
}
fn assemble_matrix(
params: &SimulationParameters,
d_centroids: &Array1<f64>,
cell_length: &Array1<f64>
) -> (Array2<f64>, Array1<f64>) {
fn print_solution(t_vector: &Array1<f64>)
{
println!("==========================================");
println!("Temperature Vector (T):");
println!("{}", t_vector);
println!("==========================================");
}
#[cfg(feature = "plot")]
fn plot_solution(
x: &Array1<f64>,
t: &Array1<f64>,
params: &SimulationParameters,
) -> Result<(), Box<dyn Error>> {
let mut fg = Figure::new();
{
let axes: Axes2D = fg.axes2d();
axes.lines(
x.as_slice().unwrap(),
t.as_slice().unwrap(),
&[PlotOption::Caption("Numerical Solution"),
PlotOption::Color("blue")],
);
axes.set_x_label("Position (m)");
axes.set_y_label("Temperature (°C)");
axes.set_title(&format!("1D Convection-Diffusion (Pe =
{:.2})",params.peclet_number));
}
fg.show()
}
validate_inputs(¶ms_with_pe)?;
if cli.print_solution {
print_solution(&t_vector);
}
if cli.plot {
let x_plot = Array1::from_iter(
std::iter::once(x_faces[0])
.chain(x_centroids.iter().copied())
.chain(std::iter::once(x_faces[x_faces.len() - 1]))
);
let t_plot = Array1::from_iter(
std::iter::once(params.temp_left)
.chain(t_vector.iter().copied())
.chain(std::iter::once(params.temp_right))
);
#[cfg(feature = "plot")]
plot_solution(&x_plot, &t_plot, ¶ms_with_pe)?;
}
Ok(())
}