A modular, object-oriented Python package for 1D backward-facing EV longitudinal simulation over a WLTC drive cycle.
- Road-load force model: rolling, aerodynamic, grade, inertial
- Backward-facing torque/speed propagation from wheel to motor
- Motor and battery efficiency handling with regeneration logic
- Cycle energy integration and key performance indicators (KPIs)
- Sensitivity sweeps for:
- Aerodynamic drag coefficient (
2.0to5.0in0.1steps) - Transmission ratio (
15to30in1steps)
- Aerodynamic drag coefficient (
- Plotly visualizations
- Progress bars with
tqdm
ev_simulator/
__init__.py
vehicle.py
drivetrain.py
motor.py
battery.py
drivecycle.py
simulator.py
postprocess.py
sensitivity.py
config.py
tests/
test_imports.py
notebooks/
example_usage.ipynb
scripts/
run_simulation.py
pip install -e .Install dev tools:
pip install pre-commit pytest
pre-commit installpython scripts/run_simulation.pyOutputs are written to results/:
- KPI printout (console)
- Timeseries summary + operating-point plots (
.html) - Sensitivity plots (
.html) - Sensitivity data (
.csv)
A packaged 1 Hz WLTC-style CSV is included at:
ev_simulator/data/wltc_class3_sample.csv
Expected CSV columns (loadable with DriveCycle.from_csv):
time_sspeed_mpsorspeed_kph- optional
grade
from ev_simulator.config import EVConfig
from ev_simulator.drivecycle import DriveCycle
from ev_simulator.simulator import BackwardFacingSimulator
from ev_simulator.postprocess import PostProcessor
cfg = EVConfig()
cycle = DriveCycle.from_csv(cfg.wltc_csv_path, speed_col="speed_kph", speed_unit="kph")
sim = BackwardFacingSimulator.from_config(cfg)
result = sim.run(cycle)
post = PostProcessor(result)
kpis = post.compute_kpis()
fig = post.plot_timeseries_data()pytestConfigured in pyproject.toml and .pre-commit-config.yaml:
- Ruff
- Black
- isort