Skip to content

Commit

Permalink
Merge pull request #35 from chirranjeevigopal-TRI/MAT-1563_power_wave…
Browse files Browse the repository at this point in the history
…form_generation

power waveform generation from velocity profiles
  • Loading branch information
patrickherring-TRI authored May 5, 2020
2 parents e0f3e26 + f902231 commit 2ea2e98
Show file tree
Hide file tree
Showing 3 changed files with 1,437 additions and 2 deletions.
54 changes: 53 additions & 1 deletion beep/generate_protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
import time
import datetime
import csv

import numpy as np
import pandas as pd
import xmltodict
from docopt import docopt
Expand Down Expand Up @@ -358,6 +358,7 @@ def insert_maccor_waveform_discharge(self, proc_dict, waveform_idx, waveform_fil

return proc_dict


def insert_resistance_regcyclev2(self, proc_dict, resist_idx, reg_param):
"""
Inserts resistance into procedure dictionary at given id.
Expand Down Expand Up @@ -940,6 +941,57 @@ def insert_rpt_cyclev2(self, proc_dict, start, nominal_capacity, diagnostic_para

return proc_dict

def convert_velocity_to_power_waveform(waveform_file, velocity_units):
"""
Helper function to perform model based conversion of velocity waveform into power waveform.
For model description and parameters ref JECS, 161 (14) A2099-A2108 (2014)
"Model-Based SEI Layer Growth and Capacity Fade Analysis for EV and PHEV Batteries and Drive Cycles"
Args:
waveform_file (str): file containing tab or comma delimited values of time and velocity
velocity_units (str): units of velocity. Accept 'mph' or 'kmph' or 'mps'
returns
pd.DataFrame containing time, power and scaled power(between 0 and 1)
"""
df = pd.read_csv(waveform_file, sep="\t", header=0)
df.columns = ['t', 'v']

if velocity_units == 'mph':
scale = 1600.0 / 3600.0
elif velocity_units == 'kmph':
scale = 1000.0 / 3600.0
elif velocity_units == 'mps':
scale = 1.0
else:
raise NotImplementedError

df.v = df.v * scale

# Define model constants
m = 1500 # kg
rolling_resistance_coef = 0.01 # rolling resistance coeff
g = 9.8 # m/s^2
theta = 0 # gradient in radians
rho = 1.225 # kg/m^3
drag_coef = 0.34 # Coeff of drag
frontal_area = 1.75 # m^2
v_wind = 0 # wind velocity in m/s

# Power = Force * vel
# Force = Rate of change of momentum + Rolling frictional force + Aerodynamic drag force

# Method treats the time-series as is and does not interpolate on a uniform grid before computing gradient.
power = m * np.gradient(df.v, df.t) + rolling_resistance_coef * m * g * np.cos(
theta * np.pi / 180) + 0.5 * rho * drag_coef * frontal_area * (df.v - v_wind) ** 2

power = -power * df.v # positive power = charge

return pd.DataFrame({'time(s)': df.t,
'power_unscaled(W)': power,
'power_scaled': power / max(abs(power))})


def generate_protocol_files_from_csv(csv_filename, output_directory, **kwargs):
"""
Expand Down
Loading

0 comments on commit 2ea2e98

Please sign in to comment.