1 unstable release
0.0.1 | May 29, 2022 |
---|
#76 in #prelude
210KB
3K
SLoC
te1d
te1d
is a Rust library for simulation of thermoelectric effect using
one-spatial-dimensional mathematical models.
te1d
uses the externalndarray
crate for matrix manipulation.
Features
- Simulate Thermoelectric Power Generation for
- Single-material, single-leg,
- Maximum energy conversion efficiency.
- Support Temperature-Dependent Material Properties.
- Take account of Thermal diffusion, Joule heating, Thomson heating.
Task Lists
- Steady-State Power Generation
- Simulation of Single Leg with Single Material:
SingleLeg
- Fixed Electrical Current:
SingleLeg::simulate_fixed_elec_cur()
- Fixed Load Resistance:
SingleLeg::simulate_fixed_load_resistance()
- Fixed Load Resistance Ratio:
SingleLeg::simulate_fixed_load_ratio()
- Power Maximization:
SingleLeg::maximize_power_auto_range()
- Efficiency Maximization:
SingleLeg::maximize_efficiency_auto_range()
- Approximate Max. Power
- Approximate Max. Efficiency
- Fixed Electrical Current:
- Segmented Leg with Several Materials and Contact Resistance
- Module with p- and n-type legs
- Boundary Conditions
- Fixed Temperature:
FixedTempBc
- Fixed Heat Flux:
FixedHeatFluxBc
- Convection:
ConvectionBc
- Fixed Temperature:
- Lateral Heat Loss
- Convection Loss
- Radiation Loss
- Bifurcation Analysis
- Simulation of Single Leg with Single Material:
- Steady-State Cooling
- Transient Power Generation
- Transient Cooling
Examples
- We use the material property of AgSbTe2 with 2% GeTe, reported in Figure 5 of Y. Chen et al. (2012).
// Goal: Find the maximum efficiency of a single leg using a AgSbTe2 material
// Import libraries
use ndarray::prelude::*;
use te1d::teg::prelude::*;
// Set the material properties
let seebeck_array: Array2<f64> = array![
[317.358, 1.96E-04], [340.4, 2.12E-04], [366.747, 2.23E-04], [390.492, 2.20E-04],
[412.868, 2.38E-04], [435.936, 2.42E-04], [458.998, 2.48E-04], [480.75, 2.51E-04],
[506.455, 2.55E-04], [528.907, 2.40E-04], [552.646, 2.39E-04], [576.396, 2.33E-04],
[600.135, 2.32E-04]];
let elec_cond_array: Array2<f64> = array![
[315.737, 10147.0], [341.864, 9861.0], [365.309, 9683.0], [389.428, 9396.0],
[413.553, 8966.0], [436.995, 8860.0], [460.443, 8610.0], [481.873, 8576.0],
[504.642, 8543.0], [528.739, 8799.0], [552.82, 9416.0], [574.887, 10178.0],
[599.653, 10434.0]];
let thrm_cond_array: Array2<f64> = array![
[304.113, 0.66], [373.047, 0.67], [475.351, 0.65], [526.115, 0.64],
[572.9, 0.75], [625.049, 0.83]];
let tep: Tep = Tep::from_raw_data_elec_cond(
&seebeck_array, &elec_cond_array, &thrm_cond_array);
// Set the leg spec
let length: f64 = 1e-3; // (m)
let area: f64 = 1e-6; // (mm^2)
// Set the boundary condition (Dirichlet boundary conditions)
let hot_temp: f64 = 500.0;
let cold_temp: f64 = 300.0;
let left_bc = FixedTempBc::new(hot_temp);
let right_bc = FixedTempBc::new(cold_temp);
// Set simulation parameters
let minimizer_kind = MinimizerKind::Bfgs;
let minimizer_param = MinimizerParam {
grad_tol: 1e-5,
max_iter: 300,
..MinimizerParam::default(minimizer_kind)
};
let simul_param = SimulationParam {
dx: length/10.0,
dtemp: (hot_temp - cold_temp)/10.0,
minimizer_kind,
minimizer_param,
..SimulationParam::default()
};
// Create a leg
let leg = SingleLeg::new(&tep, length, area, simul_param);
// Find the maximum efficiency: takes about 4.0s
let result = leg.maximize_power_auto_range(&left_bc, &right_bc, hot_temp, cold_temp);
assert!(result.success);
// Compare with an approximation: 2% relative error
let approx_max_efficiency = leg.estimate_max_efficiency(hot_temp, cold_temp);
assert!(is_close(approx_max_efficiency, result.efficiency, 2e-2, 0.0));
Dependencies
~1.5MB
~25K SLoC