diff --git a/docs/build/.buildinfo b/docs/build/.buildinfo new file mode 100644 index 000000000..db3b6264b --- /dev/null +++ b/docs/build/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 9a5ab9220eaba148dacb38eb81465b8e +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/.doctrees/README.doctree b/docs/build/.doctrees/README.doctree new file mode 100644 index 000000000..e371a805f Binary files /dev/null and b/docs/build/.doctrees/README.doctree differ diff --git a/docs/build/.doctrees/analysis.doctree b/docs/build/.doctrees/analysis.doctree new file mode 100644 index 000000000..d4bd93f4b Binary files /dev/null and b/docs/build/.doctrees/analysis.doctree differ diff --git a/docs/build/.doctrees/charging_sim.doctree b/docs/build/.doctrees/charging_sim.doctree new file mode 100644 index 000000000..4a3da2f74 Binary files /dev/null and b/docs/build/.doctrees/charging_sim.doctree differ diff --git a/docs/build/.doctrees/environment.pickle b/docs/build/.doctrees/environment.pickle new file mode 100644 index 000000000..55e4c5d66 Binary files /dev/null and b/docs/build/.doctrees/environment.pickle differ diff --git a/docs/build/.doctrees/feeder_population.doctree b/docs/build/.doctrees/feeder_population.doctree new file mode 100644 index 000000000..8af74bbbe Binary files /dev/null and b/docs/build/.doctrees/feeder_population.doctree differ diff --git a/docs/build/.doctrees/index.doctree b/docs/build/.doctrees/index.doctree new file mode 100644 index 000000000..0b20731a7 Binary files /dev/null and b/docs/build/.doctrees/index.doctree differ diff --git a/docs/build/.doctrees/modules.doctree b/docs/build/.doctrees/modules.doctree new file mode 100644 index 000000000..deba12fb2 Binary files /dev/null and b/docs/build/.doctrees/modules.doctree differ diff --git a/docs/build/.doctrees/test_cases.base_case.doctree b/docs/build/.doctrees/test_cases.base_case.doctree new file mode 100644 index 000000000..a0c9e3570 Binary files /dev/null and b/docs/build/.doctrees/test_cases.base_case.doctree differ diff --git a/docs/build/.doctrees/test_cases.battery.doctree b/docs/build/.doctrees/test_cases.battery.doctree new file mode 100644 index 000000000..2a79bae66 Binary files /dev/null and b/docs/build/.doctrees/test_cases.battery.doctree differ diff --git a/docs/build/.doctrees/test_cases.battery.feeder_population.doctree b/docs/build/.doctrees/test_cases.battery.feeder_population.doctree new file mode 100644 index 000000000..36b35382d Binary files /dev/null and b/docs/build/.doctrees/test_cases.battery.feeder_population.doctree differ diff --git a/docs/build/.doctrees/test_cases.doctree b/docs/build/.doctrees/test_cases.doctree new file mode 100644 index 000000000..85129a00e Binary files /dev/null and b/docs/build/.doctrees/test_cases.doctree differ diff --git a/docs/build/README.html b/docs/build/README.html new file mode 100644 index 000000000..12f36983d --- /dev/null +++ b/docs/build/README.html @@ -0,0 +1,109 @@ + + +
+ + + +
+"""
+This module contains the CostEstimator Class, which estimates the cost of the different grid and DER components
+from the simulation.
+"""
+
+import os
+import numpy as np
+import pandas as pd
+import json
+import matplotlib.pyplot as plt
+
+PLOT_FONT_SIZE = 16
+plt.rcParams.update({'font.size': PLOT_FONT_SIZE})
+
+
+
+[docs]
+class CostEstimator:
+ """
+ This class is used to calculate levelized cost of DER assets in EV-Ecosim.
+
+ :param num_days: The number of days for which the calculation is run.
+ """
+ def __init__(self, num_days):
+ """
+ Constructor method.
+
+ :param num_days: The number of days for which the calculation is run.
+ """
+ self.solar_rating = None
+ self.trans_price_dict = {}
+ self.dcfc = False # boolean for determining if transformer is 480 or 240V
+ self.num_days = num_days
+ self.trans_Th = None # hot-spot temp
+ self.trans_To = None # top-oil temp
+ self.TOU_rates = None
+ self.battery_cost = None # to be calculated later
+ self.solar_price_per_m2 = 6
+ self.battery_price_per_kWh = 345 # ($) source: https://www.nrel.gov/docs/fy21osti/79236.pdf
+ self.trans_cost_per_kVA = None # create a non-linear cost curve for these prices (I sense batteries are the same)
+ self.trans_normal_life = 180000 # hours
+ self.resolution = 15
+ self.TOU_rates = np.loadtxt('../elec_rates/PGE_BEV2_S_annual_TOU_rate_15min.csv')[:96 * self.num_days] # change this to referenced property
+ # todo: cannot find good source for 2400/240V transformer prices
+
+
+[docs]
+ def calculate_battery_cost(self, result_dir):
+ """
+ Calculates the battery costs and updates the different cost components, including LCOE.
+
+ :param result_dir: Directory in which to save the results dictionary.
+ :return dict result_dict: Dictionary of results.
+ """
+ current_dir = os.getcwd()
+ os.chdir(result_dir)
+ with open('scenario.json', "r") as f:
+ scenario = json.load(f)
+ result_dict = {}
+ capital_cost = self.battery_price_per_kWh / 1000 * scenario['pack_energy_cap']
+ for root, dirs, files, in os.walk(".", topdown=True):
+ for file in files:
+ path_lst = file.split("_")
+ if 'battery' in path_lst and 'plot.png' not in path_lst:
+ battery_LOL = 1 - pd.read_csv(file)['SOH'].to_numpy()[-1]
+ avg_daily_energy_thruput = np.abs(pd.read_csv(file)['power_kW'].to_numpy()[1:]).sum() \
+ * self.resolution / 60 * 1 / self.num_days
+ expected_life_days = 0.2 / (battery_LOL / self.num_days)
+ expected_energy_thruput_over_lifetime = avg_daily_energy_thruput * expected_life_days
+ capital_loss_to_aging = (battery_LOL / 0.2 * capital_cost)
+ self.battery_cost = capital_cost + capital_loss_to_aging
+ result_dict[f'battery_sim_{path_lst[2]}'] = {"capital_loss_aging": capital_loss_to_aging,
+ "capital_loss_aging_per_day": capital_loss_to_aging / expected_life_days,
+ "capital_cost": capital_cost,
+ "battery_LOL": battery_LOL,
+ "LOL_per_day": battery_LOL / self.num_days,
+ "battery_total_cost": self.battery_cost,
+ "total_cost_per_day": self.battery_cost / expected_life_days,
+ 'lcoe': self.battery_cost / expected_energy_thruput_over_lifetime,
+ 'lcoe_aging': capital_loss_to_aging /expected_energy_thruput_over_lifetime
+ }
+ with open("postopt_cost_batt.json", 'w') as config_file_path:
+ json.dump(result_dict, config_file_path, indent=1) # save to JSON
+ os.chdir(current_dir) # go back to initial dir
+ return result_dict
+
+
+
+[docs]
+ def calculate_solar_cost(self):
+ """
+ Values are pulled from the NREL solar cost calculator.
+ Ref: https://www.nrel.gov/solar/market-research-analysis/solar-levelized-cost.html
+ To be deprecated soon.
+
+ :return: None
+ """
+ return
+
+
+
+[docs]
+ def calculate_electricity_cost_PGEBEV2s(self, result_dir, PGE_separate_file=True):
+ """
+ Calculates the overall electricity PGEBEV2S cost for a given scenario.
+
+ :param str result_dir: Directory in which the result is saved.
+ :param PGE_separate_file:
+ :return dict result_dict: A dictionary comprising all the cost components and their dollar amounts.
+ """
+ current_dir = os.getcwd()
+ os.chdir(result_dir)
+ result_dict = {}
+ price_per_block = 95.56 # ($/Block) # need to make these agnostic for now just leave as is
+ overage_fee = 3.82 # ($/kW)
+ for root, dirs, files, in os.walk(".", topdown=True):
+ for file in files:
+ path_lst = file.split("_")
+ if 'station' in path_lst and 'block' not in path_lst and 'plot.png' not in path_lst:
+ net_grid_load = pd.read_csv(file)['station_net_grid_load_kW'].to_numpy()[1:]
+ total_grid_load = pd.read_csv(file)['station_total_load_kW'].to_numpy()[1:]
+ net_ev_grid_load_plusbatt = total_grid_load - pd.read_csv(file)['station_solar_load_ev'].to_numpy()[
+ 1:] + pd.read_csv(file)['battery_power'].to_numpy()[
+ 1:]
+ total_energy = total_grid_load.sum() * self.resolution/60
+ max_load = total_grid_load.max()
+ average_load = total_grid_load.mean()
+ self.plot_loads(total_grid_load, net_ev_grid_load_plusbatt, prefix=f'{file.split(".")[0]}_',
+ labels=["Total demand", "Net demand with DER"])
+ if PGE_separate_file:
+ block_subscription = int(np.loadtxt(f'PGE_block_{file}')[1])
+ else:
+ block_subscription = int(pd.read_csv(file)['PGE_power_blocks'].to_numpy()[1])
+ subscription_cost = block_subscription * price_per_block # This is in blocks of 50kW which makes it very convenient ($/day)
+ penalty_cost = max((np.max(net_grid_load) - 50 * block_subscription), 0) * overage_fee # ($)
+ TOU_cost = np.sum(self.TOU_rates[0:net_grid_load.shape[0]] * net_grid_load) * self.resolution / 60 # ($)
+ electricity_cost = TOU_cost + penalty_cost + subscription_cost
+ result_dict[f'charging_station_sim_{path_lst[3]}'] = {"TOU_cost": TOU_cost,
+ "subscription_cost": subscription_cost,
+ "penalty_cost": penalty_cost,
+ "total_elec_cost": electricity_cost,
+ "cost_per_day": electricity_cost / self.num_days,
+ "max_load": max_load,
+ "avg_load": average_load,
+ "cost_per_kWh": electricity_cost/total_energy}
+ elif 'battery' in path_lst and 'plot.png' not in path_lst:
+ power = pd.read_csv(file)['power_kW'].to_numpy()[1:]
+ power_pred = pd.read_csv(file)['pred_power_kW'].to_numpy()[1:]
+ soc = pd.read_csv(file)['SOC'].to_numpy()[1:]
+ soc_pred = pd.read_csv(file)['SOC_pred'].to_numpy()[1:]
+ self.plot_soc(soc, soc_pred, prefix=f'{file.split(".")[0]}_SOC',
+ labels=['true soc', 'pred soc', 'SoC'])
+ self.plot_power(power, power_pred, prefix=f'{file.split(".")[0]}_power',
+ labels=['true power', 'pred power', 'power (kW)'])
+
+ with open("postopt_cost_charging.json", 'w') as config_file_path:
+ json.dump(result_dict, config_file_path, indent=1) # save to JSON
+ os.chdir(current_dir) # go back to initial dir
+ return result_dict
+
+
+
+[docs]
+ def transformer_cost(self):
+ """Cannot find good resource data for this yet."""
+ return NotImplementedError
+
+
+
+[docs]
+ @staticmethod
+ def plot_loads(total_load, net_load, prefix=None, labels: list = None):
+ """
+ Creates plots overlaying load and net loads for post-simulation visualization.
+
+ :param total_load: Overall EV load demand at node, can include building load if controllable.
+ :param net_load: total_load minus DER buffer.
+ :param prefix: Plot file label prefix.
+ :param labels: Legend labels for each plotted curve.
+ :return: None.
+ """
+ plt.close('all')
+ num_days = 1
+ start_day = 0
+ num_steps = num_days * 96
+ fig, ax = plt.subplots()
+ x_vals = 15 / 60 * np.arange(0, num_steps)
+ total_load_plot = total_load[start_day * 96:start_day * 96 + num_steps]
+ net_load_plot = net_load[start_day * 96:start_day * 96 + num_steps]
+
+ lb = np.zeros(num_steps)
+ alph = 0.3
+ interp = True
+ total_load_color = 'blue'
+ net_load_color = 'orange'
+ ax.plot(x_vals, total_load_plot, color=f'tab:{total_load_color}')
+ ax.plot(x_vals, net_load_plot, color=f'tab:{net_load_color}')
+ ax.fill_between(x_vals, lb, total_load_plot, color=f'tab:{total_load_color}',
+ label=labels[0], interpolate=interp, alpha=alph)
+ ax.fill_between(x_vals, lb, net_load_plot, color=f'tab:{net_load_color}', label=labels[1], interpolate=interp,
+ alpha=alph)
+ ax.set_ylim(bottom=0)
+ ax.set_xlim(left=0, right=round(max(x_vals)))
+ plt.xlabel('Hour of day')
+ plt.ylabel('Power (kW)')
+ plt.legend()
+ fig.tight_layout()
+ if prefix:
+ plt.savefig(f'{prefix}_load_plot.png')
+ plt.close('all')
+ return
+ plt.savefig('loads.png')
+
+
+
+[docs]
+ @staticmethod
+ def plot_soc(soc, soc_pred, prefix=None, labels: list = None):
+ """
+ Plots the controller predicted and true state of charge of the battery system.
+
+ :param soc: True state of charge.
+ :param soc_pred: Controller predicted state of charge.
+ :param prefix: Plot file label prefix.
+ :param labels: Legend labels for each plotted curve.
+ :return: None.
+ """
+ error_abs_mean = np.mean(np.abs((soc - soc_pred) / (soc + 1e-6)) * 100)
+ MAPE = np.max(np.abs((soc - soc_pred) / (soc + 1e-6)) * 100)
+ np.savetxt('abs_percent_err_soc.csv', [error_abs_mean])
+ np.savetxt('MAPE_soc.csv', [MAPE])
+ plt.close('all')
+ num_days = 10
+ start_day = 0
+ num_steps = num_days * 96
+ fig, ax = plt.subplots()
+ x_vals = 15 / 60 * np.arange(0, num_steps)
+ soc_plot = soc[start_day * 96:start_day * 96 + num_steps]
+ soc_pred_plot = soc_pred[start_day * 96:start_day * 96 + num_steps]
+
+ ax.plot(x_vals, soc_plot, color='tab:blue', label=labels[0])
+ ax.plot(x_vals, soc_pred_plot, '--', color='tab:red', label=labels[1])
+ plt.xlabel('Hour of day')
+ plt.ylabel(labels[2])
+ plt.legend()
+ fig.tight_layout()
+ if prefix:
+ plt.savefig(f'{prefix}_soc_plot.png')
+ return
+ plt.savefig('soc_plot.png')
+
+
+
+[docs]
+ @staticmethod
+ def plot_power(power, power_pred, prefix=None, labels: list = None):
+ """
+ Plots the controller predicted and true power of the battery system.
+
+ :param power: True power.
+ :param power_pred: Controller predicted power.
+ :param prefix: Plot file label prefix.
+ :param labels: Legend labels for each plotted curve.
+ :return: None.
+ """
+ error_abs_mean = np.mean(np.abs((power - power_pred) / (power + 1e-6)) * 100)
+ MAPE = np.max(np.abs((power - power_pred) / (power + 1e-6)) * 100)
+ np.savetxt('abs_percent_err_power.csv', [error_abs_mean])
+ np.savetxt('MAPE_power.csv', [MAPE])
+ plt.close('all')
+ num_days = 10
+ start_day = 0
+ num_steps = num_days * 96
+ fig, ax = plt.subplots()
+ x_vals = 15 / 60 * np.arange(0, num_steps)
+ power_plot = power[start_day * 96:start_day * 96 + num_steps]
+ power_pred_plot = power_pred[start_day * 96:start_day * 96 + num_steps]
+
+ ax.plot(x_vals, power_plot, color='tab:blue', label=labels[0])
+ ax.plot(x_vals, power_pred_plot, '--', color='tab:red', label=labels[1])
+ plt.xlabel('Hour of day')
+ plt.ylabel(labels[2])
+ plt.legend()
+ fig.tight_layout()
+ if prefix:
+ plt.savefig(f'{prefix}_power_plot.png')
+ return
+ plt.savefig('power_plot.png')
+
+
+
+[docs]
+ def solar_cost(self, result_dir):
+ """
+ Calculates the overall capital cost of the solar system.
+ Not fully implemented.
+
+ :param str result_dir: Location to save the result.
+ :return: Solar PV capital cost.
+ """
+ return self.solar_rating * 1e6 / 150 * self.solar_price_per_m2 # approximate area using 150W/m2
+
+
+
+[docs]
+ def calculate_trans_loss_of_life(self, result_dir):
+ """
+ Estimates the expected transformer loss of life.
+
+ Reference:
+
+ * 5.11.3 of IEEE Std C57.12.00-2010 a minimum normal insulation life expectancy of 180 000 hours is expected.
+
+ :param result_dir: Directory in which the loss results is saved.
+ :return: Dictionary of transformer losses.
+ """
+ current_dir = os.getcwd()
+ os.chdir(result_dir)
+ with open('scenario.json', "r") as f:
+ scenario = json.load(f)
+ # save the charging buses
+ result_dict = {}
+ for root, dirs, files, in os.walk(".", topdown=True):
+ for file in files:
+ if 'trans_Th' in file:
+ trans_Th_data = pd.read_csv(file)
+ relevant_dcfc_trans = [trans for trans in trans_Th_data.columns if 'dcfc' in trans]
+ relevant_L2_trans = [f'trip_trans_{trans.split("_")[-1]}' for trans in scenario['L2_nodes']]
+ trans_str_list = relevant_L2_trans + relevant_dcfc_trans
+ relevant_Th_data = trans_Th_data[trans_str_list]
+ # ref for A and B https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4073181
+ A = -27.558
+ B = 14573
+ for trans in trans_str_list:
+ trans_Th = relevant_Th_data[trans]
+ F_EQA = np.mean(np.exp(15000 / 383 - 15000 / (trans_Th + 273))) # equivalent aging factor
+ print("F_EQA: ", F_EQA)
+ percent_LOL = F_EQA * (24 * self.num_days) * 100 / self.trans_normal_life
+ result_dict[trans] = percent_LOL
+ result_dict[f'{trans}_LOL_per_day'] = percent_LOL / self.num_days
+ result_dict["average_LOL"] = sum(result_dict.values()) / (len(trans_str_list))
+
+ with open("postopt_trans_lol.json", 'w') as config_file_path:
+ json.dump(result_dict, config_file_path, indent=1) # save to JSON
+ os.chdir(current_dir) # go back to initial dir
+ return result_dict
+
+
+
+"""
+This module contains the BatteryAging class. The battery aging objects enact on the battery object and update the
+battery capacity and resistance at each simulation time-step.
+"""
+
+import numpy as np
+import math
+
+
+
+[docs]
+class BatteryAging:
+ """
+ Current aging model is for LiNiMnCoO2 (NMC) battery cells. More aging models will be added in the future.
+
+ Link to Paper: https://www.sciencedirect.com/science/article/pii/S0378775314001876
+
+ Default Params from paper:
+ * beta_cap: capacity fade aging factor for cycle aging
+ * alpha_cap capacity fade aging factor for calendar aging
+ * beta_res: resistance growth aging factor for cycle aging
+ * alpha_res: resistance growth aging factor for calendar aging
+
+ Assumptions:
+ * Homogenous battery with dynamics modelled.
+ * Uniform aging across all cells.
+ * Constant temperature profile in vicinity of battery.
+
+ """
+ def __init__(self, datetime, num_steps, res=15):
+ """
+ Constructor for the BatteryAging class.
+
+ :param datetime: Unused for now.
+ :param num_steps: Number of steps in the simulation.
+ :param res: Resolution of the simulation in minutes.
+ """
+ self.num_steps = num_steps
+ self.time = 1 # because calendar aging is in days, so for each num time_steps for resolution
+ self.ambient_temp = 23 + 273 # absolute temp in K
+ self.aging_params = {} # to be updated later
+ self.num_daily_steps = 96 # to be configured later
+ self.res = res # minutes
+ self.cap = 4.85 # Ah
+ self.beta_caps = []
+
+
+[docs]
+ def get_cyc_aging(self, battery):
+ """
+ Calculates the resistance growth and capacity fade from cycle aging.
+
+ :param battery: THe batt
+ :return:
+ """
+ SOC_vector = np.array(
+ battery.SOC_list[-(self.num_steps + 1):]) # change this to the list? Done after one complete day
+ # print("SOC is: ", SOC_vector)
+ # TODO: changed del DOD to absolute value!!
+ # print('SOC: ', SOC_vector)
+ del_DOD = np.abs(np.round(SOC_vector[0:self.num_steps] - SOC_vector[1:], 5)) # just for numerical convenience. Have this list be updated, given the resolution we want to solve!!!
+ # print("del DOD: ", del_DOD)
+ # print("Current Voltage is ", battery.voltage)
+ # del_DOD[del_DOD < 0] = 0 # remove the charging parts in profile to get DOD
+ del_DOD = np.sum(del_DOD) / 2 # total cycle depth is half one depth - DOUBLE-CHECK IF THIS IS ACCURATE
+ # del_DOD = np.max(SOC_vector) - np.min(SOC_vector) # this is not entirely accurate
+ real_voltage = np.array(battery.voltages[-2:]) / battery.topology[0] # this should include the prior voltage no?
+ avg_voltage = np.sqrt(np.average(real_voltage ** 2)) # quadratic mean voltage for aging
+ # print("average voltage: ", avg_voltage, "regular avg: ", np.average(real_voltage))
+ beta_cap = 7.348 * 10**-3 * (avg_voltage - 3.695)**2 + 7.6 * 10**-4 + 4.081 * 10**-3 * del_DOD
+ beta_cap /= 4880.285045
+ # print('Beta Cap is, ', beta_cap)
+ beta_res = 2.153 * 10**-4 * (avg_voltage - 3.725)**2 - 1.521 * 10**-5 + 2.798 * 10**-4 * del_DOD
+ beta_minimum = 1.5 * 10**-5
+ if beta_res < beta_minimum:
+ beta_res = beta_minimum # there is a minimum aging factor that needs to be fixed
+ Q = np.abs(battery.current / battery.topology[1] * self.res / 60) # in Ah
+
+ capacity_fade = beta_cap * Q ** 0.5 # time is one day for both
+ # capacity_fade = beta_cap * Qmax**0.5 * 2.15 / battery.cell_nominal_cap # time is one day for both
+ battery.cycle_aging.append(capacity_fade)
+ # print('Q: {}, del DOD: {}, cap fade: {}'.format(Q, del_DOD, capacity_fade))
+ resistance_growth = beta_res * Q
+ # resistance_growth = beta_res * Q * 2.15 / battery.cell_nominal_cap
+ battery.true_capacity_loss = capacity_fade
+ self.beta_caps.append(beta_cap)
+ # print("Aging factor beta,", beta_cap)
+ # change return function to np.sum later after debugging
+ return capacity_fade, np.sum(resistance_growth)
+
+
+
+[docs]
+ def update_capacity(self, battery):
+ """
+ Updates the capacity of the battery based on the aging model adopted from Schmalsteig Et. Al.
+
+ :param battery: Battery object.
+ :return: None. Updates the battery object capacity.
+ """
+ cap_fade = self.get_aging_value(battery)[0]
+ battery.SOH -= cap_fade # change this to nom rating
+ battery.SOH_track += battery.SOH,
+ battery.cap = battery.SOH * battery.cell_nominal_cap
+ battery.Qmax = battery.max_SOC * battery.cap
+ battery.true_capacity_loss += cap_fade
+ battery.true_aging.append(cap_fade)
+
+
+
+[docs]
+ def update_resistance(self, battery):
+ """
+ Updates the resistance of the battery based on the aging model adopted from Schmalsteig Et. Al.
+
+ :param battery: Battery object.
+ :return: None. Updates the battery object resistance.
+ """
+ res_growth = self.get_aging_value(battery)[1]
+ battery.R_cell += res_growth
+ battery.resistance_growth += res_growth
+
+
+
+[docs]
+ def get_calendar_aging(self, battery):
+ """
+ Returns the calendar aging of the battery object.
+
+ :param battery: The battery object.
+ :return: A tuple of capacity fade and resistance growth due to calendar aging.
+ """
+ voltages = np.array(battery.voltages[-2:]) / battery.topology[0] # this should include the prior voltage no?
+ avg_voltage = np.average(voltages) # mean voltage for aging
+ # THIS MUST BE ESTIMATED IN DAYS
+ alpha_cap = (7.543 * avg_voltage - 23.75) * 10**6 * math.exp(-6976 / self.ambient_temp) # aging factors
+ alpha_res = (5.270 * avg_voltage - 16.32) * 10**5 * math.exp(-5986 / self.ambient_temp) # temp in K
+ alpha_cap /= 4880.285045 # scaling factor to match our data
+ capacity_fade = alpha_cap * (self.time / self.num_daily_steps)**0.75
+ # for each time-step (this is scaled up for current cell)
+ resistance_growth = alpha_res * (self.time / self.num_daily_steps) ** 0.75
+ # for each time-step (this is scaled up for current cell)
+ # battery.true_capacity_loss = capacity_fade # this is wrong
+ if isinstance(capacity_fade, float):
+ battery.calendar_aging.append(capacity_fade)
+ return capacity_fade, resistance_growth # due to interval which degradation is implemented
+ return sum(capacity_fade), sum(resistance_growth)
+
+
+
+[docs]
+ def get_total_aging(self, battery: object):
+ """
+ Returns the total capacity fade of the battery object. This includes both cycle and calendar aging.
+
+ :param object battery: The battery (pack) object.
+ :return: Total calendar + cycle aging of the battery.
+ """
+ return self.get_cyc_aging(battery) + self.get_calendar_aging(battery)
+
+
+
+[docs]
+ def get_aging_value(self, battery):
+ """
+ Returns the total capacity fade and resistance growth of the battery object.
+
+ :param battery: The battery (pack) object.
+ :return: List of total capacity fade and resistance growth of the battery.
+ """
+ cap_fade_cycle, res_growth_cycle = self.get_cyc_aging(battery) # this infers first
+ cap_fade_calendar, res_growth_cal = self.get_calendar_aging(battery)
+ # print("Cycle aging: {}, Calendar aging: {}".format(cap_fade_cycle, cap_fade_calendar))
+ capacity_fade = cap_fade_cycle + cap_fade_calendar
+ res_growth = res_growth_cal + res_growth_cycle
+ return [capacity_fade, res_growth]
+
+
+
+[docs]
+ def run(self, battery):
+ """
+ Runs the aging model for the battery object.
+
+ :param battery: The battery (pack) object.
+ :return: None. Updates the battery object.
+ """
+ self.update_capacity(battery)
+
+ # print("Battery Aging and Response Estimated")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"""This file hosts the class for capacitors. Future work"""
+#TODO: develop new class for super-caps for future study: Modelling, constraints, and features
+
+
+
+
+"""
+This module contains the class that loads the electricity price data and structure used for sampling prices during
+simulation.
+
+Based on the prices.json config file, this module will load the desired price TOU rate file that will be used in
+optimization problem. The default is the PGE_BEV2_S rate file, which is valid for California, however users can load
+their own TOU rate file. The prices are loaded into a numpy array and can be sampled from during simulation.
+The prices are sampled based on the month of the year and the hour of the day.
+"""
+
+import numpy as np
+import pandas as pd
+
+# Old (legacy) reference below:
+# https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_EV.pdf
+# load_profile is a 24x1 array with kWh consumed in each our of the day, starting at 0:00
+# Rates in $/kWh based on "Residential TOU Service for Plug-In EV2"
+# Rates in $/kWh based on "Commercial TOU Service for Plug-In EV2"
+# Peak (weekday) = 4 to 9 PM
+# Partial-peak (weekday) = 3 to 4 PM, 9 to 12 AM
+# Off-peak: all other times
+
+
+
+[docs]
+class PriceLoader:
+ """This class pre-loads prices and is used to sample prices that are used for optimization of EVSE profits/costs
+ during charging simulation.
+
+ :type config: dict
+ :param config: Configuration dictionary for the price loader.
+ :param path_prefix: This string path prefix is obtained first based on your repository location to set the
+ correct path for obtaining the data.
+ """
+
+ def __init__(self, config, path_prefix=None):
+ """
+ Initializes the PriceLoader class.
+
+ :type config: dict
+ :param config: Configuration dictionary for the price loader.
+ :param path_prefix: This string path prefix is obtained first based on your repository location to set the
+ correct path for obtaining the data.
+ """
+ self.path_prefix = path_prefix
+ self.config = config
+ self.data = pd.read_csv(path_prefix + self.config["data_path"])
+ self.data_np = self.data.to_numpy()
+ self.month_start_idx = {1: 0, 2: 31, 3: 59, 4: 90, 5: 120, 6: 151, 7: 181, 8: 243, 9: 273, 10: 304, 11: 334,
+ 12: 365}
+ self.month = -100 # Default value.
+
+
+[docs]
+ def get_prices(self, start_idx, num_steps, month=7):
+ """
+ Returns time-of-use (TOU) rate prices from data. This assumes TOU rates do not change day-to-day.
+
+ :param int start_idx: Starting index from which to price vector will start.
+ :param int num_steps: Cardinality of the price vector being returned.
+ :param int month: Month for which the price vector will be obtained (for example, 1 - Jan, 12 - December).
+ :return ndarray price_vector: The TOU price vector, which is a numpy array.
+ """
+ price_vector = self.data_np[start_idx:start_idx + num_steps]
+ price_vector = price_vector.reshape(-1, 1)
+ return price_vector
+
+
+
+[docs]
+ def set_month_data(self, month):
+ """
+ Sets the month for which the prices will be obtained.
+
+ :param month: Month to set the data to.
+ :return: None.
+ """
+ if self.month != month:
+ self.data_np = self.data.to_numpy()[self.month_start_idx[month] * 96:self.month_start_idx[month + 1] * 96]
+
+
+
+[docs]
+ def downscale(self, input_res, output_res):
+ """
+ Downscales the price data into a finer resolution, similar to the downscaling method in Pandas.
+ Typically only used once.
+
+ :param input_res: Resolution of the input data.
+ :param output_res: Resolution of the output data.
+ :return: None. Saves output data to a csv file.
+ """
+ input_data_shape = len(self.data_np[:, 0])
+ num_repetitions = int(input_res / output_res)
+ assert num_repetitions == 4 # JUST AN INITIAL CHECK, REMOVE LATER
+ temp_data = np.zeros(input_data_shape * num_repetitions)
+ start_idx = 0
+ for datapoint in self.data_np:
+ # print(datapoint)
+ temp_data[start_idx:start_idx + num_repetitions] = datapoint
+ start_idx += 4
+ self.data = pd.DataFrame(data=temp_data)
+ self.data_np = temp_data
+ # IMPORTANT: Change the paths below to save new data.
+ np.savetxt(self.path_prefix + "/elec_rates/PGE_BEV2_S_annual_TOU_rate_{}min.csv".format(output_res), temp_data)
+
+
+
+
+
+[docs]
+def main():
+ """This is only run to generate new downscaled data or for testing."""
+ import os
+ import json
+ path_prefix = os.getcwd()
+ path_prefix = path_prefix[0:path_prefix.index('EV50_cosimulation')] + 'EV50_cosimulation'
+ path_prefix = path_prefix.replace('\\', '/')
+ with open(path_prefix + '/charging_sim/configs/prices.json', "r") as f:
+ config = json.load(f)
+ loader = PriceLoader(config, path_prefix=path_prefix)
+ desired_res = 15 # units are in minutes
+ loader.downscale(config['resolution'], desired_res)
+
+
+
+if __name__ == "__main__":
+ main()
+
+"""Contains the Optimization class, which is used by controller to solve the optimization problem."""
+
+import cvxpy as cp
+
+
+
+[docs]
+class Optimization:
+ """
+ Constructor for the overall optimization problem solved by the optimization-based controller.
+
+ * Designed to include future cost functions such as transformer degradation and battery aging.
+ * Limited to convex and Mixed Integer programs, depending on the selected solver.
+ * Note, each desired solver must be installed separately on user's PC for a successful run.
+
+ :param objective_type: Type of objective problem being optimized.
+ :param objective: CVXPY objective function object.
+ :param controller: Controller object.
+ :param power_demand: Power demand at the Charging Station.
+ :param time_res: Time resolution of problem data.
+ :param transformer: Transformer object (optional, not implemented yet).
+ :param battery: Battery object.
+ :param time: Time Counter.
+ :param name: Optimization identifier.
+ :param solar: Solar Object.
+ :param str solver: Available backend solver to invoke (ECOS, MOSEK, GUROBI, etc.).
+
+ """
+
+ # TODO: change all refs to battery_constraints to call controller
+ def __init__(self, objective_type, objective, controller, power_demand, time_res, transformer, battery, time=0,
+ name=None, solar=None, solver='GUROBI'):
+
+ self._objective_type = objective_type
+ self._objective = objective
+ self._name = name
+ self._time = time
+ self._constraints = []
+ self.test_demand = power_demand
+ self.time_res = time_res
+ self.charge = 0
+ self.discharge = 0
+ self.transformer = transformer
+ self.battery = battery
+ self.solar = solar
+ self.controller = controller # update this somewhere else in simulation
+ self.problem = None
+ self.market_constraints = None
+ self.battery_constraints = controller.get_battery_constraints(power_demand)
+ self.cost_per_opt = []
+ self.solver = getattr(cp, solver)
+ if solar:
+ setattr(self, 'solar', solar)
+
+
+[docs]
+ def build_emissions_cost(self):
+ """
+ Builds emission cost to be included in the objective function (future work).
+
+ :return:
+ """
+ pass
+
+
+
+[docs]
+ def build_battery_cost(self):
+ """
+ Build battery cost (to be implemented in future version).
+
+ :return:
+ """
+ pass
+
+
+
+[docs]
+ def build_transformer_cost(self):
+ """
+ Build Transformer cost (to be implemented in future version).
+
+ :return:
+ """
+ pass
+
+
+
+[docs]
+ def add_demand_charge(self, charge):
+ """
+ Including demand charge in the objective function (Deprecated).
+
+ :param charge: Demand charge ($/kW).
+ :return:
+ """
+ load = 0 # placeholder
+ cost = charge * load + (self.controller.battery_power_charge +
+ self.controller.battery_power_discharge -
+ self.solar.battery_power - self.solar.ev_power)
+
+
+
+[docs]
+ def get_battery_constraint(self):
+ """
+ Returns the list of battery constraints within the controller.
+
+ :return: Battery constraints.
+ """
+ return self.battery_constraints
+
+
+
+[docs]
+ def aggregate_constraints(self):
+ """
+ Aggregates all the constraints into one constraint list within the object.
+
+ :return: None.
+ """
+ if self.battery_constraints: # fix this later to call battery directly
+ self._constraints.extend(self.battery_constraints)
+ if self.market_constraints:
+ self._constraints.extend(self.market_constraints)
+ if self.solar:
+ self._constraints.extend(self.solar.get_constraints())
+
+
+
+[docs]
+ def get_constraints(self):
+ """
+ Returns the constraints list.
+
+ :return: List of all constraints within the problem.
+ """
+ return self._constraints
+
+
+
+[docs]
+ def run(self):
+ """
+ Runs an instance of the optimization problem.
+
+ :return float: Optimal objective value.
+ """
+ self.aggregate_constraints() # aggregate constraints
+ problem = cp.Problem(cp.Minimize(self._objective), self._constraints)
+ self.problem = problem
+ result = problem.solve(solver=self.solver, verbose=False)
+ self.cost_per_opt.append(result)
+ # print(problem.status) ACTIVATE LATER
+ return result
+
+
+
+"""
+This module contains the Solar class. The solar class is used to simulate the solar power generation at a given site
+by sampling Global Horizontal Irradiance (GHI) data from the dataset of the desired location.
+"""
+
+import numpy as np
+import pandas as pd
+import cvxpy as cp
+
+
+
+[docs]
+class Solar:
+ """
+ This class is used to simulate the solar power generation at a given site by sampling Global Horizontal Irradiance
+ and estimating the solar generation, given the solar nameplate capacity that can be modified it its configuration
+ file `solar.json`. It also contains the optimization variables for the solar system.
+
+ The solar power generation is estimated using the following equation:
+
+ .. math::
+ P_{solar} = \min(P_{rated}, \eta * A * GHI).
+
+ Where :math:`P_{solar}` is the solar power generation, :math:`\eta` is the efficiency of the solar system,
+ :math:`P_{rated}` is the solar nameplate capacity, :math:`A` is the area of the solar panels, and :math:`GHI` is
+ the Global Horizontal Irradiance.
+
+ :param config: Solar configuration dictionary.
+ :param path_prefix: This string path prefix is obtained first based on your repository location to set the right path.
+ :param controller: Controller object for making decisions on flow of power from energy devices.
+ :param num_steps: Number of steps in the simulation.
+
+ """
+
+ def __init__(self, config, path_prefix=None, controller=None, num_steps=None):
+ """
+
+ :param config:
+ :param path_prefix:
+ :param controller:
+ :param num_steps:
+ """
+ self.path_prefix = path_prefix + '/'
+ self.config = config
+ cols = ['Month', 'Day', 'Hour', 'GHI', 'Temperature']
+ self.cols = cols
+ self.controller = controller
+ if num_steps:
+ self.num_steps = num_steps
+ else:
+ self.num_steps = self.config["num steps"]
+ self.solar_df = pd.read_csv(self.path_prefix+self.config["data_path"])[cols]
+ self.solar_vec = self.solar_df.to_numpy()
+ self.location = self.config["location"]
+ self.start_year = self.config["start_year"]
+ self.start_month = self.config["start_month"]
+ self.start_day = self.config["start_day"]
+ self.efficiency = self.config["efficiency"]
+ self.resolution = self.config["resolution"]
+ self.input_data_res = self.config["input_res"]
+ self.sample_start_idx = self.config["sample_start_idx"]
+ self.sample_end_idx = self.config["sample_end_idx"]
+ self.rating = self.config['rating'] * 1000 # convert from MW to kW
+ self.area = self.rating * 1000 / 150 # approximate area using 150W/m2
+ self.data = None
+ # self.data_np = None
+ self.data_np = self.solar_df[self.solar_df["Month"] == self.start_month]['GHI'].to_numpy()
+ self.battery_power = cp.Variable((self.num_steps, 1), nonneg=True) # solar power to battery
+ self.ev_power = cp.Variable((self.num_steps, 1), nonneg=True) # solar power to ev
+ self.grid_power = cp.Variable((self.num_steps, 1), nonneg=True) # TODO: consider including this in future work
+ self.power = None
+ self.constraints = []
+ self.month = self.start_month # initializing for the start of the simulation
+ self.id = None
+ self.node = None
+
+
+[docs]
+ def get_power(self, start_idx, num_steps, desired_shape=(96, 1), month=None):
+ if month is not None and self.month != month:
+ # GHI = Global Horizontal Irradiance
+ print("setting month for solar power...")
+ self.data_np = self.solar_df[self.solar_df["Month"] == month]['GHI'].to_numpy() # for one month
+ self.month = month # set month to current desired month
+ self.power = self.data_np[start_idx:start_idx+num_steps] / 1000 # convert to kW
+ self.power = np.minimum(self.rating, np.reshape(self.power, desired_shape) * self.efficiency * self.area)
+ # this ignores area for now. Can look at potential land-use/space use in future work
+ return self.power
+
+
+
+
+
+
+[docs]
+ def downscale(self, input_res, output_res):
+ """This is used only to initially downscale data to desired resolution"""
+ num_repetitions = int(input_res / output_res)
+ assert num_repetitions == 2 # JUST AN INITIAL CHECK, REMOVE LATER
+ temp_data = np.zeros((self.solar_vec.shape[0]*num_repetitions, self.solar_vec.shape[1]))
+ start_idx = 0
+ for datapoint in self.solar_vec:
+ # print(datapoint)
+ temp_data[start_idx:start_idx + num_repetitions] = datapoint
+ start_idx += num_repetitions
+ self.data = pd.DataFrame(data=temp_data, columns=self.cols)
+ self.data_np = temp_data
+ path_suffix = self.config['data_path'].split('-')[0]
+ self.data.to_csv(self.path_prefix+path_suffix + f"-{output_res}min.csv")
+
+
+
+[docs]
+ def get_solar_output(self):
+ return self.data_np * self.efficiency * self.area / 1000 # this is in kW
+
+
+
+[docs]
+ def get_constraints(self):
+ self.constraints = [self.battery_power + self.ev_power + self.grid_power == self.power]
+ return self.constraints
+
+
+
+[docs]
+ def update_history(self):
+ # CODE IS NOT UPDATING ALL THE ACTIONS SO THERE IS A BUG THERE
+ #TODO: add solar history update
+ return NotImplementedError
+
+
+
+
+
+[docs]
+def main():
+ """THis is mainly to testing or generating new data purposes"""
+ import os
+ import json
+ # load input data
+ path_prefix = os.getcwd()
+ path_prefix = path_prefix[:path_prefix.index('EV50_cosimulation')] + 'EV50_cosimulation'
+ path_prefix = path_prefix.replace('\\', '/')
+ with open(path_prefix+'/charging_sim/configs/solar.json', "r") as f:
+ config = json.load(f)
+ solar = Solar(config, path_prefix=path_prefix)
+ desired_res = 15
+ # input res, desired res
+ solar.downscale(30, desired_res)
+
+
+
+if __name__ == "__main__":
+ main()
+
+"""Maybe stores general configurations and general functions"""
+import cvxpy as cp
+import numpy as np
+import matplotlib.pyplot as plt
+
+day_hours = 24
+day_minutes = day_hours * 60
+resolution = 15 # minutes
+num_homes = 1
+num_steps = int(day_minutes / resolution) # number of time intervals in a day = 96
+month_days = {"January": 31, "February": 28, "March": 31, "April": 30, "May": 31, "June": 30, "July": 31,
+ "August": 31, "September": 30, "October": 30, "November": 30, "December": 31}
+
+objectives = {'Transformer Aging': [0, 0, 1],
+ "Electricity Cost": [1, 0, 0],
+ "Battery Degradation": [1, 200, 0],
+ 'Air Pollution': [],
+ "Mixed": [0.1, 1, 0],
+ "All": [1, 100, 1]} # modifies weight placed on multi-obj based on priority/case study
+
+
+
+[docs]
+def PGE_BEV2_S():
+ """Price schedule/TOU rate for PGE EVSE doc can be found here:"""
+ peak = 0.39601 # $/kWh
+ off_peak = 0.18278 # $/kWh
+ super_off_peak = 0.15951 # $/kWh
+ peak_times = ["4PM-9PM"]
+ off_peak_times = ["12AM-9AM", "2PM-4PM", "9PM-12AM"]
+ super_off_peak_times = ["9AM-2PM"]
+ hourly_prices = np.zeros((24,))
+ hourly_prices = load_prices(peak_times, peak, hourly_prices)
+ hourly_prices = load_prices(off_peak_times, off_peak, hourly_prices)
+ hourly_prices = load_prices(super_off_peak_times, super_off_peak, hourly_prices)
+ times = [f'{int(i)}:00' for i in range(24)]
+ plt.figure(figsize=(10, 8))
+ plt.rcParams.update({'font.size': 16})
+ plt.xticks(rotation=60, ha="right")
+ plt.plot(times, hourly_prices)
+ plt.xlabel("Hour of day")
+ plt.ylabel("TOU rate ($/kWh)")
+ plt.tight_layout()
+ plt.show()
+ # np.save
+ return hourly_prices
+
+
+
+
+[docs]
+def load_prices(time_intervals, price, price_vector):
+ for interval in time_intervals:
+ interval_list = interval.split('-')
+ for i in range(len(interval_list)):
+ if interval_list[i] == '12AM' and i == 0:
+ interval_list[i] = 0
+ elif interval_list[i] == '12AM':
+ interval_list[i] = 24
+ else:
+ interval_list[i] = int(interval_list[i][:-2]) if interval_list[i][-2] == 'A' else int(
+ interval_list[i][:-2]) + 12
+ price_vector[interval_list[0]:interval_list[1]] = price
+ return price_vector
+
+
+
+
+[docs]
+def build_electricity_cost(controller, load, energy_prices_TOU, demand_charge=False):
+ """Need to update from home load right now; maybe this can be useful in future opt."""
+ cost_electricity = cp.sum((cp.multiply(energy_prices_TOU, (load + controller.battery_power -
+ controller.solar.battery_power -
+ controller.solar.ev_power))))
+ if demand_charge:
+ demand_charge_cost = cp.max(cp.pos(load + (controller.battery_power_charge +
+ controller.battery_power_discharge -
+ controller.solar.battery_power -
+ controller.solar.ev_power)))
+ cost_electricity += demand_charge_cost
+ return cost_electricity
+
+
+
+
+[docs]
+def build_cost_PGE_BEV2S(controller, load, energy_prices_TOU, penalize_max_power=True, max_power_pen=1000):
+ """This will need to use a heuristic and take the average conservative estimate for gamma"""
+ net_grid_load = load + controller.battery_power - controller.solar.battery_power - controller.solar.ev_power
+ TOU_cost = cp.sum(cp.multiply(energy_prices_TOU, net_grid_load)) * controller.resolution/60 # ($)
+ smoothness_pen = np.mean(cp.abs(controller.battery_power[:-1] - controller.battery_power[1:]))
+ smoothness_alpha = 0
+ price_per_block = 95.56 # ($/Block)
+ overage_fee = 3.82 # ($/kW)
+ charging_block = controller.pge_gamma * 50 # gamma is an integer variable that's at least 1
+ subscription_cost = controller.pge_gamma * price_per_block # This is in blocks of 50kW which makes it very convenient ($/day)
+ penalty_cost = cp.max(cp.neg(charging_block - net_grid_load) * overage_fee) # ($)
+ if penalize_max_power:
+ return subscription_cost + penalty_cost + TOU_cost + max_power_pen * cp.max(cp.abs(net_grid_load))
+ # return subscription_cost + penalty_cost + TOU_cost + max_power_pen*cp.max(net_grid_load)
+ return subscription_cost + penalty_cost + TOU_cost + smoothness_pen * smoothness_alpha
+
+
+
+
+[docs]
+def build_objective(mode, electricity_cost, battery_degradation_cost, transformer_cost=0):
+ """Builds the objective function that we will minimize."""
+ lambdas = objectives[mode]
+ return cp.sum(
+ electricity_cost * lambdas[0]
+ + battery_degradation_cost * lambdas[1]
+ + transformer_cost * lambdas[2]
+ )
+
+
+
+
+[docs]
+def add_power_profile_to_object(battery, index, battery_power_profile):
+ if 1 <= index <= 31:
+ battery.power_profile['Jan'].append(battery_power_profile)
+ if 32 <= index <= 59:
+ battery.power_profile['Feb'].append(battery_power_profile)
+ if 60 <= index <= 90:
+ battery.power_profile['Mar'].append(battery_power_profile)
+ if 91 <= index <= 120:
+ battery.power_profile['Apr'].append(battery_power_profile)
+ if 121 <= index <= 151:
+ battery.power_profile['May'].append(battery_power_profile)
+ if 152 <= index <= 181:
+ battery.power_profile['Jun'].append(battery_power_profile)
+ if 182 <= index <= 212:
+ battery.power_profile['Jul'].append(battery_power_profile)
+ if 213 <= index <= 233:
+ battery.power_profile['Aug'].append(battery_power_profile)
+ if 234 <= index <= 263:
+ battery.power_profile['Sep'].append(battery_power_profile)
+ if 264 <= index <= 294:
+ battery.power_profile['Oct'].append(battery_power_profile)
+ if 295 <= index <= 334:
+ battery.power_profile['Nov'].append(battery_power_profile)
+ if 335 <= index <= 365:
+ battery.power_profile['Dec'].append(battery_power_profile)
+
+
+
+if __name__ == '__main__':
+ PGE_BEV2_S()
+
+"""
+Functions for modifying GridLAB-D power system simulation models
+"""
+import os
+
+
+
+[docs]
+def load_base_glm(base_file_dir, base_glm_file):
+ """
+ Loads the glm as list and populates it into dict and returns the output
+
+ :param base_file_dir:
+ :param base_glm_file:
+ :return:
+ """
+ os.chdir(base_file_dir)
+ f = open(base_glm_file, 'r')
+ glm=f.readlines()
+
+ glm_dict={}
+ obj_type={}
+ glm_list=list()
+ globals_list=list()
+ include_list=list()
+ sync_list=list()
+
+ #edit out all comments
+ for l in glm:
+ line_temp=l.lstrip().rstrip().rstrip('\n').split('//')[0] # is the // encoding something
+ #Comment somewhere in line
+ if len(line_temp)>1:
+ #There is some content in line, extract content
+ if l.split('//')[0]!='':
+ glm_list.append(line_temp.rstrip()) # this adds to glm list lines that are not comments
+ #No comment in line
+ else:
+ #Line is not a space
+ if line_temp!='':
+ glm_list.append(line_temp)
+
+ obj_num=0
+ obj_flag=0
+ #put info into dict structure
+ for l in glm_list:
+ #Setting global variable
+ if l[0:4]=='#set':
+ globals_list.append(l)
+ elif l[0:8]=='#include':
+ include_list.append(l)
+ elif 'object' in l:
+ obj_flag=1
+ line_temp=l.rstrip('{').rstrip().split(' ')
+ obj_type[obj_num]={'object':line_temp[1]}
+ prop_num=0
+ elif ('class' in l) and obj_flag==0:
+ obj_flag=1
+ line_temp=l.rstrip('{').rstrip().split(' ')
+ obj_type[obj_num]={'class':line_temp[1]}
+ prop_num=0
+ elif 'module' in l:
+ obj_flag=1
+ line_temp=l.rstrip('{').rstrip().split(' ')
+ #if no properties in object
+ if ';' in line_temp[1]:
+ obj_type[obj_num]={'module':line_temp[1].rstrip(';')}
+ obj_flag=0
+ glm_dict[obj_num]={}
+ obj_num=obj_num+1
+ #if properties in object
+ else:
+ obj_type[obj_num]={'module':line_temp[1]}
+ obj_flag=1
+ prop_num=0
+ elif 'clock' in l:
+ obj_flag=1
+ obj_type[obj_num]={'clock':'clock'}
+ prop_num=0
+ elif 'script' in l:
+ sync_list.append(l)
+
+
+ elif l=='}' or l=='};':
+ obj_num=obj_num+1
+ obj_flag=0
+ else:
+ if obj_flag==1:
+ line_temp=l.split(' ',maxsplit=1)
+ if prop_num==0:
+ glm_dict[obj_num]={line_temp[0]:line_temp[1].rstrip(';')}
+ prop_num=prop_num+1
+ else:
+ glm_dict[obj_num][line_temp[0]]=line_temp[1].rstrip(';')
+ else:
+ print('error')
+ print(l)
+ return glm_dict,obj_type,globals_list,include_list,sync_list
+
+
+
+
+[docs]
+def write_base_glm(glm_dict,obj_type,globals_list,include_list,out_dir,file_name,sync_list):
+ """
+ Writes the glm file from the dict structure.
+
+ :param glm_dict:
+ :param obj_type:
+ :param globals_list:
+ :param include_list:
+ :param out_dir:
+ :param file_name:
+ :param sync_list:
+ :return:
+ """
+ os.chdir(out_dir)
+ glm_out = open(file_name,"w+")
+
+
+ for i in range(len(globals_list)):
+ glm_out.write(globals_list[i]+'\n\n')
+
+ for i in glm_dict.keys():
+ #for i in range(len(glm_dict)):
+ if 'clock' in obj_type[i].keys():
+ write_clock_dict(glm_out,glm_dict[i])
+
+ for i in glm_dict.keys():
+ #for i in range(len(glm_dict)):
+ if 'module' in obj_type[i].keys():
+ write_mod_dict(glm_out,glm_dict[i],obj_type[i]['module'])
+
+ for i in range(len(include_list)):
+ glm_out.write(include_list[i]+'\n\n')
+
+ for i in glm_dict.keys():
+ if 'filter' in obj_type[i].keys():
+ write_filter_dict(glm_out,glm_dict[i],obj_type[i]['filter'])
+
+ for i in glm_dict.keys():
+ if 'class' in obj_type[i].keys():
+ write_class_dict(glm_out,glm_dict[i],obj_type[i]['class'])
+
+ for i in glm_dict.keys():
+ #for i in range(len(glm_dict)):
+ if 'object' in obj_type[i].keys():
+ if 'player' in obj_type[i]['object']:
+ write_obj_dict(glm_out,glm_dict,i,obj_type[i]['object'])
+
+ for i in glm_dict.keys():
+ #for i in range(len(glm_dict)):
+ if 'object' in obj_type[i].keys():
+ if ('player' in obj_type[i]['object'])==False:
+ write_obj_dict(glm_out,glm_dict,i,obj_type[i]['object'])
+
+ for i in range(len(sync_list)):
+ glm_out.write(sync_list[i]+'\n\n')
+
+ glm_out.close()
+
+
+
+
+[docs]
+def write_obj_dict(file,gld_dict,dict_key,obj_type):
+ """
+ Write dictionary corresponding to GLD objects to .glm file.
+
+ :param file:
+ :param gld_dict:
+ :param dict_key:
+ :param obj_type:
+ :return:
+ """
+ if dict_key==-1:
+ file.write('object '+obj_type+' {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+ else:
+ file.write('object '+obj_type+' {\n')
+ for i,j in gld_dict[dict_key].items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def write_mod_dict(file,gld_dict,mod_name):
+ """
+ Write dictionary corresponding to GLD module to .glm file.
+
+ :param file:
+ :param gld_dict:
+ :param mod_name:
+ :return:
+ """
+ if len(gld_dict)==0:
+ file.write('module '+mod_name+';\n\n')
+ else:
+ file.write('module '+mod_name+' {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def write_class_dict(file,gld_dict,class_name):
+ """
+ Write dictionary corresponding to GLD class to .glm file.
+
+ :param file:
+ :param gld_dict:
+ :param class_name:
+ :return:
+ """
+ if len(gld_dict)==0:
+ file.write('class '+class_name+';\n\n')
+ else:
+ file.write('class '+class_name+' {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def write_filter_dict(file,gld_dict,class_name):
+ """
+ Write dictionary corresponding to GLD filter to .glm file.
+
+ :param file:
+ :param gld_dict:
+ :param class_name:
+ :return:
+ """
+ if len(gld_dict)==0:
+ file.write('filter '+class_name+';\n\n')
+ else:
+ file.write('filter '+class_name+' {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def write_clock_dict(file,gld_dict):
+ """
+ Write dictionary corresponding to GLD clock to .glm file.
+
+ :param file:
+ :param gld_dict:
+ :return:
+ """
+ file.write('clock {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def replace_load_w_meter_old(glm_dict,match_str,rep_str,obj_type):
+ """
+ Replace all instances of load in glm_dict with meter.
+
+ :param glm_dict:
+ :param match_str:
+ :param rep_str:
+ :param obj_type:
+ :return:
+ """
+ replace_prop_list=list()
+ for i in glm_dict.keys():
+ if match_str in glm_dict[i].values():
+ replace_prop_list.append(i)
+ for i in replace_prop_list:
+ for prop in glm_dict[i].keys():
+ if glm_dict[i][prop]==match_str:
+ glm_dict[i][prop]=rep_str
+ if obj_type[i]['object']=='load' and prop[0:8]=='constant':
+ delete_index=i
+ delete_prop=prop
+
+ if obj_type[i]['object']=='load':
+ obj_type[i]['object']='meter'
+ del glm_dict[delete_index][delete_prop]
+ return glm_dict
+
+
+
+
+[docs]
+def replace_load_w_meter(glm_dict,match_str,rep_str,obj_type):
+ """
+ Replace all instances of load in glm_dict with meter.
+
+ :param glm_dict:
+ :param match_str:
+ :param rep_str:
+ :param obj_type:
+ :return:
+ """
+ replace_prop_list=list()
+ for i in glm_dict.keys():
+ if match_str in glm_dict[i].values():
+ replace_prop_list.append(i)
+ delete_index_list=[]
+ delete_prop_list=[]
+ for i in replace_prop_list:
+ for prop in glm_dict[i].keys():
+ if glm_dict[i][prop]==match_str:
+ glm_dict[i][prop]=rep_str
+ if obj_type[i]['object']=='load' and prop[0:8]=='constant':
+ delete_index_list.append(i)
+ delete_prop_list.append(prop)
+
+ if obj_type[i]['object']=='load':
+ obj_type[i]['object']='meter'
+ for i in range(len(delete_index_list)):
+ del glm_dict[delete_index_list[i]][delete_prop_list[i]]
+ return glm_dict
+
+
+"""
+Module contains functions for modifying GridLAB-D power system simulation models
+"""
+import os
+
+
+
+[docs]
+def load_base_glm(base_file_dir,base_glm_file):
+ """
+ Loads base glm file into a dictionary structure.
+
+ :param base_file_dir:
+ :param base_glm_file:
+ :return:
+ """
+
+ os.chdir(base_file_dir)
+ f = open(base_glm_file, 'r')
+ glm=f.readlines()
+
+ glm_dict={}
+ obj_type={}
+ glm_list=list()
+ globals_list=list()
+ include_list=list()
+ sync_list=list()
+
+ #edit out all comments
+ for l in glm:
+ line_temp=l.lstrip().rstrip().rstrip('\n').split('//')[0]
+ #Comment somewhere in line
+ if len(line_temp)>1:
+ #There is some content in line, extract content
+ if l.split('//')[0]!='':
+ glm_list.append(line_temp.rstrip())
+ #No comment in line
+ else:
+ #Line is not a space
+ if line_temp!='':
+ glm_list.append(line_temp)
+
+ obj_num=0
+ obj_flag=0
+ #put info into dict structure
+ for l in glm_list:
+ #Setting global variable
+ if l[0:4]=='#set':
+ globals_list.append(l)
+ elif l[0:8]=='#include':
+ include_list.append(l)
+ elif 'object' in l:
+ obj_flag=1
+ line_temp=l.rstrip('{').rstrip().split(' ')
+ obj_type[obj_num]={'object':line_temp[1]}
+ prop_num=0
+ elif ('class' in l) and obj_flag==0:
+ obj_flag=1
+ line_temp=l.rstrip('{').rstrip().split(' ')
+ obj_type[obj_num]={'class':line_temp[1]}
+ prop_num=0
+ elif 'module' in l:
+ obj_flag=1
+ line_temp=l.rstrip('{').rstrip().split(' ')
+ #if no properties in object
+ if ';' in line_temp[1]:
+ obj_type[obj_num]={'module':line_temp[1].rstrip(';')}
+ obj_flag=0
+ glm_dict[obj_num]={}
+ obj_num=obj_num+1
+ #if properties in object
+ else:
+ obj_type[obj_num]={'module':line_temp[1]}
+ obj_flag=1
+ prop_num=0
+ elif 'clock' in l:
+ obj_flag=1
+ obj_type[obj_num]={'clock':'clock'}
+ prop_num=0
+ elif 'script' in l:
+ sync_list.append(l)
+
+
+ elif l=='}' or l=='};':
+ obj_num=obj_num+1
+ obj_flag=0
+ else:
+ if obj_flag==1:
+ line_temp=l.split(' ',maxsplit=1)
+ if prop_num==0:
+ glm_dict[obj_num]={line_temp[0]:line_temp[1].rstrip(';')}
+ prop_num=prop_num+1
+ else:
+ glm_dict[obj_num][line_temp[0]]=line_temp[1].rstrip(';')
+ else:
+ print('error')
+ print(l)
+ return glm_dict,obj_type,globals_list,include_list,sync_list
+
+
+
+
+[docs]
+def write_base_glm(glm_dict,obj_type,globals_list,include_list,out_dir,file_name,sync_list):
+ """
+
+ :param glm_dict:
+ :param obj_type:
+ :param globals_list:
+ :param include_list:
+ :param out_dir:
+ :param file_name:
+ :param sync_list:
+ :return:
+ """
+ os.chdir(out_dir)
+ glm_out = open(file_name,"w+")
+
+
+ for i in range(len(globals_list)):
+ glm_out.write(globals_list[i]+'\n\n')
+
+ for i in glm_dict.keys():
+ #for i in range(len(glm_dict)):
+ if 'clock' in obj_type[i].keys():
+ write_clock_dict(glm_out,glm_dict[i])
+
+ for i in glm_dict.keys():
+ #for i in range(len(glm_dict)):
+ if 'module' in obj_type[i].keys():
+ write_mod_dict(glm_out,glm_dict[i],obj_type[i]['module'])
+
+ for i in range(len(include_list)):
+ glm_out.write(include_list[i]+'\n\n')
+
+ for i in glm_dict.keys():
+ if 'filter' in obj_type[i].keys():
+ write_filter_dict(glm_out,glm_dict[i],obj_type[i]['filter'])
+
+ for i in glm_dict.keys():
+ if 'class' in obj_type[i].keys():
+ write_class_dict(glm_out,glm_dict[i],obj_type[i]['class'])
+
+ for i in glm_dict.keys():
+ #for i in range(len(glm_dict)):
+ if 'object' in obj_type[i].keys():
+ if 'player' in obj_type[i]['object']:
+ write_obj_dict(glm_out,glm_dict,i,obj_type[i]['object'])
+
+ for i in glm_dict.keys():
+ #for i in range(len(glm_dict)):
+ if 'object' in obj_type[i].keys():
+ if ('player' in obj_type[i]['object'])==False:
+ write_obj_dict(glm_out,glm_dict,i,obj_type[i]['object'])
+
+ for i in range(len(sync_list)):
+ glm_out.write(sync_list[i]+'\n\n')
+
+ glm_out.close()
+
+
+
+
+[docs]
+def write_obj_dict(file,gld_dict,dict_key,obj_type):
+ """
+ Write dictionary corresponding to GLD objects to .glm file
+
+ :param file:
+ :param gld_dict:
+ :param dict_key:
+ :param obj_type:
+ :return:
+ """
+ if dict_key==-1:
+ file.write('object '+obj_type+' {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+ else:
+ file.write('object '+obj_type+' {\n')
+ for i,j in gld_dict[dict_key].items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def write_mod_dict(file,gld_dict,mod_name):
+ """
+ Write dictionary corresponding to GLD module to .glm file'
+
+ :param file:
+ :param gld_dict:
+ :param mod_name:
+ :return:
+ """
+ if len(gld_dict)==0:
+ file.write('module '+mod_name+';\n\n')
+ else:
+ file.write('module '+mod_name+' {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def write_class_dict(file,gld_dict,class_name):
+ """
+ Write dictionary corresponding to GLD class to .glm file.
+
+ :param file:
+ :param gld_dict:
+ :param class_name:
+ :return:
+ """
+ if len(gld_dict)==0:
+ file.write('class '+class_name+';\n\n')
+ else:
+ file.write('class '+class_name+' {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def write_filter_dict(file,gld_dict,class_name):
+ """
+ Write dictionary corresponding to GLD filter to .glm file.
+
+ :param file:
+ :param gld_dict:
+ :param class_name:
+ :return:
+ """
+ if len(gld_dict)==0:
+ file.write('filter '+class_name+';\n\n')
+ else:
+ file.write('filter '+class_name+' {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def write_clock_dict(file,gld_dict):
+ """
+ Write dictionary corresponding to GLD clock to .glm file.
+
+ :param file:
+ :param gld_dict:
+ :return:
+ """
+ file.write('clock {\n')
+ for i,j in gld_dict.items():
+ file.write('\t'+str(i)+' '+str(j)+';\n')
+ file.write('}\n\n')
+
+
+
+
+[docs]
+def replace_load_w_meter_old(glm_dict,match_str,rep_str,obj_type):
+ """
+ Replace load with meter in GLM dictionary.
+
+ :param glm_dict:
+ :param match_str:
+ :param rep_str:
+ :param obj_type:
+ :return:
+ """
+ replace_prop_list=list()
+ for i in glm_dict.keys():
+ if match_str in glm_dict[i].values():
+ replace_prop_list.append(i)
+ for i in replace_prop_list:
+ for prop in glm_dict[i].keys():
+ if glm_dict[i][prop]==match_str:
+ glm_dict[i][prop]=rep_str
+ if obj_type[i]['object']=='load' and prop[0:8]=='constant':
+ delete_index=i
+ delete_prop=prop
+
+ if obj_type[i]['object']=='load':
+ obj_type[i]['object']='meter'
+ del glm_dict[delete_index][delete_prop]
+ return glm_dict
+
+
+
+
+[docs]
+def replace_load_w_meter(glm_dict,match_str,rep_str,obj_type):
+ """
+ Replace load with meter in GLM dictionary.
+
+ :param glm_dict:
+ :param match_str:
+ :param rep_str:
+ :param obj_type:
+ :return:
+ """
+ replace_prop_list=list()
+ for i in glm_dict.keys():
+ if match_str in glm_dict[i].values():
+ replace_prop_list.append(i)
+ delete_index_list=[]
+ delete_prop_list=[]
+ for i in replace_prop_list:
+ for prop in glm_dict[i].keys():
+ if glm_dict[i][prop]==match_str:
+ glm_dict[i][prop]=rep_str
+ if obj_type[i]['object']=='load' and prop[0:8]=='constant':
+ delete_index_list.append(i)
+ delete_prop_list.append(prop)
+
+ if obj_type[i]['object']=='load':
+ obj_type[i]['object']='meter'
+ for i in range(len(delete_index_list)):
+ del glm_dict[delete_index_list[i]][delete_prop_list[i]]
+ return glm_dict
+
+
' + + '' + + _("Hide Search Matches") + + "
" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/build/analysis.html b/docs/build/analysis.html new file mode 100644 index 000000000..2d6b316da --- /dev/null +++ b/docs/build/analysis.html @@ -0,0 +1,297 @@ + + + + + + +This module contains the CostEstimator Class, which estimates the cost of the different grid and DER components +from the simulation.
+Bases: object
This class is used to calculate levelized cost of DER assets in EV-Ecosim.
+num_days – The number of days for which the calculation is run.
+Calculates the battery costs and updates the different cost components, including LCOE.
+result_dir – Directory in which to save the results dictionary.
+Dictionary of results.
+Calculates the overall electricity PGEBEV2S cost for a given scenario.
+result_dir (str) – Directory in which the result is saved.
PGE_separate_file –
A dictionary comprising all the cost components and their dollar amounts.
+Values are pulled from the NREL solar cost calculator. +Ref: https://www.nrel.gov/solar/market-research-analysis/solar-levelized-cost.html +To be deprecated soon.
+None
+Estimates the expected transformer loss of life.
+Reference:
+5.11.3 of IEEE Std C57.12.00-2010 a minimum normal insulation life expectancy of 180 000 hours is expected.
result_dir – Directory in which the loss results is saved.
+Dictionary of transformer losses.
+Creates plots overlaying load and net loads for post-simulation visualization.
+total_load – Overall EV load demand at node, can include building load if controllable.
net_load – total_load minus DER buffer.
prefix – Plot file label prefix.
labels – Legend labels for each plotted curve.
None.
+Plots the controller predicted and true power of the battery system.
+power – True power.
power_pred – Controller predicted power.
prefix – Plot file label prefix.
labels – Legend labels for each plotted curve.
None.
+Plots the controller predicted and true state of charge of the battery system.
+soc – True state of charge.
soc_pred – Controller predicted state of charge.
prefix – Plot file label prefix.
labels – Legend labels for each plotted curve.
None.
+This module runs the post-simulation cost calculations for DER assets and transformer aging. +This module also estimates the voltage violations within the distribution network.
+This module contains the BatteryAging class. The battery aging objects enact on the battery object and update the +battery capacity and resistance at each simulation time-step.
+Bases: object
Current aging model is for LiNiMnCoO2 (NMC) battery cells. More aging models will be added in the future.
+Link to Paper: https://www.sciencedirect.com/science/article/pii/S0378775314001876
+beta_cap: capacity fade aging factor for cycle aging
alpha_cap capacity fade aging factor for calendar aging
beta_res: resistance growth aging factor for cycle aging
alpha_res: resistance growth aging factor for calendar aging
Homogenous battery with dynamics modelled.
Uniform aging across all cells.
Constant temperature profile in vicinity of battery.
Returns the total capacity fade and resistance growth of the battery object.
+battery – The battery (pack) object.
+List of total capacity fade and resistance growth of the battery.
+Returns the calendar aging of the battery object.
+battery – The battery object.
+A tuple of capacity fade and resistance growth due to calendar aging.
+Calculates the resistance growth and capacity fade from cycle aging.
+battery – THe batt
+Returns the total capacity fade of the battery object. This includes both cycle and calendar aging.
+battery (object) – The battery (pack) object.
+Total calendar + cycle aging of the battery.
+Runs the aging model for the battery object.
+battery – The battery (pack) object.
+None. Updates the battery object.
+This file hosts the class for capacitors. Future work
+ + +This module contains the class that loads the electricity price data and structure used for sampling prices during +simulation.
+Based on the prices.json config file, this module will load the desired price TOU rate file that will be used in +optimization problem. The default is the PGE_BEV2_S rate file, which is valid for California, however users can load +their own TOU rate file. The prices are loaded into a numpy array and can be sampled from during simulation. +The prices are sampled based on the month of the year and the hour of the day.
+Bases: object
This class pre-loads prices and is used to sample prices that are used for optimization of EVSE profits/costs +during charging simulation.
+config (dict) – Configuration dictionary for the price loader.
path_prefix – This string path prefix is obtained first based on your repository location to set the
correct path for obtaining the data.
+Downscales the price data into a finer resolution, similar to the downscaling method in Pandas. +Typically only used once.
+input_res – Resolution of the input data.
output_res – Resolution of the output data.
None. Saves output data to a csv file.
+Returns time-of-use (TOU) rate prices from data. This assumes TOU rates do not change day-to-day.
+start_idx (int) – Starting index from which to price vector will start.
num_steps (int) – Cardinality of the price vector being returned.
month (int) – Month for which the price vector will be obtained (for example, 1 - Jan, 12 - December).
The TOU price vector, which is a numpy array.
+Contains the Optimization class, which is used by controller to solve the optimization problem.
+Bases: object
Constructor for the overall optimization problem solved by the optimization-based controller.
+Designed to include future cost functions such as transformer degradation and battery aging.
Limited to convex and Mixed Integer programs, depending on the selected solver.
Note, each desired solver must be installed separately on user’s PC for a successful run.
objective_type – Type of objective problem being optimized.
objective – CVXPY objective function object.
controller – Controller object.
power_demand – Power demand at the Charging Station.
time_res – Time resolution of problem data.
transformer – Transformer object (optional, not implemented yet).
battery – Battery object.
time – Time Counter.
name – Optimization identifier.
solar – Solar Object.
solver (str) – Available backend solver to invoke (ECOS, MOSEK, GUROBI, etc.).
Including demand charge in the objective function (Deprecated).
+charge – Demand charge ($/kW).
+Aggregates all the constraints into one constraint list within the object.
+None.
+Build battery cost (to be implemented in future version).
+Builds emission cost to be included in the objective function (future work).
+Build Transformer cost (to be implemented in future version).
+Returns the list of battery constraints within the controller.
+Battery constraints.
+This module contains the Solar class. The solar class is used to simulate the solar power generation at a given site +by sampling Global Horizontal Irradiance (GHI) data from the dataset of the desired location.
+Bases: object
This class is used to simulate the solar power generation at a given site by sampling Global Horizontal Irradiance +and estimating the solar generation, given the solar nameplate capacity that can be modified it its configuration +file solar.json. It also contains the optimization variables for the solar system.
+The solar power generation is estimated using the following equation:
+Where \(P_{solar}\) is the solar power generation, \(\eta\) is the efficiency of the solar system, +\(P_{rated}\) is the solar nameplate capacity, \(A\) is the area of the solar panels, and \(GHI\) is +the Global Horizontal Irradiance.
+config – Solar configuration dictionary.
path_prefix – This string path prefix is obtained first based on your repository location to set the right path.
controller – Controller object for making decisions on flow of power from energy devices.
num_steps – Number of steps in the simulation.
Maybe stores general configurations and general functions
+Price schedule/TOU rate for PGE EVSE doc can be found here:
+This will need to use a heuristic and take the average conservative estimate for gamma
+Need to update from home load right now; maybe this can be useful in future opt.
+Functions for modifying GridLAB-D power system simulation models
+Loads the glm as list and populates it into dict and returns the output
+base_file_dir –
base_glm_file –
Replace all instances of load in glm_dict with meter.
+glm_dict –
match_str –
rep_str –
obj_type –
Replace all instances of load in glm_dict with meter.
+glm_dict –
match_str –
rep_str –
obj_type –
Writes the glm file from the dict structure.
+glm_dict –
obj_type –
globals_list –
include_list –
out_dir –
file_name –
sync_list –
Write dictionary corresponding to GLD class to .glm file.
+file –
gld_dict –
class_name –
Write dictionary corresponding to GLD clock to .glm file.
+file –
gld_dict –
Write dictionary corresponding to GLD filter to .glm file.
+file –
gld_dict –
class_name –
+ | + |
+ | + |
|
+
|
+
+ |
|
+
|
+
+ | + |
+ | + |
+ |
+ | + |
+ | + |
+ | + |
+ |
|
+
+ | + |
+ | + |
+"""
+This module hosts the Battery System Identification class used for fitting battery ECM model parameters from data.
+"""
+
+import numpy as np
+import matplotlib.pyplot as plt
+import copy
+
+import pandas as pd
+import pygad
+import cvxpy as cp
+
+
+
+[docs]
+class BatteryParams:
+ """
+ Battery system identification class with open circuit voltage correction scheme.
+ This class takes in dataframe or csv with some given fields during instantiation.\n
+
+ Dataframe fields (columns) must include the following literally and case-sensitive:
+
+ * current - battery/cell current time-series.
+ * voltage - corresponding battery/cell voltage time-series.
+ * soc - corresponding battery/cell state of charge time-series.
+ * ocv - corresponding battery/cell open circuit voltage time-series.
+
+ How to use:
+
+ * data = pd.read_csv(data_path). This loads a pandas dataframe.
+ * module = BatteryParams(data)
+ * module.run_sys_identification()
+ * module.plot_correction_scheme_comparison()
+
+ Writes new corrected open-circuit voltages and battery parameters to file within the folder. Can be downloaded via
+ the web-tool.
+
+ :param data: Battery test data from which to fit the identification params.
+ """
+ def __init__(self, data):
+ self.data = data
+ self.current = data.current.values
+ self.voltage = data.voltage.values
+ self.ocv = data.ocv.values
+ self.ocv_no_corr = data.ocv.values # Uncorrected open circuit voltage.
+ self.soc = data.soc.values
+ self.params = []
+ self.params_uncorr = []
+ self.init_params = [] # Can be initialized later.
+ self._default_population = [
+ [1.058596e-02, 5.93096e-02, -4.17993e+00, 1.58777e-02, 9.75325e+03, 7.45710e-03, 4.01823e+03],
+ [3.43209856e-02, 1.74575496e-02, -4.29315177e+00, 2.01081488e-04, 9.56317565e+03, 2.12122173e-03, 9.57647155e+03],
+ [2.30552317e-02, 8.44786075e-02, -3.99474379e+00, 2.99153462e-03, 8.87442972e+03, 2.30526762e-03, 9.05492854e+03],
+ [-5.82959510e-03, 5.20569661e-02, -2.18763704e-01, 8.67466142e-04, 7.05178934e+03, 9.52035315e-03, 6.81286695e+03],
+ [5.72212881e-02, -1.43378662e-02, -6.12054235e-01, 4.80304568e-03, 5.45105883e+03, 4.74474171e-04, 7.31264565e+03],
+ [2.69767183e-03, 9.62504736e-02, -1.29365965e+00, 6.11142914e-03, 9.80086309e+03, 1.69531170e-03, 8.00324801e+03],
+ [1.16897734e-02, 4.54745088e-02, -3.28524770e+00, 1.35089385e-02, 5.69817778e+03, 3.98807635e-03, 8.31128396e+03],
+ [1.17640691e-02, 7.63076005e-02, -3.66411278e+00, 1.23863884e-02, 9.30697417e+03, 4.56975167e-04, 5.57718908e+03],
+ [1.93628327e-03, 5.21192971e-02, -1.96503048e+00, 1.77612540e-02, 5.47448933e+03, 6.42417508e-03, 8.05424318e+03],
+ [6.78756010e-03, 2.96217428e-02, -2.03289183e+00, 1.88927411e-02, 1.91748586e+03, 9.10005523e-03, 5.14585687e+03]
+ ]
+
+ def _assert_data_len(self):
+ """
+ Checks the imported data to ensure all fields have the same length.
+
+ :return: None.
+ """
+ assert self.voltage.shape[0] == self.soc.shape[0]
+ assert self.soc.shape[0] == self.current.shape[0]
+ assert self.soc.shape[0] == self.ocv.shape[0]
+
+ def _cost_fun_pygad(self, ga_instance, x, idx):
+ """
+ Provides the cost function used by PyGAD for parameter search.
+
+ :param object ga_instance: Genetic Algorithm instance (pygad).
+ :param x: ndarray/vector of parameters $\theta$.
+ :param idx: default param used by ga_instance to run the problem
+ :return: Cost function, as described in EV-Ecosim paper.
+ """
+ cost = 0
+ V_data = self.voltage
+ data_len = V_data.shape[0]
+ A_Ro = x[0]
+ B_Ro = x[1]
+ C_Ro = x[2]
+ R1 = x[3]
+ C1 = x[4]
+ R2 = x[5]
+ C2 = x[6]
+ dt = 1
+
+ Ro = B_Ro * np.exp(C_Ro * self.soc) + A_Ro * np.exp(self.soc) # updated the new Ro based on intuition
+ I_t = -self.current # this will be loaded from .npy
+
+ I_R1 = np.zeros((I_t.shape[0],))
+ I_R2 = np.zeros((I_t.shape[0],))
+ for j in range(1, len(I_R1)):
+ I_R1[j] = np.round(np.exp(-dt / (R1 * C1)) * I_R1[j - 1] + (1 - np.exp(-dt / (R1 * C1))) * I_t[j - 1],
+ 10)
+ I_R2[j] = np.round(np.exp(-dt / (R2 * C2)) * I_R2[j - 1] + (1 - np.exp(-dt / (R2 * C2))) * I_t[j - 1],
+ 10)
+ V_t = self.ocv - np.multiply(I_t, Ro) - np.multiply(I_R1, R1) - np.multiply(I_R2, R2)
+ assert V_t.shape == self.voltage.shape
+ cost += np.sum(np.square(V_t - V_data))
+ cost = np.sqrt(cost / data_len)
+ if Ro.min() <= 0:
+ cost += 100
+ if Ro[0] > Ro[-1]:
+ cost += 1
+ return -10 * cost
+
+ def _init_population(self):
+ """
+ Initializes the PyGAD population. This is used to use a preset population as a warm-start. This helps the
+ parameter search to converge much quickly than starting from random genes within desired bounds.
+
+ :return:
+ """
+ print('Initializing population for warm-start...')
+ # f = open('init_pop.txt', 'r')
+ # initial_params = f.read()
+ # f.close()
+ # self.init_params = ast.literal_eval(initial_params)
+ self.init_params = self._default_population
+ print('Done initializing population.')
+
+ @staticmethod
+ def _get_pygad_bounds():
+ """
+ Returns gene space range, representing the minimum and maximum values for each gene in the parameter vector.
+
+ :return list gene_space_range: List of dicts providing the range for each gene.
+ """
+ lb2 = [-0.1, -0.1, -5, 0.0001, 100, 0.0004, 4000]
+ ub2 = [0.1, 0.1, 0, 0.02, 10000, 0.01, 10000]
+
+ lb3 = [-10, -10, -10, 0.00004, 0.03, 0.0004, 600] # change the range for testing capacitance variation with SOC if any
+ ub3 = [10, 10, 10, 0.01, 0.06, 0.01, 10000]
+
+ lb = [0.02, 0.0001, 100, 0.00004, 900]
+ ub = [0.04, 0.01, 10000, 0.004, 10000]
+ gene_space_range = [{'low': low, 'high': high} for low, high in zip(lb2, ub2)]
+ return gene_space_range
+
+
+[docs]
+ def ga(self, num_generations=100, num_parents_mating=2, sol_per_pop=10, num_genes=7, crossover_type="single_point",
+ mutation_type="adaptive", parent_selection_type="sss", mutation_percent_genes=60,
+ mutation_prob=(0.3, 0.1), crossover_prob=None):
+ """
+ Runs the genetic algorithm instance. Please see PyGAD official documentation for more explanation of
+ fields/params.
+ The default parameters have been selected to optimize accuracy and speed, however, any user may find a
+ combination of params that work better for a given set of battery data.
+
+ :param crossover_prob:
+ :param num_generations: Number of generations. Default is 100.
+ :param num_parents_mating: Number of parents to combine to form the next offspring. Default is 2.
+ :param sol_per_pop: Number of solutions per population (a set of genes is one solution), or offspring size.
+ :param num_genes: Equivalent to the number of parameters being searched
+ :param crossover_type: Describes how the cross-over between mating genes is done.
+ :param mutation_type: Describes gene mutation. Default adaptive
+ :param parent_selection_type: Parent selection scheme for the next population.
+ :param mutation_percent_genes: The percentage of genes that undergo mutation.
+ :param mutation_prob: The probability of selecting a gene for applying the mutation operation.
+ Its value must be between 0.0 and 1.0 inclusive.
+ :return: Solution vector of optimized parameters.
+ """
+ gene_space_range = self._get_pygad_bounds() # Get the gene space range.
+ if self.init_params:
+ ga_instance = pygad.GA(num_generations=num_generations,
+ initial_population=self.init_params,
+ num_parents_mating=num_parents_mating,
+ fitness_func=self._cost_fun_pygad,
+ sol_per_pop=sol_per_pop,
+ num_genes=num_genes,
+ mutation_type=mutation_type,
+ mutation_probability=mutation_prob,
+ mutation_percent_genes=mutation_percent_genes,
+ parent_selection_type=parent_selection_type,
+ crossover_type=crossover_type,
+ allow_duplicate_genes=False,
+ crossover_probability=crossover_prob,
+ stop_criteria=["reach_0.05", "saturate_20"],
+ gene_space=gene_space_range,
+ parallel_processing=8)
+ else:
+ ga_instance = pygad.GA(num_generations=num_generations,
+ num_parents_mating=num_parents_mating,
+ fitness_func=self._cost_fun_pygad,
+ sol_per_pop=sol_per_pop,
+ num_genes=num_genes,
+ mutation_type=mutation_type,
+ mutation_probability=mutation_prob,
+ mutation_percent_genes=mutation_percent_genes,
+ parent_selection_type=parent_selection_type,
+ crossover_type=crossover_type,
+ allow_duplicate_genes=False,
+ crossover_probability=crossover_prob,
+ stop_criteria=["reach_0.05", "saturate_20"],
+ gene_space=gene_space_range,
+ parallel_processing=8)
+
+ ga_instance.run()
+ solution, solution_fitness, solution_idx = ga_instance.best_solution()
+ ga_instance.plot_fitness()
+ print(f'Parameters of the best solution : {solution}')
+ print(f"Fitness value of the best solution = {solution_fitness}")
+ return solution
+
+
+
+[docs]
+ def run_sys_identification(self, cell_name=0, diagn=0, use_initial_pop=True, quadratic_bias=True):
+ """
+ Runs the GA for system identification.
+
+ :return:
+ """
+ if use_initial_pop:
+ self._init_population()
+ self.params = self.ga()
+
+ if quadratic_bias:
+ self.run_ocv_correction(use_quadratic=True)
+ else:
+ self.run_ocv_correction() # Uses simple linear bias correction.
+ # Run again.
+ self.params = self.ga() # New params.
+ np.savetxt(f'battery_params_{cell_name}_{diagn}.csv', self.params, delimiter=',')
+
+
+
+[docs]
+ def run_ocv_correction(self, use_quadratic=False, cell_name=0, diagn=0):
+ """
+ Fits the parameters for the open circuit voltage correction scheme. Updates the ocv attribute. The open circuit
+ voltage correction scheme can be quadratic or linear. The quadratic scheme was used in the original paper.
+
+ :return: None.
+ """
+ self._validate_params()
+ self.params_uncorr = copy.copy(self.params)
+ x = self.params
+ V_data = self.voltage
+ A_Ro = x[0]
+ B_Ro = x[1]
+ C_Ro = x[2]
+ R1 = x[3]
+ C1 = x[4]
+ R2 = x[5]
+ C2 = x[6]
+ dt = 1
+
+ Ro = B_Ro * np.exp(C_Ro * self.soc) + A_Ro * np.exp(self.soc) # updated the new Ro based on intuition
+ I_t = -self.current # this will be loaded from .npy
+ I_R1 = np.zeros((I_t.shape[0],))
+ I_R2 = np.zeros((I_t.shape[0],))
+
+ for j in range(1, len(I_R1)):
+ I_R1[j] = np.round(np.exp(-dt / (R1 * C1)) * I_R1[j - 1] + (1 - np.exp(-dt / (R1 * C1))) * I_t[j - 1], 10)
+ I_R2[j] = np.round(np.exp(-dt / (R2 * C2)) * I_R2[j - 1] + (1 - np.exp(-dt / (R2 * C2))) * I_t[j - 1], 10)
+ V_t = self.ocv - np.multiply(I_t, Ro) - np.multiply(I_R1, R1) - np.multiply(I_R2, R2)
+ beta = cp.Variable(1)
+ const_bias = cp.Variable(1)
+
+ if use_quadratic:
+ ocv_corr = self.ocv**2 * beta + const_bias # work on improving the representation of this ocv correction term
+ else:
+ ocv_corr = self.ocv * beta + const_bias
+ V_t2 = ocv_corr - np.multiply(I_t, Ro) - np.multiply(I_R1, R1) - np.multiply(I_R2, R2)
+ obj = cp.Minimize(cp.sum(cp.abs(V_t2 - V_data)))
+ problem = cp.Problem(obj)
+ problem.solve(solver=cp.ECOS, verbose=False)
+ print("OCV correction beta: ", beta.value)
+ print("OCV correction const. bias: ", const_bias.value)
+ ocv_bias_correction_vector = np.array([beta.value, const_bias.value])
+ np.savetxt('OCV_bias_correction_params_{}_{}.csv'.format(cell_name, diagn), ocv_bias_correction_vector)
+ self.ocv = ocv_corr.value
+ self.data['ocv_corr'] = self.ocv
+ self.data.to_csv('input_data_with_ocv_corr_voltage.csv') # adds corrected ocv as field and writes the input data
+
+
+ def _validate_params(self):
+ """
+ Internal method.
+ Validates that the parameter list has been updated, will throw an exception if list is not updated.
+
+ :raise : Assertion error if not validated.
+ :return: None.
+ """
+ assert len(self.params) > 0
+
+
+[docs]
+ def plot_correction_scheme_comparison(self, xlim=(20000, 36000), ylim=(2.75, 3.85)):
+ """
+ Generates a plot of OCV corrected model and non-OCV corrected model.
+
+ :return: None
+ """
+ v_corr = self.get_corrected_voltages()
+ v_uncorr = self.get_uncorrected_voltages()
+ plt.figure()
+ plt.plot(self.voltage, label='experimental data')
+ plt.plot(v_uncorr, '--', label='ECM without OCV correction')
+ plt.plot(v_corr, '--', label='ECM with OCV correction', color='k')
+ # plt.xlim(xlim)
+ # plt.ylim(ylim)
+ plt.xticks(rotation=45)
+ plt.xlabel("Time Step (s)")
+ plt.ylabel("Voltage")
+ plt.legend()
+ plt.tight_layout()
+ plt.savefig('model_comparison_ocv_correction_scheme.png')
+
+
+
+[docs]
+ def get_uncorrected_voltages(self):
+ """
+ Returns the vector of uncorrected voltages from ECM model response.
+
+ :return: Vector of uncorrected voltages.
+ """
+ A_Ro = self.params_uncorr[0]
+ B_Ro = self.params_uncorr[1]
+ C_Ro = self.params_uncorr[2]
+ R1 = self.params_uncorr[3]
+ C1 = self.params_uncorr[4]
+ R2 = self.params_uncorr[5]
+ C2 = self.params_uncorr[6]
+ dt = 1
+ Ro = B_Ro * np.exp(C_Ro * self.soc) + A_Ro * np.exp(self.soc) # updated the new Ro based on intuition
+ I_t = -self.current # this will be loaded from .npy
+ I_R1 = np.zeros((I_t.shape[0],))
+ I_R2 = np.zeros((I_t.shape[0],))
+
+ for j in range(1, len(I_R1)):
+ I_R1[j] = np.round(np.exp(-dt / (R1 * C1)) * I_R1[j - 1] + (1 - np.exp(-dt / (R1 * C1))) * I_t[j - 1], 10)
+ I_R2[j] = np.round(np.exp(-dt / (R2 * C2)) * I_R2[j - 1] + (1 - np.exp(-dt / (R2 * C2))) * I_t[j - 1], 10)
+ V_t = self.ocv_no_corr - np.multiply(I_t, Ro) - np.multiply(I_R1, R1) - np.multiply(I_R2, R2)
+ return V_t
+
+
+
+[docs]
+ def get_corrected_voltages(self):
+ """
+ Returns the voltage response with corrected open circuit voltage.
+
+ :return: Vector of voltage response with corrected open circuit voltage.
+ """
+ A_Ro = self.params[0]
+ B_Ro = self.params[1]
+ C_Ro = self.params[2]
+ R1 = self.params[3]
+ C1 = self.params[4]
+ R2 = self.params[5]
+ C2 = self.params[6]
+ dt = 1
+
+ Ro = B_Ro * np.exp(C_Ro * self.soc) + A_Ro * np.exp(self.soc) # updated the new Ro based on intuition
+ I_t = -self.current # this will be loaded from .npy
+ I_R1 = np.zeros((I_t.shape[0],))
+ I_R2 = np.zeros((I_t.shape[0],))
+
+ for j in range(1, len(I_R1)):
+ I_R1[j] = np.round(np.exp(-dt / (R1 * C1)) * I_R1[j - 1] + (1 - np.exp(-dt / (R1 * C1))) * I_t[j - 1], 10)
+ I_R2[j] = np.round(np.exp(-dt / (R2 * C2)) * I_R2[j - 1] + (1 - np.exp(-dt / (R2 * C2))) * I_t[j - 1], 10)
+ V_t = self.ocv - np.multiply(I_t, Ro) - np.multiply(I_R1, R1) - np.multiply(I_R2, R2)
+ return V_t
+
+
+
+[docs]
+ def get_Ro(self):
+ """
+ Returns the high frequency (Ro) resistance of the battery.
+
+ :return: Resistance (R_o).
+ """
+ A_Ro = self.params[0]
+ B_Ro = self.params[1]
+ C_Ro = self.params[2]
+ return B_Ro * np.exp(C_Ro * self.soc) + A_Ro * np.exp(self.soc)
+
+
+
+[docs]
+ def plot_Ro(self):
+ """
+ Plots the high frequency resistance (Ro) of the battery.
+
+ :return: None.
+ """
+ Ro = self.get_Ro() + self.params[3] + self.params[5]
+ fig, ax = plt.subplots(1, 1)
+ ax.plot(self.soc, Ro)
+ plt.title("Ro vs. SoC plot")
+ plt.xlabel('State of charge')
+ plt.ylabel('Ro (Resistance)')
+ plt.show()
+
+
+
+[docs]
+ def simulate_response(self):
+ """
+ Simulates the response of the ECM model. Not complete yet.
+
+ :return:
+ """
+ voltage = self.get_uncorrected_voltages()
+
+ # todo: complete later
+
+
+[docs]
+ def run_pre_checks(self):
+ """
+ Runs pre-checks on input values to ensure they are all of desired lengths. This is run at the beginning to
+ ensure no errors in data length.
+
+ :return: None.
+ """
+ self._assert_data_len()
+
+
+ def _estimate_soc_vector(self):
+ """
+ Estimates the SOC vector for users that do not have the vector but have the capacity and
+ current profiles. Not fully implemented yet.
+
+ :return: Error message.
+ """
+ return NotImplementedError("Method has not been implemented yet!")
+
+
+
+if __name__ == '__main__':
+ import os
+ # List all the csv files in current directory and let user choose one.
+ # User uploaded data will be saved in the current directory as a temp_data.csv file.
+ data_path = os.path.join(os.getcwd(), 'temp_data.csv')
+ batt_data = pd.read_csv(data_path)
+ module = BatteryParams(batt_data)
+ # Create button option to toggle initial population on or off.
+ module.run_sys_identification(use_initial_pop=True)
+ module.plot_correction_scheme_comparison()
+
This module hosts the Battery System Identification class used for fitting battery ECM model parameters from data.
+Bases: object
Battery system identification class with open circuit voltage correction scheme. +This class takes in dataframe or csv with some given fields during instantiation.
+Dataframe fields (columns) must include the following literally and case-sensitive:
+current - battery/cell current time-series.
voltage - corresponding battery/cell voltage time-series.
soc - corresponding battery/cell state of charge time-series.
ocv - corresponding battery/cell open circuit voltage time-series.
How to use:
+data = pd.read_csv(data_path). This loads a pandas dataframe.
module = BatteryParams(data)
module.run_sys_identification()
module.plot_correction_scheme_comparison()
Writes new corrected open-circuit voltages and battery parameters to file within the folder. Can be downloaded via +the web-tool.
+data – Battery test data from which to fit the identification params.
+Runs the genetic algorithm instance. Please see PyGAD official documentation for more explanation of +fields/params. +The default parameters have been selected to optimize accuracy and speed, however, any user may find a +combination of params that work better for a given set of battery data.
+crossover_prob –
num_generations – Number of generations. Default is 100.
num_parents_mating – Number of parents to combine to form the next offspring. Default is 2.
sol_per_pop – Number of solutions per population (a set of genes is one solution), or offspring size.
num_genes – Equivalent to the number of parameters being searched
crossover_type – Describes how the cross-over between mating genes is done.
mutation_type – Describes gene mutation. Default adaptive
parent_selection_type – Parent selection scheme for the next population.
mutation_percent_genes – The percentage of genes that undergo mutation.
mutation_prob – The probability of selecting a gene for applying the mutation operation.
Its value must be between 0.0 and 1.0 inclusive. +:return: Solution vector of optimized parameters.
+Returns the high frequency (Ro) resistance of the battery.
+Resistance (R_o).
+Returns the voltage response with corrected open circuit voltage.
+Vector of voltage response with corrected open circuit voltage.
+Returns the vector of uncorrected voltages from ECM model response.
+Vector of uncorrected voltages.
+Plots the high frequency resistance (Ro) of the battery.
+None.
+Generates a plot of OCV corrected model and non-OCV corrected model.
+None
+Fits the parameters for the open circuit voltage correction scheme. Updates the ocv attribute. The open circuit +voltage correction scheme can be quadratic or linear. The quadratic scheme was used in the original paper.
+None.
+Runs pre-checks on input values to ensure they are all of desired lengths. This is run at the beginning to +ensure no errors in data length.
+None.
+
|
FGMPS |
Welcome to EV-Ecosim 1.0.0ReadmePackages
Packages | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ b | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ |
+ batt_sys_identification | + | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ |
+ batt_sys_identification.battery_identification | + | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ id="toggle-3" style="display: none" alt="-" /> |
charging_sim | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.battery | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.batteryAgingSim | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.batterypack | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.capacitor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.chargingStation | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.controller | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.electricityPrices | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.optimization | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.orchestrator | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.simulate | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.solar | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charging_sim.utils |
@@ -170,11 +185,11 @@ Python Module Indexf | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ id="toggle-4" style="display: none" alt="-" /> |
feeder_population | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
feeder_population.glm_mod_functions |
@@ -184,26 +199,26 @@ Python Module Indext | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ id="toggle-5" style="display: none" alt="-" /> |
test_cases | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test_cases.base_case | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test_cases.battery | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test_cases.battery.feeder_population | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test_cases.battery.feeder_population.glm_mod_functions |
diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js
index 778bbff0e..77fd1826d 100644
--- a/docs/build/html/searchindex.js
+++ b/docs/build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["README", "analysis", "charging_sim", "feeder_population", "index", "modules", "readme", "test_cases", "test_cases.base_case", "test_cases.battery", "test_cases.battery.feeder_population"], "filenames": ["README.md", "analysis.rst", "charging_sim.rst", "feeder_population.rst", "index.rst", "modules.rst", "readme.rst", "test_cases.rst", "test_cases.base_case.rst", "test_cases.battery.rst", "test_cases.battery.feeder_population.rst"], "titles": ["EV-Ecosim platform", "Post-simulation analysis", "Charging simulator", "Feeder population", "Welcome to EV-Ecosim 1.0.0", "Packages", "Readme", "Test cases", "test_cases.base_case package", "test_cases.battery package", "test_cases.battery.feeder_population package"], "terms": {"A": [0, 1, 2], "grid": [0, 1, 2, 4], "awar": [0, 4], "design": [0, 2], "vehicl": [0, 2], "paper": [0, 2], "http": [0, 1, 2], "doi": [0, 2], "org": [0, 2], "10": [0, 2], "36227": [0, 2], "techrxiv": [0, 2], "23596725": [0, 2], "v2": [0, 2], "emmanuel": 0, "balogun": [0, 2], "ebalogun": 0, "stanford": 0, "edu": 0, "lili": 0, "buechler": 0, "ebuech": 0, "gismo": 0, "slac": 0, "gridlab": [0, 3, 4, 10], "d": [0, 3, 4, 10], "instal": [0, 2], "master": 0, "branch": 0, "github": [0, 4], "com": [0, 2], "arra": 0, "energi": [0, 2], "gridlabd": 0, "version": [0, 2, 4], "python": [0, 4], "recommend": 0, "aw": 0, "ec2": 0, "hipa": 0, "ami": 0, "beauharnoi": 0, "x": 0, "ambient": [0, 2], "_": 0, "data": [0, 1, 2], "temperatur": [0, 2], "captur": 0, "effect": [0, 2], "environment": 0, "condit": 0, "subsystem": 0, "transform": [0, 1, 2], "base": [0, 1, 2, 4, 10], "load": [0, 1, 2, 3, 10], "includ": [0, 1, 2, 4], "exist": [0, 2], "build": [0, 1, 2], "home": [0, 2], "usual": [0, 2], "uncontrol": 0, "within": [0, 1, 2], "distribut": [0, 1, 2, 4], "work": [0, 2], "proprietari": 0, "pecan": 0, "street": 0, "below": 0, "an": [0, 2], "exmapl": 0, "prototyp": 0, "note": [0, 2], "column": 0, "field": 0, "ar": [0, 1, 2], "sensit": 0, "The": [0, 1, 2, 4], "origin": 0, "ha": [0, 2], "minut": [0, 2], "resolut": [0, 2], "power": [0, 1, 2, 3, 4, 10], "system": [0, 1, 2, 3, 4, 10], "batt": [0, 2], "sy": 0, "identif": [0, 2], "class": [0, 1, 2, 3, 10], "gener": [0, 2], "paramet": [0, 1, 2, 3, 10], "from": [0, 1, 2, 3], "experiment": 0, "leverag": 0, "genet": 0, "algorithm": 0, "model": [0, 2, 3, 4, 10], "2nd": 0, "order": 0, "rc": 0, "equival": 0, "circuit": [0, 2], "ecm": 0, "One": 0, "can": [0, 1, 2], "custom": 0, "nmc": [0, 2], "upload": 0, "csv": [0, 2], "file": [0, 1, 2, 3, 10], "param": [0, 2], "shown": [0, 4], "save": [0, 1, 2], "new": [0, 2], "addit": 0, "correct": [0, 2], "open": [0, 2], "voltag": [0, 1, 2], "ocv": [0, 2], "valu": [0, 1, 2], "label": [0, 1], "ocv_corr": 0, "abov": 0, "onc": [0, 2], "thei": 0, "battery_data": 0, "config": [0, 2, 5], "json": [0, 2], "modifi": [0, 2, 3, 10], "so": [0, 2], "sim": [0, 2, 5, 7], "contain": [0, 1, 2, 4, 10], "which": [0, 1, 2], "configur": [0, 2], "all": [0, 1, 2, 3], "relev": [0, 2], "implement": [0, 1, 2], "physic": [0, 2], "legaci": 0, "forecast": [0, 2], "develop": [0, 4], "need": [0, 2], "elec": 0, "rate": [0, 2], "time": [0, 2], "tou": [0, 2], "input": [0, 2], "user": [0, 2], "must": [0, 2], "normal": [0, 1], "full": [0, 2], "year": [0, 2], "size": 0, "365": 0, "dai": [0, 1, 2], "avoid": 0, "ani": [0, 2], "error": 0, "format": 0, "read": 0, "sampl": [0, 2], "dure": [0, 2], "should": [0, 2], "one": [0, 2], "15": [0, 2], "also": [0, 1, 2], "help": [0, 2], "downscal": [0, 2, 5], "much": [0, 2], "coarser": 0, "librari": [0, 2], "ieee": [0, 1], "test": [0, 2, 4, 5], "pnnl": 0, "taxonomi": 0, "glm": [0, 3, 10], "have": [0, 2, 4], "spot": 0, "specifi": [0, 2], "primari": 0, "level": [0, 1, 2], "secondari": [0, 2], "popul": [0, 4, 5], "script": 0, "vari": 0, "resourc": [0, 1], "necessari": 0, "txt": [0, 2], "residenti": 0, "repo": 0, "limit": [0, 2], "access": [0, 2, 4], "irradi": [0, 2], "overal": [0, 1, 2], "default": [0, 2], "nation": 0, "radiat": 0, "databas": 0, "nsrdb": 0, "san": 0, "francisco": 0, "bai": 0, "area": [0, 2], "renew": 0, "laboratori": 0, "nrel": [0, 1], "month": [0, 2], "index": [0, 2, 4], "1": [0, 2], "12": [0, 1, 2], "inclus": 0, "januari": 0, "decemb": [0, 2], "hourli": 0, "interv": 0, "oversampl": 0, "4": 0, "dataset": [0, 2], "ghi": [0, 2], "repres": 0, "global": [0, 2], "horizont": [0, 2], "w": 0, "m": 0, "2": 0, "total": [0, 2], "amount": [0, 1], "shortwav": 0, "receiv": 0, "surfac": [0, 2], "ground": 0, "base_cas": [0, 5, 7], "write": [0, 3, 10], "inject": [0, 2], "each": [0, 1, 2], "timestep": 0, "rlsf": 0, "plu": 0, "recurs": 0, "least": [0, 2], "squar": 0, "filter": [0, 3, 10], "estim": [0, 1, 2, 4], "network": [0, 1, 2, 4], "onlin": 0, "thermal": [0, 2], "integr": [0, 4], "plot": [0, 1, 2], "result": [0, 1, 2], "calcul": [0, 1, 2], "impact": [0, 4], "plot_result": [0, 5], "pars": 0, "percentag": 0, "violat": [0, 1], "per": [0, 2], "ansi": 0, "c84": 0, "variabl": [0, 2], "string": [0, 2], "path": [0, 2], "where": [0, 2], "powerflow": 0, "output": [0, 2, 3], "node": [0, 1, 2], "load_post_opt_cost": [0, 5], "tabl": 0, "matric": 0, "respect": [0, 2], "cost_analysi": [0, 5], "costestim": [0, 1, 5], "differ": [0, 1, 2], "compon": [0, 1], "creat": [0, 1, 2], "environ": 0, "conda": 0, "env": 0, "name": [0, 2], "your": [0, 2], "f": [0, 2], "yml": 0, "OR": 0, "packag": [0, 4, 7], "list": [0, 1, 2, 3], "manual": 0, "ensur": [0, 2], "follow": [0, 2], "method": [0, 2], "For": 0, "navig": 0, "set": [0, 2], "prepar": 0, "confirm": 0, "successfulli": 0, "ieee123_secondari": 0, "ieee123_popul": 0, "you": 0, "done": [0, 2], "initi": [0, 2], "pre": [0, 2], "prep": 0, "now": [0, 2], "out": [0, 2], "scenario": [0, 1, 2, 5, 7], "python3": 0, "ev50_cosimul": 0, "master_sim": [0, 5, 7], "pleas": 0, "see": 0, "section": 0, "more": [0, 2], "detail": 0, "thi": [1, 2, 4], "cost": [1, 2], "der": [1, 2], "simul": [3, 4, 5, 10], "num_dai": 1, "sourc": [1, 2, 3, 10], "object": [1, 2, 3, 10], "i": [1, 2, 4], "us": [1, 2, 4], "asset": [1, 2], "ev": [1, 2], "ecosim": [1, 2], "number": [1, 2], "run": [1, 2, 4, 5], "calculate_battery_cost": [1, 5], "result_dir": 1, "batteri": [1, 4, 5, 7], "updat": [1, 2], "lcoe": 1, "directori": 1, "dictionari": [1, 2, 3, 10], "return": [1, 2, 3, 10], "dict": [1, 2, 3], "result_dict": 1, "calculate_electricity_cost_pgebev2": [1, 5], "pge_separate_fil": 1, "true": [1, 2], "electr": [1, 2], "pgebev2": 1, "given": [1, 2], "str": [1, 2], "compris": 1, "dollar": 1, "calculate_solar_cost": [1, 5], "pull": [1, 2], "solar": [1, 4, 5], "ref": [1, 2], "www": [1, 2], "gov": 1, "market": 1, "research": 1, "html": 1, "To": 1, "deprec": [1, 2], "soon": 1, "none": [1, 2], "calculate_trans_loss_of_lif": [1, 5], "expect": 1, "loss": [1, 2], "life": [1, 2], "refer": 1, "5": 1, "11": 1, "3": [1, 4], "std": 1, "c57": 1, "00": 1, "2010": 1, "minimum": [1, 2], "insul": 1, "180": 1, "000": 1, "hour": [1, 2], "static": [1, 2], "plot_load": [1, 5], "total_load": 1, "net_load": 1, "prefix": [1, 2], "overlai": 1, "net": [1, 2], "post": [2, 4, 5], "visual": [1, 2, 5], "demand": [1, 2], "control": [1, 5], "minu": 1, "buffer": 1, "legend": 1, "curv": 1, "plot_pow": [1, 5], "power_pr": 1, "predict": [1, 2], "plot_soc": [1, 5], "soc": [1, 2], "soc_pr": 1, "state": [1, 2], "charg": [1, 4, 5], "solar_cost": [1, 5], "capit": 1, "Not": [1, 2], "fulli": [1, 2], "locat": [1, 2], "pv": [1, 2], "transformer_cost": [1, 2, 5], "cannot": [1, 2], "find": [1, 2], "good": 1, "yet": [1, 2], "ag": [1, 2], "battery_typ": [2, 5], "instanti": 2, "constraint": 2, "properti": 2, "mainli": 2, "max": 2, "c": 2, "determin": 2, "capac": 2, "cell": 2, "multipl": 2, "v": 2, "maximum": 2, "allow": 2, "min": 2, "nomin": 2, "kwh": 2, "deliver": 2, "id": 2, "celsiu": 2, "type": 2, "inconsequenti": 2, "current": 2, "dynam": [2, 5], "bu": 2, "resid": 2, "self": 2, "main": [2, 5], "attribut": 2, "battery_setup": [2, 5], "up": 2, "seri": 2, "parallel": 2, "scale": 2, "ah": 2, "setup": [2, 5], "fix": 2, "while": 2, "float": 2, "pack": 2, "wh": 2, "topologi": 2, "battery_setup_2": [2, 5], "instead": 2, "therebi": 2, "same": 2, "pack_max_ah": 2, "watt": 2, "amp": 2, "cell_amp_hr": 2, "cell_voltag": 2, "propag": 2, "forward": 2, "step": [2, 5], "It": [2, 4], "take": 2, "amper": 2, "np": 2, "cycl": 2, "respons": 2, "est_calendar_ag": [2, 5], "constant": 2, "calendar": 2, "sole": 2, "depend": 2, "later": 2, "linear": 2, "est_cyc_ag": [2, 5], "hess": 2, "et": 2, "al": 2, "its": 2, "cvx": 2, "cvxpy": 2, "describ": 2, "function": [2, 3, 10], "get_ocv": [2, 5], "map": 2, "store": 2, "via": [2, 4], "interpol": 2, "obtain": 2, "priori": 2, "": 2, "get_ro": [2, 5], "possibli": 2, "get_aging_valu": [2, 5], "experienc": 2, "far": 2, "get_power_profil": [2, 5], "profil": 2, "certain": 2, "get_properti": [2, 5], "get_roundtrip_effici": [2, 5], "get_total_ag": [2, 5], "get_true_pow": [2, 5], "save_sim_data": [2, 5], "save_prefix": 2, "over": 2, "call": 2, "upon": 2, "conclus": 2, "desir": 2, "folder": 2, "save_st": [2, 5], "state_eqn": [2, 5], "append": 2, "discret": 2, "equat": 2, "here": 2, "g": 2, "l": 2, "plett": 2, "manag": 2, "volum": 2, "artech": 2, "hous": 2, "2015": 2, "vol": 2, "boolean": 2, "decid": 2, "track": 2, "b": 2, "analys": 2, "histori": 2, "vector": 2, "thermal_dynam": [2, 5], "futur": 2, "track_soc": [2, 5], "update_soc": [2, 5], "update_capac": [2, 5], "anticip": 2, "update_max_curr": [2, 5], "verbos": 2, "fals": 2, "update_param": [2, 5], "chang": 2, "update_voltag": [2, 5], "option": 2, "batteryag": [2, 5], "enact": 2, "resist": 2, "datetim": 2, "num_step": 2, "re": 2, "linimncoo2": 2, "ad": 2, "link": [2, 4], "sciencedirect": 2, "scienc": 2, "articl": 2, "pii": 2, "s0378775314001876": 2, "beta_cap": 2, "fade": 2, "factor": 2, "alpha_cap": 2, "beta_r": 2, "growth": 2, "alpha_r": 2, "assumpt": 2, "homogen": 2, "uniform": 2, "across": 2, "vicin": 2, "lfp_cal_ag": [2, 5], "lfp_cyc_ag": [2, 5], "nmc_cal_ag": [2, 5], "nmc_cyc_ag": [2, 5], "get_calendar_ag": [2, 5], "tupl": 2, "due": 2, "get_cyc_ag": [2, 5], "THe": 2, "both": 2, "adopt": 2, "schmalsteig": 2, "update_resist": [2, 5], "program": 2, "usag": 2, "proper": 2, "py": 2, "exampl": 2, "battery_config_path": 2, "r": 2, "battery_config": 2, "params_list": 2, "kei": 2, "params_": 2, "Then": 2, "params_kei": 2, "actual": 2, "those": 2, "prior": 2, "loadtxt": 2, "path_prefix": 2, "constructor": 2, "buffer_batteri": 2, "r_pack": [2, 5], "sum": 2, "aging_c": 2, "lost": 2, "after": 2, "round": 2, "trip": 2, "effici": 2, "_eff": 2, "last": 2, "load_pack_prop": [2, 5], "dx": 2, "nominal_pack_cap": [2, 5], "meth": 2, "intern": 2, "avail": [2, 4], "defer": 2, "TO": 2, "BE": 2, "anymor": 2, "onli": 2, "right": 2, "behavior": 2, "inspect": 2, "end": 2, "host": 2, "station": [2, 4], "storag": 2, "statu": 2, "idl": 2, "produc": 2, "reactiv": 2, "contribut": 2, "retain": 2, "inform": [2, 4], "etc": 2, "ingest": 2, "assign": 2, "get_current_load": [2, 5], "kw": 2, "is_ev_arriv": [2, 5], "is_charg": [2, 5], "set_current_load": [2, 5], "update_load": [2, 5], "net_grid_load": 2, "ev_load": 2, "mpc": [2, 5], "mode": 2, "update_load_oneshot": [2, 5], "offlin": 2, "non": 2, "update_statu": [2, 5], "scheme": 2, "bess": 2, "compute_control": [2, 5], "price_vector": 2, "action": 2, "comput": 2, "pass": 2, "control_act": 2, "signal": 2, "arbitrag": 2, "get_battery_constraint": [2, 5], "requir": 2, "satisfi": 2, "storage_constraint": 2, "initialize_forecast_data": [2, 5], "load_battery_ocv": [2, 5], "learn": 2, "reset_load": [2, 5], "oneshot": [2, 5], "96": 2, "feedback": 2, "price": 2, "structur": [2, 3, 10], "problem": 2, "pge_bev2_": [2, 5], "valid": 2, "california": 2, "howev": 2, "own": 2, "numpi": 2, "arrai": 2, "priceload": [2, 5], "evs": 2, "profit": 2, "loader": 2, "first": 2, "repositori": 2, "input_r": 2, "output_r": 2, "finer": 2, "similar": 2, "panda": 2, "typic": 2, "get_pric": [2, 5], "start_idx": 2, "7": 2, "assum": 2, "do": 2, "int": 2, "start": 2, "cardin": 2, "being": 2, "jan": 2, "ndarrai": 2, "set_month_data": [2, 5], "solv": 2, "objective_typ": 2, "power_demand": 2, "time_r": 2, "0": 2, "solver": [2, 4], "gurobi": 2, "degrad": 2, "convex": 2, "mix": 2, "integ": 2, "select": 2, "separ": 2, "pc": 2, "success": 2, "counter": 2, "identifi": 2, "backend": 2, "invok": 2, "eco": 2, "mosek": 2, "add_demand_charg": [2, 5], "aggregate_constraint": [2, 5], "aggreg": 2, "build_battery_cost": [2, 5], "build_emissions_cost": [2, 5], "emiss": 2, "build_transformer_cost": [2, 5], "get_constraint": [2, 5], "instanc": [2, 3], "chargingsim": [2, 5], "entir": 2, "num_charging_sit": 2, "6": 2, "num_ev": 2, "1600": 2, "custom_ev_data": 2, "custom_ev_data_path": 2, "custom_solar_data": 2, "custom_solar_data_path": 2, "organ": 2, "other": 2, "sequenti": 2, "manner": 2, "bool": 2, "If": 2, "site": 2, "o": 2, "create_battery_object": [2, 5], "idx": 2, "node_prop": 2, "l2": 2, "dcfc": 2, "create_charging_st": [2, 5], "power_nod": 2, "buse": 2, "create_charging_stations_oneshot": [2, 5], "create_solar_object": [2, 5], "loc": 2, "get_act": [2, 5], "get_charger_obj_by_loc": [2, 5], "get_charging_sit": [2, 5], "initialize_aging_sim": [2, 5], "initialize_control": [2, 5], "initialize_price_load": [2, 5], "memori": 2, "initialize_solar_modul": [2, 5], "load_battery_param": [2, 5], "directli": 2, "unless": 2, "otherwis": 2, "load_config": [2, 5], "walk": 2, "through": 2, "them": 2, "load_results_summari": [2, 5], "save_path_prefix": 2, "some": 2, "multistep": [2, 5], "faster": 2, "than": 2, "horizon": 2, "perfect": 2, "foresight": 2, "daili": 2, "reset": 2, "power_nodes_list": 2, "accordingli": 2, "specif": 2, "stepsiz": 2, "update_scenario": [2, 5], "match": 2, "update_step": [2, 5], "move": 2, "namepl": 2, "p_": 2, "eta": 2, "panel": 2, "make": 2, "decis": 2, "flow": [2, 4], "devic": 2, "get_pow": [2, 5], "desired_shap": 2, "get_solar_output": [2, 5], "modify_r": [2, 5], "new_r": 2, "update_histori": [2, 5], "purpos": 2, "mayb": 2, "schedul": 2, "pge": 2, "doc": 2, "found": 2, "add_power_profile_to_object": [2, 5], "battery_power_profil": 2, "build_cost_pge_bev2": [2, 5], "energy_prices_t": 2, "penalize_max_pow": 2, "max_power_pen": 2, "1000": 2, "heurist": 2, "averag": 2, "conserv": 2, "gamma": 2, "build_electricity_cost": [2, 5], "demand_charg": 2, "opt": 2, "build_object": [2, 5], "electricity_cost": 2, "battery_degradation_cost": 2, "we": [2, 4], "minim": 2, "load_pric": [2, 5], "time_interv": 2, "load_base_glm": [3, 5, 9, 10], "base_file_dir": [3, 10], "base_glm_fil": [3, 10], "replace_load_w_met": [3, 5, 9, 10], "glm_dict": [3, 10], "match_str": [3, 10], "rep_str": [3, 10], "obj_typ": [3, 10], "replac": [3, 10], "meter": [3, 10], "replace_load_w_meter_old": [3, 5, 9, 10], "write_base_glm": [3, 5, 9, 10], "globals_list": [3, 10], "include_list": [3, 10], "out_dir": [3, 10], "file_nam": [3, 10], "sync_list": [3, 10], "write_class_dict": [3, 5, 9, 10], "gld_dict": [3, 10], "class_nam": [3, 10], "correspond": [3, 10], "gld": [3, 10], "write_clock_dict": [3, 5, 9, 10], "clock": [3, 10], "write_filter_dict": [3, 5, 9, 10], "write_mod_dict": [3, 5, 9, 10], "mod_nam": [3, 10], "write_obj_dict": [3, 5, 9, 10], "dict_kei": [3, 10], "co": 4, "platform": 4, "interfac": 4, "phase": 4, "unbalanc": 4, "fast": 4, "made": 4, "web": 4, "tool": 4, "public": 4, "most": 4, "code": 4, "document": 4, "project": 4, "still": 4, "under": 4, "activ": 4, "improv": 4, "todo": 4, "tutori": 4, "analysi": [4, 5], "feeder": [4, 5], "case": [4, 5], "readm": 4, "guid": [], "cite": [], "modul": [4, 5], "search": 4, "page": 4, "submodul": [5, 7], "content": 5, "charging_sim": 5, "batteryagingsim": 5, "batterypack": 5, "batterytest": 5, "capacitor": 5, "chargingst": 5, "electricitypric": 5, "optim": 5, "orchestr": 5, "util": 5, "feeder_popul": [5, 7, 9], "glm_mod_funct": [5, 7, 9], "subpackag": 5, "test_cas": [5, 7], "event_handl": [5, 7], "gblvar": [5, 7], "glmptime": [5, 7], "voltdump2": [5, 7], "data_analysi": [5, 7], "event_handlers_oneshot": [5, 7], "parse_voltag": [5, 7], "feeder_population_old": [7, 9], "without": 2, "studi": 2, "character": 2, "what": 2, "would": 2, "occur": 2, "situ": 2, "wa": 2, "make_scenario": [2, 5], "No": 2, "preload": 2, "reflect": 2, "run_scenario_singl": [2, 5], "singl": 2, "run_scenarios_parallel": [2, 5], "multiprocess": 2, "enough": 2, "core": 2, "ram": 2, "mai": 2, "lead": 2, "process": 2, "freez": 2, "run_scenarios_sequenti": [2, 5], "combin": 2}, "objects": {"": [[1, 0, 0, "-", "analysis"], [2, 0, 0, "-", "charging_sim"], [3, 0, 0, "-", "feeder_population"], [7, 0, 0, "-", "test_cases"]], "analysis": [[1, 0, 0, "-", "cost_analysis"]], "analysis.cost_analysis": [[1, 1, 1, "", "CostEstimator"]], "analysis.cost_analysis.CostEstimator": [[1, 2, 1, "", "calculate_battery_cost"], [1, 2, 1, "", "calculate_electricity_cost_PGEBEV2s"], [1, 2, 1, "", "calculate_solar_cost"], [1, 2, 1, "", "calculate_trans_loss_of_life"], [1, 2, 1, "", "plot_loads"], [1, 2, 1, "", "plot_power"], [1, 2, 1, "", "plot_soc"], [1, 2, 1, "", "solar_cost"], [1, 2, 1, "", "transformer_cost"]], "charging_sim": [[2, 0, 0, "-", "battery"], [2, 0, 0, "-", "batteryAgingSim"], [2, 0, 0, "-", "batterypack"], [2, 0, 0, "-", "capacitor"], [2, 0, 0, "-", "chargingStation"], [2, 0, 0, "-", "controller"], [2, 0, 0, "-", "electricityPrices"], [2, 0, 0, "-", "optimization"], [2, 0, 0, "-", "orchestrator"], [2, 0, 0, "-", "simulate"], [2, 0, 0, "-", "solar"], [2, 0, 0, "-", "utils"]], "charging_sim.battery": [[2, 1, 1, "", "Battery"], [2, 3, 1, "", "test"]], "charging_sim.battery.Battery": [[2, 2, 1, "", "battery_setup"], [2, 2, 1, "", "battery_setup_2"], [2, 2, 1, "", "dynamics"], [2, 2, 1, "", "est_calendar_aging"], [2, 2, 1, "", "est_cyc_aging"], [2, 2, 1, "", "get_OCV"], [2, 2, 1, "", "get_Ro"], [2, 2, 1, "", "get_aging_value"], [2, 2, 1, "", "get_power_profile"], [2, 2, 1, "", "get_properties"], [2, 2, 1, "", "get_roundtrip_efficiency"], [2, 2, 1, "", "get_total_aging"], [2, 2, 1, "", "get_true_power"], [2, 2, 1, "", "save_sim_data"], [2, 2, 1, "", "save_states"], [2, 2, 1, "", "state_eqn"], [2, 2, 1, "", "thermal_dynamics"], [2, 2, 1, "", "track_SOC"], [2, 2, 1, "", "update_SOC"], [2, 2, 1, "", "update_capacity"], [2, 2, 1, "", "update_max_current"], [2, 2, 1, "", "update_params"], [2, 2, 1, "", "update_voltage"], [2, 2, 1, "", "visualize"]], "charging_sim.batteryAgingSim": [[2, 1, 1, "", "BatteryAging"]], "charging_sim.batteryAgingSim.BatteryAging": [[2, 2, 1, "", "LFP_cal_aging"], [2, 2, 1, "", "LFP_cyc_aging"], [2, 2, 1, "", "NMC_cal_aging"], [2, 2, 1, "", "NMC_cyc_aging"], [2, 2, 1, "", "get_aging_value"], [2, 2, 1, "", "get_calendar_aging"], [2, 2, 1, "", "get_cyc_aging"], [2, 2, 1, "", "get_total_aging"], [2, 2, 1, "", "run"], [2, 2, 1, "", "update_capacity"], [2, 2, 1, "", "update_resistance"]], "charging_sim.batterypack": [[2, 1, 1, "", "Battery"], [2, 3, 1, "", "test"]], "charging_sim.batterypack.Battery": [[2, 4, 1, "", "R_pack"], [2, 2, 1, "", "battery_setup"], [2, 2, 1, "", "battery_setup_2"], [2, 4, 1, "", "battery_type"], [2, 4, 1, "", "config"], [2, 4, 1, "", "controller"], [2, 2, 1, "", "dynamics"], [2, 2, 1, "", "est_calendar_aging"], [2, 2, 1, "", "est_cyc_aging"], [2, 2, 1, "", "get_OCV"], [2, 2, 1, "", "get_aging_value"], [2, 2, 1, "", "get_power_profile"], [2, 2, 1, "", "get_roundtrip_efficiency"], [2, 2, 1, "", "get_total_aging"], [2, 2, 1, "", "get_true_power"], [2, 2, 1, "", "load_pack_props"], [2, 4, 1, "", "nominal_pack_cap"], [2, 2, 1, "", "save_sim_data"], [2, 2, 1, "", "state_eqn"], [2, 2, 1, "", "thermal_dynamics"], [2, 2, 1, "", "track_SOC"], [2, 2, 1, "", "update_capacity"], [2, 2, 1, "", "update_max_current"], [2, 2, 1, "", "update_voltage"], [2, 2, 1, "", "visualize"]], "charging_sim.capacitor": [[2, 1, 1, "", "Capacitor"]], "charging_sim.chargingStation": [[2, 1, 1, "", "ChargingStation"]], "charging_sim.chargingStation.ChargingStation": [[2, 2, 1, "", "get_current_load"], [2, 2, 1, "", "is_EV_arrived"], [2, 2, 1, "", "is_charging"], [2, 2, 1, "", "save_sim_data"], [2, 2, 1, "", "set_current_load"], [2, 2, 1, "", "update_load"], [2, 2, 1, "", "update_load_oneshot"], [2, 2, 1, "", "update_status"], [2, 2, 1, "", "visualize"]], "charging_sim.controller": [[2, 1, 1, "", "MPC"], [2, 1, 1, "", "Oneshot"]], "charging_sim.controller.MPC": [[2, 2, 1, "", "compute_control"], [2, 2, 1, "", "get_battery_constraints"], [2, 2, 1, "", "initialize_forecast_data"], [2, 2, 1, "", "load_battery_ocv"], [2, 2, 1, "", "reset_load"]], "charging_sim.controller.Oneshot": [[2, 2, 1, "", "compute_control"], [2, 2, 1, "", "get_battery_constraints"], [2, 2, 1, "", "load_battery_ocv"], [2, 2, 1, "", "reset_load"]], "charging_sim.electricityPrices": [[2, 1, 1, "", "PriceLoader"], [2, 3, 1, "", "main"]], "charging_sim.electricityPrices.PriceLoader": [[2, 2, 1, "", "downscale"], [2, 2, 1, "", "get_prices"], [2, 2, 1, "", "set_month_data"]], "charging_sim.optimization": [[2, 1, 1, "", "Optimization"]], "charging_sim.optimization.Optimization": [[2, 2, 1, "", "add_demand_charge"], [2, 2, 1, "", "aggregate_constraints"], [2, 2, 1, "", "build_battery_cost"], [2, 2, 1, "", "build_emissions_cost"], [2, 2, 1, "", "build_transformer_cost"], [2, 2, 1, "", "get_battery_constraint"], [2, 2, 1, "", "get_constraints"], [2, 2, 1, "", "run"]], "charging_sim.orchestrator": [[2, 1, 1, "", "ChargingSim"]], "charging_sim.orchestrator.ChargingSim": [[2, 2, 1, "", "create_battery_object"], [2, 2, 1, "", "create_charging_stations"], [2, 2, 1, "", "create_charging_stations_oneshot"], [2, 2, 1, "", "create_solar_object"], [2, 2, 1, "", "get_action"], [2, 2, 1, "", "get_charger_obj_by_loc"], [2, 2, 1, "", "get_charging_sites"], [2, 2, 1, "", "initialize_aging_sim"], [2, 2, 1, "", "initialize_controllers"], [2, 2, 1, "", "initialize_price_loader"], [2, 2, 1, "", "initialize_solar_module"], [2, 2, 1, "", "load_battery_params"], [2, 2, 1, "", "load_config"], [2, 2, 1, "", "load_results_summary"], [2, 2, 1, "", "multistep"], [2, 2, 1, "", "reset_loads"], [2, 2, 1, "", "setup"], [2, 2, 1, "", "step"], [2, 2, 1, "", "update_scenario"], [2, 2, 1, "", "update_steps"]], "charging_sim.simulate": [[2, 3, 1, "", "make_scenarios"], [2, 3, 1, "", "run"], [2, 3, 1, "", "run_scenario_single"], [2, 3, 1, "", "run_scenarios_parallel"], [2, 3, 1, "", "run_scenarios_sequential"]], "charging_sim.solar": [[2, 1, 1, "", "Solar"], [2, 3, 1, "", "main"]], "charging_sim.solar.Solar": [[2, 2, 1, "", "downscale"], [2, 2, 1, "", "get_constraints"], [2, 2, 1, "", "get_power"], [2, 2, 1, "", "get_solar_output"], [2, 2, 1, "", "modify_res"], [2, 2, 1, "", "update_history"]], "charging_sim.utils": [[2, 3, 1, "", "PGE_BEV2_S"], [2, 3, 1, "", "add_power_profile_to_object"], [2, 3, 1, "", "build_cost_PGE_BEV2S"], [2, 3, 1, "", "build_electricity_cost"], [2, 3, 1, "", "build_objective"], [2, 3, 1, "", "load_prices"]], "feeder_population": [[3, 0, 0, "-", "glm_mod_functions"]], "feeder_population.glm_mod_functions": [[3, 3, 1, "", "load_base_glm"], [3, 3, 1, "", "replace_load_w_meter"], [3, 3, 1, "", "replace_load_w_meter_old"], [3, 3, 1, "", "write_base_glm"], [3, 3, 1, "", "write_class_dict"], [3, 3, 1, "", "write_clock_dict"], [3, 3, 1, "", "write_filter_dict"], [3, 3, 1, "", "write_mod_dict"], [3, 3, 1, "", "write_obj_dict"]], "test_cases": [[8, 0, 0, "-", "base_case"], [9, 0, 0, "-", "battery"]], "test_cases.battery": [[10, 0, 0, "-", "feeder_population"]], "test_cases.battery.feeder_population": [[10, 0, 0, "-", "glm_mod_functions"]], "test_cases.battery.feeder_population.glm_mod_functions": [[10, 3, 1, "", "load_base_glm"], [10, 3, 1, "", "replace_load_w_meter"], [10, 3, 1, "", "replace_load_w_meter_old"], [10, 3, 1, "", "write_base_glm"], [10, 3, 1, "", "write_class_dict"], [10, 3, 1, "", "write_clock_dict"], [10, 3, 1, "", "write_filter_dict"], [10, 3, 1, "", "write_mod_dict"], [10, 3, 1, "", "write_obj_dict"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"ev": [0, 4], "ecosim": [0, 4], "platform": 0, "author": 0, "requir": 0, "folder": 0, "descript": 0, "ambient_data": 0, "base_load_data": 0, "batt_sys_identif": 0, "charging_sim": [0, 2], "batteri": [0, 2, 9, 10], "py": 0, "cell": 0, "modul": [0, 1, 2, 3, 7, 8, 9, 10], "batterypack": [0, 2], "pack": 0, "batteryagingsim": [0, 2], "ag": 0, "control": [0, 2], "chargingst": [0, 2], "charg": [0, 2], "station": 0, "electricitypric": [0, 2], "electr": 0, "price": 0, "optim": [0, 2], "orchestr": [0, 2], "simul": [0, 1, 2], "solar": [0, 2], "pv": 0, "util": [0, 2], "host": 0, "function": 0, "us": 0, "some": 0, "offlin": 0, "der": 0, "cost": 0, "minim": 0, "thi": 0, "i": 0, "run": 0, "mode": 0, "state": 0, "feedback": 0, "dlmodel": 0, "elec_r": 0, "feeder": [0, 3], "feeder_popul": [0, 3, 10], "solar_data": 0, "test_cas": [0, 8, 9, 10], "co": 0, "case": [0, 7], "analysi": [0, 1], "how": 0, "post": [0, 1], "packag": [5, 8, 9, 10], "submodul": [1, 2, 3, 8, 9, 10], "cost_analysi": 1, "load_post_opt_cost": 1, "plot_result": 1, "content": [1, 2, 3, 4, 7, 8, 9, 10], "batterytest": 2, "capacitor": 2, "popul": 3, "glm_mod_funct": [3, 10], "welcom": 4, "1": 4, "0": 4, "indic": 4, "tabl": 4, "test": 7, "subpackag": [7, 9], "base_cas": 8, "event_handl": [8, 9], "gblvar": [8, 9], "glmptime": [8, 9], "master_sim": [8, 9], "sim": [8, 9], "voltdump2": [8, 9], "data_analysi": 9, "event_handlers_oneshot": 9, "parse_voltag": 9, "scenario": 9, "feeder_population_old": 10, "readm": 6}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"Packages": [[5, "packages"]], "Test cases": [[7, "test-cases"]], "Subpackages": [[7, "subpackages"], [9, "subpackages"]], "Module contents": [[7, "module-test_cases"], [1, "module-analysis"], [2, "module-charging_sim"], [3, "module-feeder_population"], [8, "module-test_cases.base_case"], [9, "module-test_cases.battery"], [10, "module-test_cases.battery.feeder_population"]], "Welcome to EV-Ecosim 1.0.0": [[4, "welcome-to-ev-ecosim-1-0-0"]], "Contents:": [[4, null]], "Indices and tables": [[4, "indices-and-tables"]], "Readme": [[6, "readme"]], "EV-Ecosim platform": [[0, "ev-ecosim-platform"]], "Authors": [[0, "authors"]], "Requirements": [[0, "requirements"]], "Folder descriptions": [[0, "folder-descriptions"]], "ambient_data": [[0, "ambient-data"]], "base_load_data": [[0, "base-load-data"]], "batt_sys_identification": [[0, "batt-sys-identification"]], "charging_sim": [[0, "charging-sim"]], "battery.py - Battery cell module.": [[0, "battery-py-battery-cell-module"]], "batterypack.py - Battery pack module.": [[0, "batterypack-py-battery-pack-module"]], "batteryAgingSim.py - Battery aging module.": [[0, "batteryagingsim-py-battery-aging-module"]], "controller.py - Controller module.": [[0, "controller-py-controller-module"]], "chargingStation.py - Charging station module.": [[0, "chargingstation-py-charging-station-module"]], "electricityPrices.py - Electricity prices module.": [[0, "electricityprices-py-electricity-prices-module"]], "optimization.py - Optimization module.": [[0, "optimization-py-optimization-module"]], "orchestrator.py - Simulation orchestrator module.": [[0, "orchestrator-py-simulation-orchestrator-module"]], "solar.py - Solar PV module.": [[0, "solar-py-solar-pv-module"]], "utils.py - Hosts utility functions used by some modules.": [[0, "utils-py-hosts-utility-functions-used-by-some-modules"]], "simulate.py - Offline DER control optimization for cost minimization (this is run for offline mode (no state feedback)).": [[0, "simulate-py-offline-der-control-optimization-for-cost-minimization-this-is-run-for-offline-mode-no-state-feedback"]], "DLMODELS": [[0, "dlmodels"]], "elec_rates": [[0, "elec-rates"]], "feeders": [[0, "feeders"]], "feeder_population": [[0, "feeder-population"]], "solar_data": [[0, "solar-data"]], "test_cases": [[0, "test-cases"]], "Co-simulation cases.": [[0, "co-simulation-cases"]], "analysis": [[0, "analysis"]], "How to run": [[0, "how-to-run"]], "Post-simulation analysis": [[0, "post-simulation-analysis"], [1, "post-simulation-analysis"]], "Submodules": [[1, "submodules"], [2, "submodules"], [3, "submodules"], [8, "submodules"], [9, "submodules"], [10, "submodules"]], "cost_analysis module": [[1, "module-analysis.cost_analysis"]], "load_post_opt_costs module": [[1, "load-post-opt-costs-module"]], "plot_results module": [[1, "plot-results-module"]], "Charging simulator": [[2, "charging-simulator"]], "charging_sim.battery module": [[2, "module-charging_sim.battery"]], "charging_sim.batteryAgingSim module": [[2, "module-charging_sim.batteryAgingSim"]], "charging_sim.batterypack module": [[2, "module-charging_sim.batterypack"]], "charging_sim.batterytest module": [[2, "charging-sim-batterytest-module"]], "charging_sim.capacitor module": [[2, "module-charging_sim.capacitor"]], "charging_sim.chargingStation module": [[2, "module-charging_sim.chargingStation"]], "charging_sim.controller module": [[2, "module-charging_sim.controller"]], "charging_sim.electricityPrices module": [[2, "module-charging_sim.electricityPrices"]], "charging_sim.optimization module": [[2, "module-charging_sim.optimization"]], "charging_sim.orchestrator module": [[2, "module-charging_sim.orchestrator"]], "charging_sim.simulate module": [[2, "module-charging_sim.simulate"]], "charging_sim.solar module": [[2, "module-charging_sim.solar"]], "charging_sim.utils module": [[2, "module-charging_sim.utils"]], "Feeder population": [[3, "feeder-population"]], "feeder_population.feeder_population module": [[3, "feeder-population-feeder-population-module"]], "feeder_population.glm_mod_functions module": [[3, "module-feeder_population.glm_mod_functions"]], "test_cases.base_case package": [[8, "test-cases-base-case-package"]], "test_cases.base_case.event_handlers module": [[8, "test-cases-base-case-event-handlers-module"]], "test_cases.base_case.gblvar module": [[8, "test-cases-base-case-gblvar-module"]], "test_cases.base_case.glmptime module": [[8, "test-cases-base-case-glmptime-module"]], "test_cases.base_case.master_sim module": [[8, "test-cases-base-case-master-sim-module"]], "test_cases.base_case.sim module": [[8, "test-cases-base-case-sim-module"]], "test_cases.base_case.voltdump2 module": [[8, "test-cases-base-case-voltdump2-module"]], "test_cases.battery package": [[9, "test-cases-battery-package"]], "test_cases.battery.data_analysis module": [[9, "test-cases-battery-data-analysis-module"]], "test_cases.battery.event_handlers module": [[9, "test-cases-battery-event-handlers-module"]], "test_cases.battery.event_handlers_oneshot module": [[9, "test-cases-battery-event-handlers-oneshot-module"]], "test_cases.battery.gblvar module": [[9, "test-cases-battery-gblvar-module"]], "test_cases.battery.glmptime module": [[9, "test-cases-battery-glmptime-module"]], "test_cases.battery.master_sim module": [[9, "test-cases-battery-master-sim-module"]], "test_cases.battery.parse_voltages module": [[9, "test-cases-battery-parse-voltages-module"]], "test_cases.battery.scenarios module": [[9, "test-cases-battery-scenarios-module"]], "test_cases.battery.sim module": [[9, "test-cases-battery-sim-module"]], "test_cases.battery.voltdump2 module": [[9, "test-cases-battery-voltdump2-module"]], "test_cases.battery.feeder_population package": [[10, "test-cases-battery-feeder-population-package"]], "test_cases.battery.feeder_population.feeder_population module": [[10, "test-cases-battery-feeder-population-feeder-population-module"]], "test_cases.battery.feeder_population.feeder_population_old module": [[10, "test-cases-battery-feeder-population-feeder-population-old-module"]], "test_cases.battery.feeder_population.glm_mod_functions module": [[10, "module-test_cases.battery.feeder_population.glm_mod_functions"]]}, "indexentries": {"costestimator (class in analysis.cost_analysis)": [[1, "analysis.cost_analysis.CostEstimator"]], "analysis": [[1, "module-analysis"]], "analysis.cost_analysis": [[1, "module-analysis.cost_analysis"]], "calculate_battery_cost() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.calculate_battery_cost"]], "calculate_electricity_cost_pgebev2s() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.calculate_electricity_cost_PGEBEV2s"]], "calculate_solar_cost() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.calculate_solar_cost"]], "calculate_trans_loss_of_life() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.calculate_trans_loss_of_life"]], "module": [[1, "module-analysis"], [1, "module-analysis.cost_analysis"], [2, "module-charging_sim"], [2, "module-charging_sim.battery"], [2, "module-charging_sim.batteryAgingSim"], [2, "module-charging_sim.batterypack"], [2, "module-charging_sim.capacitor"], [2, "module-charging_sim.chargingStation"], [2, "module-charging_sim.controller"], [2, "module-charging_sim.electricityPrices"], [2, "module-charging_sim.optimization"], [2, "module-charging_sim.orchestrator"], [2, "module-charging_sim.simulate"], [2, "module-charging_sim.solar"], [2, "module-charging_sim.utils"], [3, "module-feeder_population"], [3, "module-feeder_population.glm_mod_functions"], [7, "module-test_cases"], [8, "module-test_cases.base_case"], [9, "module-test_cases.battery"], [10, "module-test_cases.battery.feeder_population"], [10, "module-test_cases.battery.feeder_population.glm_mod_functions"]], "plot_loads() (analysis.cost_analysis.costestimator static method)": [[1, "analysis.cost_analysis.CostEstimator.plot_loads"]], "plot_power() (analysis.cost_analysis.costestimator static method)": [[1, "analysis.cost_analysis.CostEstimator.plot_power"]], "plot_soc() (analysis.cost_analysis.costestimator static method)": [[1, "analysis.cost_analysis.CostEstimator.plot_soc"]], "solar_cost() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.solar_cost"]], "transformer_cost() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.transformer_cost"]], "battery (class in charging_sim.battery)": [[2, "charging_sim.battery.Battery"]], "battery (class in charging_sim.batterypack)": [[2, "charging_sim.batterypack.Battery"]], "batteryaging (class in charging_sim.batteryagingsim)": [[2, "charging_sim.batteryAgingSim.BatteryAging"]], "capacitor (class in charging_sim.capacitor)": [[2, "charging_sim.capacitor.Capacitor"]], "chargingsim (class in charging_sim.orchestrator)": [[2, "charging_sim.orchestrator.ChargingSim"]], "chargingstation (class in charging_sim.chargingstation)": [[2, "charging_sim.chargingStation.ChargingStation"]], "lfp_cal_aging() (charging_sim.batteryagingsim.batteryaging static method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.LFP_cal_aging"]], "lfp_cyc_aging() (charging_sim.batteryagingsim.batteryaging static method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.LFP_cyc_aging"]], "mpc (class in charging_sim.controller)": [[2, "charging_sim.controller.MPC"]], "nmc_cal_aging() (charging_sim.batteryagingsim.batteryaging static method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.NMC_cal_aging"]], "nmc_cyc_aging() (charging_sim.batteryagingsim.batteryaging static method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.NMC_cyc_aging"]], "oneshot (class in charging_sim.controller)": [[2, "charging_sim.controller.Oneshot"]], "optimization (class in charging_sim.optimization)": [[2, "charging_sim.optimization.Optimization"]], "pge_bev2_s() (in module charging_sim.utils)": [[2, "charging_sim.utils.PGE_BEV2_S"]], "priceloader (class in charging_sim.electricityprices)": [[2, "charging_sim.electricityPrices.PriceLoader"]], "r_pack (charging_sim.batterypack.battery attribute)": [[2, "charging_sim.batterypack.Battery.R_pack"]], "solar (class in charging_sim.solar)": [[2, "charging_sim.solar.Solar"]], "add_demand_charge() (charging_sim.optimization.optimization method)": [[2, "charging_sim.optimization.Optimization.add_demand_charge"]], "add_power_profile_to_object() (in module charging_sim.utils)": [[2, "charging_sim.utils.add_power_profile_to_object"]], "aggregate_constraints() (charging_sim.optimization.optimization method)": [[2, "charging_sim.optimization.Optimization.aggregate_constraints"]], "battery_setup() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.battery_setup"]], "battery_setup() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.battery_setup"]], "battery_setup_2() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.battery_setup_2"]], "battery_setup_2() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.battery_setup_2"]], "battery_type (charging_sim.batterypack.battery attribute)": [[2, "charging_sim.batterypack.Battery.battery_type"]], "build_battery_cost() (charging_sim.optimization.optimization method)": [[2, "charging_sim.optimization.Optimization.build_battery_cost"]], "build_cost_pge_bev2s() (in module charging_sim.utils)": [[2, "charging_sim.utils.build_cost_PGE_BEV2S"]], "build_electricity_cost() (in module charging_sim.utils)": [[2, "charging_sim.utils.build_electricity_cost"]], "build_emissions_cost() (charging_sim.optimization.optimization method)": [[2, "charging_sim.optimization.Optimization.build_emissions_cost"]], "build_objective() (in module charging_sim.utils)": [[2, "charging_sim.utils.build_objective"]], "build_transformer_cost() (charging_sim.optimization.optimization method)": [[2, "charging_sim.optimization.Optimization.build_transformer_cost"]], "charging_sim": [[2, "module-charging_sim"]], "charging_sim.battery": [[2, "module-charging_sim.battery"]], "charging_sim.batteryagingsim": [[2, "module-charging_sim.batteryAgingSim"]], "charging_sim.batterypack": [[2, "module-charging_sim.batterypack"]], "charging_sim.capacitor": [[2, "module-charging_sim.capacitor"]], "charging_sim.chargingstation": [[2, "module-charging_sim.chargingStation"]], "charging_sim.controller": [[2, "module-charging_sim.controller"]], "charging_sim.electricityprices": [[2, "module-charging_sim.electricityPrices"]], "charging_sim.optimization": [[2, "module-charging_sim.optimization"]], "charging_sim.orchestrator": [[2, "module-charging_sim.orchestrator"]], "charging_sim.simulate": [[2, "module-charging_sim.simulate"]], "charging_sim.solar": [[2, "module-charging_sim.solar"]], "charging_sim.utils": [[2, "module-charging_sim.utils"]], "compute_control() (charging_sim.controller.mpc method)": [[2, "charging_sim.controller.MPC.compute_control"]], "compute_control() (charging_sim.controller.oneshot method)": [[2, "charging_sim.controller.Oneshot.compute_control"]], "config (charging_sim.batterypack.battery attribute)": [[2, "charging_sim.batterypack.Battery.config"]], "controller (charging_sim.batterypack.battery attribute)": [[2, "charging_sim.batterypack.Battery.controller"]], "create_battery_object() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.create_battery_object"]], "create_charging_stations() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.create_charging_stations"]], "create_charging_stations_oneshot() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.create_charging_stations_oneshot"]], "create_solar_object() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.create_solar_object"]], "downscale() (charging_sim.electricityprices.priceloader method)": [[2, "charging_sim.electricityPrices.PriceLoader.downscale"]], "downscale() (charging_sim.solar.solar method)": [[2, "charging_sim.solar.Solar.downscale"]], "dynamics() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.dynamics"]], "dynamics() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.dynamics"]], "est_calendar_aging() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.est_calendar_aging"]], "est_calendar_aging() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.est_calendar_aging"]], "est_cyc_aging() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.est_cyc_aging"]], "est_cyc_aging() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.est_cyc_aging"]], "get_ocv() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.get_OCV"]], "get_ocv() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.get_OCV"]], "get_ro() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.get_Ro"]], "get_action() (charging_sim.orchestrator.chargingsim static method)": [[2, "charging_sim.orchestrator.ChargingSim.get_action"]], "get_aging_value() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.get_aging_value"]], "get_aging_value() (charging_sim.batteryagingsim.batteryaging method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.get_aging_value"]], "get_aging_value() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.get_aging_value"]], "get_battery_constraint() (charging_sim.optimization.optimization method)": [[2, "charging_sim.optimization.Optimization.get_battery_constraint"]], "get_battery_constraints() (charging_sim.controller.mpc method)": [[2, "charging_sim.controller.MPC.get_battery_constraints"]], "get_battery_constraints() (charging_sim.controller.oneshot method)": [[2, "charging_sim.controller.Oneshot.get_battery_constraints"]], "get_calendar_aging() (charging_sim.batteryagingsim.batteryaging method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.get_calendar_aging"]], "get_charger_obj_by_loc() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.get_charger_obj_by_loc"]], "get_charging_sites() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.get_charging_sites"]], "get_constraints() (charging_sim.optimization.optimization method)": [[2, "charging_sim.optimization.Optimization.get_constraints"]], "get_constraints() (charging_sim.solar.solar method)": [[2, "charging_sim.solar.Solar.get_constraints"]], "get_current_load() (charging_sim.chargingstation.chargingstation method)": [[2, "charging_sim.chargingStation.ChargingStation.get_current_load"]], "get_cyc_aging() (charging_sim.batteryagingsim.batteryaging method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.get_cyc_aging"]], "get_power() (charging_sim.solar.solar method)": [[2, "charging_sim.solar.Solar.get_power"]], "get_power_profile() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.get_power_profile"]], "get_power_profile() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.get_power_profile"]], "get_prices() (charging_sim.electricityprices.priceloader method)": [[2, "charging_sim.electricityPrices.PriceLoader.get_prices"]], "get_properties() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.get_properties"]], "get_roundtrip_efficiency() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.get_roundtrip_efficiency"]], "get_roundtrip_efficiency() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.get_roundtrip_efficiency"]], "get_solar_output() (charging_sim.solar.solar method)": [[2, "charging_sim.solar.Solar.get_solar_output"]], "get_total_aging() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.get_total_aging"]], "get_total_aging() (charging_sim.batteryagingsim.batteryaging method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.get_total_aging"]], "get_total_aging() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.get_total_aging"]], "get_true_power() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.get_true_power"]], "get_true_power() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.get_true_power"]], "initialize_aging_sim() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.initialize_aging_sim"]], "initialize_controllers() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.initialize_controllers"]], "initialize_forecast_data() (charging_sim.controller.mpc method)": [[2, "charging_sim.controller.MPC.initialize_forecast_data"]], "initialize_price_loader() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.initialize_price_loader"]], "initialize_solar_module() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.initialize_solar_module"]], "is_ev_arrived() (charging_sim.chargingstation.chargingstation method)": [[2, "charging_sim.chargingStation.ChargingStation.is_EV_arrived"]], "is_charging() (charging_sim.chargingstation.chargingstation method)": [[2, "charging_sim.chargingStation.ChargingStation.is_charging"]], "load_battery_ocv() (charging_sim.controller.mpc method)": [[2, "charging_sim.controller.MPC.load_battery_ocv"]], "load_battery_ocv() (charging_sim.controller.oneshot method)": [[2, "charging_sim.controller.Oneshot.load_battery_ocv"]], "load_battery_params() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.load_battery_params"]], "load_config() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.load_config"]], "load_pack_props() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.load_pack_props"]], "load_prices() (in module charging_sim.utils)": [[2, "charging_sim.utils.load_prices"]], "load_results_summary() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.load_results_summary"]], "main() (in module charging_sim.electricityprices)": [[2, "charging_sim.electricityPrices.main"]], "main() (in module charging_sim.solar)": [[2, "charging_sim.solar.main"]], "make_scenarios() (in module charging_sim.simulate)": [[2, "charging_sim.simulate.make_scenarios"]], "modify_res() (charging_sim.solar.solar method)": [[2, "charging_sim.solar.Solar.modify_res"]], "multistep() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.multistep"]], "nominal_pack_cap (charging_sim.batterypack.battery attribute)": [[2, "charging_sim.batterypack.Battery.nominal_pack_cap"]], "reset_load() (charging_sim.controller.mpc method)": [[2, "charging_sim.controller.MPC.reset_load"]], "reset_load() (charging_sim.controller.oneshot method)": [[2, "charging_sim.controller.Oneshot.reset_load"]], "reset_loads() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.reset_loads"]], "run() (charging_sim.batteryagingsim.batteryaging method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.run"]], "run() (charging_sim.optimization.optimization method)": [[2, "charging_sim.optimization.Optimization.run"]], "run() (in module charging_sim.simulate)": [[2, "charging_sim.simulate.run"]], "run_scenario_single() (in module charging_sim.simulate)": [[2, "charging_sim.simulate.run_scenario_single"]], "run_scenarios_parallel() (in module charging_sim.simulate)": [[2, "charging_sim.simulate.run_scenarios_parallel"]], "run_scenarios_sequential() (in module charging_sim.simulate)": [[2, "charging_sim.simulate.run_scenarios_sequential"]], "save_sim_data() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.save_sim_data"]], "save_sim_data() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.save_sim_data"]], "save_sim_data() (charging_sim.chargingstation.chargingstation method)": [[2, "charging_sim.chargingStation.ChargingStation.save_sim_data"]], "save_states() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.save_states"]], "set_current_load() (charging_sim.chargingstation.chargingstation method)": [[2, "charging_sim.chargingStation.ChargingStation.set_current_load"]], "set_month_data() (charging_sim.electricityprices.priceloader method)": [[2, "charging_sim.electricityPrices.PriceLoader.set_month_data"]], "setup() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.setup"]], "state_eqn() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.state_eqn"]], "state_eqn() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.state_eqn"]], "step() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.step"]], "test() (in module charging_sim.battery)": [[2, "charging_sim.battery.test"]], "test() (in module charging_sim.batterypack)": [[2, "charging_sim.batterypack.test"]], "thermal_dynamics() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.thermal_dynamics"]], "thermal_dynamics() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.thermal_dynamics"]], "track_soc() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.track_SOC"]], "track_soc() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.track_SOC"]], "update_soc() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.update_SOC"]], "update_capacity() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.update_capacity"]], "update_capacity() (charging_sim.batteryagingsim.batteryaging method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.update_capacity"]], "update_capacity() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.update_capacity"]], "update_history() (charging_sim.solar.solar method)": [[2, "charging_sim.solar.Solar.update_history"]], "update_load() (charging_sim.chargingstation.chargingstation method)": [[2, "charging_sim.chargingStation.ChargingStation.update_load"]], "update_load_oneshot() (charging_sim.chargingstation.chargingstation method)": [[2, "charging_sim.chargingStation.ChargingStation.update_load_oneshot"]], "update_max_current() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.update_max_current"]], "update_max_current() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.update_max_current"]], "update_params() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.update_params"]], "update_resistance() (charging_sim.batteryagingsim.batteryaging method)": [[2, "charging_sim.batteryAgingSim.BatteryAging.update_resistance"]], "update_scenario() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.update_scenario"]], "update_status() (charging_sim.chargingstation.chargingstation method)": [[2, "charging_sim.chargingStation.ChargingStation.update_status"]], "update_steps() (charging_sim.orchestrator.chargingsim method)": [[2, "charging_sim.orchestrator.ChargingSim.update_steps"]], "update_voltage() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.update_voltage"]], "update_voltage() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.update_voltage"]], "visualize() (charging_sim.battery.battery method)": [[2, "charging_sim.battery.Battery.visualize"]], "visualize() (charging_sim.batterypack.battery method)": [[2, "charging_sim.batterypack.Battery.visualize"]], "visualize() (charging_sim.chargingstation.chargingstation method)": [[2, "charging_sim.chargingStation.ChargingStation.visualize"]], "feeder_population": [[3, "module-feeder_population"]], "feeder_population.glm_mod_functions": [[3, "module-feeder_population.glm_mod_functions"]], "load_base_glm() (in module feeder_population.glm_mod_functions)": [[3, "feeder_population.glm_mod_functions.load_base_glm"]], "replace_load_w_meter() (in module feeder_population.glm_mod_functions)": [[3, "feeder_population.glm_mod_functions.replace_load_w_meter"]], "replace_load_w_meter_old() (in module feeder_population.glm_mod_functions)": [[3, "feeder_population.glm_mod_functions.replace_load_w_meter_old"]], "write_base_glm() (in module feeder_population.glm_mod_functions)": [[3, "feeder_population.glm_mod_functions.write_base_glm"]], "write_class_dict() (in module feeder_population.glm_mod_functions)": [[3, "feeder_population.glm_mod_functions.write_class_dict"]], "write_clock_dict() (in module feeder_population.glm_mod_functions)": [[3, "feeder_population.glm_mod_functions.write_clock_dict"]], "write_filter_dict() (in module feeder_population.glm_mod_functions)": [[3, "feeder_population.glm_mod_functions.write_filter_dict"]], "write_mod_dict() (in module feeder_population.glm_mod_functions)": [[3, "feeder_population.glm_mod_functions.write_mod_dict"]], "write_obj_dict() (in module feeder_population.glm_mod_functions)": [[3, "feeder_population.glm_mod_functions.write_obj_dict"]], "test_cases": [[7, "module-test_cases"]], "test_cases.base_case": [[8, "module-test_cases.base_case"]], "test_cases.battery": [[9, "module-test_cases.battery"]], "load_base_glm() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[10, "test_cases.battery.feeder_population.glm_mod_functions.load_base_glm"]], "replace_load_w_meter() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[10, "test_cases.battery.feeder_population.glm_mod_functions.replace_load_w_meter"]], "replace_load_w_meter_old() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[10, "test_cases.battery.feeder_population.glm_mod_functions.replace_load_w_meter_old"]], "test_cases.battery.feeder_population": [[10, "module-test_cases.battery.feeder_population"]], "test_cases.battery.feeder_population.glm_mod_functions": [[10, "module-test_cases.battery.feeder_population.glm_mod_functions"]], "write_base_glm() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[10, "test_cases.battery.feeder_population.glm_mod_functions.write_base_glm"]], "write_class_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[10, "test_cases.battery.feeder_population.glm_mod_functions.write_class_dict"]], "write_clock_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[10, "test_cases.battery.feeder_population.glm_mod_functions.write_clock_dict"]], "write_filter_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[10, "test_cases.battery.feeder_population.glm_mod_functions.write_filter_dict"]], "write_mod_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[10, "test_cases.battery.feeder_population.glm_mod_functions.write_mod_dict"]], "write_obj_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[10, "test_cases.battery.feeder_population.glm_mod_functions.write_obj_dict"]]}})
\ No newline at end of file
+Search.setIndex({"docnames": ["README", "analysis", "batt_sys_identification", "charging_sim", "feeder_population", "index", "modules", "readme", "test_cases", "test_cases.base_case", "test_cases.battery", "test_cases.battery.feeder_population"], "filenames": ["README.md", "analysis.rst", "batt_sys_identification.rst", "charging_sim.rst", "feeder_population.rst", "index.rst", "modules.rst", "readme.rst", "test_cases.rst", "test_cases.base_case.rst", "test_cases.battery.rst", "test_cases.battery.feeder_population.rst"], "titles": ["EV-Ecosim platform", "Post-simulation analysis", "Battery System Identification", "Charging simulator", "Feeder population", "Welcome to EV-Ecosim 1.0.0", "Packages", "Readme", "Test cases", "test_cases.base_case package", "test_cases.battery package", "test_cases.battery.feeder_population package"], "terms": {"A": [0, 1, 3], "grid": [0, 1, 3, 5], "awar": [0, 5], "design": [0, 3], "vehicl": [0, 3], "paper": [0, 2, 3], "http": [0, 1, 3], "doi": [0, 3], "org": [0, 3], "10": [0, 2, 3], "36227": [0, 3], "techrxiv": [0, 3], "23596725": [0, 3], "v2": [0, 3], "emmanuel": 0, "balogun": [0, 3], "ebalogun": 0, "stanford": 0, "edu": 0, "lili": 0, "buechler": 0, "ebuech": 0, "gismo": 0, "slac": 0, "gridlab": [0, 4, 5, 11], "d": [0, 4, 5, 11], "instal": [0, 3], "master": 0, "branch": 0, "github": [0, 5], "com": [0, 3], "arra": 0, "energi": [0, 3], "gridlabd": 0, "version": [0, 3, 5], "python": [0, 5], "recommend": 0, "aw": 0, "ec2": 0, "hipa": 0, "ami": 0, "beauharnoi": 0, "x": 0, "ambient": [0, 3], "_": 0, "data": [0, 1, 2, 3], "temperatur": [0, 3], "captur": 0, "effect": [0, 3], "environment": 0, "condit": 0, "subsystem": 0, "transform": [0, 1, 3], "base": [0, 1, 2, 3, 5, 11], "load": [0, 1, 2, 3, 4, 11], "includ": [0, 1, 2, 3, 5], "exist": [0, 3], "build": [0, 1, 3], "home": [0, 3], "usual": [0, 3], "uncontrol": 0, "within": [0, 1, 2, 3], "distribut": [0, 1, 3, 5], "work": [0, 2, 3], "proprietari": 0, "pecan": 0, "street": 0, "below": 0, "an": [0, 3], "exmapl": 0, "prototyp": 0, "note": [0, 3], "column": [0, 2], "field": [0, 2], "ar": [0, 1, 2, 3], "sensit": [0, 2], "The": [0, 1, 2, 3, 5], "origin": [0, 2], "ha": [0, 3], "minut": [0, 3], "resolut": [0, 3], "power": [0, 1, 3, 4, 5, 11], "system": [0, 1, 3, 4, 5, 6, 11], "batt": [0, 3], "sy": 0, "identif": [0, 3, 5, 6], "class": [0, 1, 2, 3, 4, 11], "gener": [0, 2, 3], "paramet": [0, 1, 2, 3, 4, 11], "from": [0, 1, 2, 3, 4], "experiment": 0, "leverag": 0, "genet": [0, 2], "algorithm": [0, 2], "model": [0, 2, 3, 4, 5, 11], "2nd": 0, "order": 0, "rc": 0, "equival": [0, 2], "circuit": [0, 2, 3], "ecm": [0, 2], "One": 0, "can": [0, 1, 2, 3], "custom": 0, "nmc": [0, 3], "upload": 0, "csv": [0, 2, 3], "file": [0, 1, 2, 3, 4, 11], "param": [0, 2, 3], "shown": [0, 5], "save": [0, 1, 3], "new": [0, 2, 3], "addit": 0, "correct": [0, 2, 3], "open": [0, 2, 3], "voltag": [0, 1, 2, 3], "ocv": [0, 2, 3], "valu": [0, 1, 2, 3], "label": [0, 1], "ocv_corr": 0, "abov": 0, "onc": [0, 3], "thei": [0, 2], "battery_data": 0, "config": [0, 3, 6], "json": [0, 3], "modifi": [0, 3, 4, 11], "so": [0, 3], "sim": [0, 3, 6, 8], "contain": [0, 1, 3, 5, 11], "which": [0, 1, 2, 3], "configur": [0, 3], "all": [0, 1, 2, 3, 4], "relev": [0, 3], "implement": [0, 1, 3], "physic": [0, 3], "legaci": 0, "forecast": [0, 3], "develop": [0, 5], "need": [0, 3], "elec": 0, "rate": [0, 3], "time": [0, 2, 3], "tou": [0, 3], "input": [0, 2, 3], "user": [0, 2, 3], "must": [0, 2, 3], "normal": [0, 1], "full": [0, 3], "year": [0, 3], "size": [0, 2], "365": 0, "dai": [0, 1, 3], "avoid": 0, "ani": [0, 2, 3], "error": [0, 2], "format": 0, "read": 0, "sampl": [0, 3], "dure": [0, 2, 3], "should": [0, 3], "one": [0, 2, 3], "15": [0, 3], "also": [0, 1, 3], "help": [0, 3], "downscal": [0, 3, 6], "much": [0, 3], "coarser": 0, "librari": [0, 3], "ieee": [0, 1], "test": [0, 2, 3, 5, 6], "pnnl": 0, "taxonomi": 0, "glm": [0, 4, 11], "have": [0, 2, 3, 5], "spot": 0, "specifi": [0, 3], "primari": 0, "level": [0, 1, 3], "secondari": [0, 3], "popul": [0, 2, 5, 6], "script": 0, "vari": 0, "resourc": [0, 1], "necessari": 0, "txt": [0, 3], "residenti": 0, "repo": 0, "limit": [0, 3], "access": [0, 3, 5], "irradi": [0, 3], "overal": [0, 1, 3], "default": [0, 2, 3], "nation": 0, "radiat": 0, "databas": 0, "nsrdb": 0, "san": 0, "francisco": 0, "bai": 0, "area": [0, 3], "renew": 0, "laboratori": 0, "nrel": [0, 1], "month": [0, 3], "index": [0, 3, 5], "1": [0, 2, 3], "12": [0, 1, 3], "inclus": [0, 2], "januari": 0, "decemb": [0, 3], "hourli": 0, "interv": 0, "oversampl": 0, "4": 0, "dataset": [0, 3], "ghi": [0, 3], "repres": 0, "global": [0, 3], "horizont": [0, 3], "w": 0, "m": 0, "2": [0, 2], "total": [0, 3], "amount": [0, 1], "shortwav": 0, "receiv": 0, "surfac": [0, 3], "ground": 0, "base_cas": [0, 6, 8], "write": [0, 2, 4, 11], "inject": [0, 3], "each": [0, 1, 3], "timestep": 0, "rlsf": 0, "plu": 0, "recurs": 0, "least": [0, 3], "squar": 0, "filter": [0, 4, 11], "estim": [0, 1, 3, 5], "network": [0, 1, 3, 5], "onlin": 0, "thermal": [0, 3], "integr": [0, 5], "plot": [0, 1, 2, 3], "result": [0, 1, 3], "calcul": [0, 1, 3], "impact": [0, 5], "plot_result": [0, 6], "pars": 0, "percentag": [0, 2], "violat": [0, 1], "per": [0, 2, 3], "ansi": 0, "c84": 0, "variabl": [0, 3], "string": [0, 3], "path": [0, 3], "where": [0, 3], "powerflow": 0, "output": [0, 3, 4], "node": [0, 1, 3], "load_post_opt_cost": [0, 6], "tabl": 0, "matric": 0, "respect": [0, 3], "cost_analysi": [0, 6], "costestim": [0, 1, 6], "differ": [0, 1, 3], "compon": [0, 1], "creat": [0, 1, 3], "environ": 0, "conda": 0, "env": 0, "name": [0, 3], "your": [0, 3], "f": [0, 3], "yml": 0, "OR": 0, "packag": [0, 5, 8], "list": [0, 1, 3, 4], "manual": 0, "ensur": [0, 2, 3], "follow": [0, 2, 3], "method": [0, 3], "For": 0, "navig": 0, "set": [0, 2, 3], "prepar": 0, "confirm": 0, "successfulli": 0, "ieee123_secondari": 0, "ieee123_popul": 0, "you": 0, "done": [0, 2, 3], "initi": [0, 3], "pre": [0, 2, 3], "prep": 0, "now": [0, 3], "out": [0, 3], "scenario": [0, 1, 3, 6, 8], "python3": 0, "ev50_cosimul": 0, "master_sim": [0, 6, 8], "pleas": [0, 2], "see": [0, 2], "section": 0, "more": [0, 2, 3], "detail": 0, "thi": [1, 2, 3, 5], "cost": [1, 3], "der": [1, 3], "simul": [2, 4, 5, 6, 11], "num_dai": 1, "sourc": [1, 2, 3, 4, 11], "object": [1, 2, 3, 4, 11], "i": [1, 2, 3, 5], "us": [1, 2, 3, 5], "asset": [1, 3], "ev": [1, 3], "ecosim": [1, 3], "number": [1, 2, 3], "run": [1, 2, 3, 5, 6], "calculate_battery_cost": [1, 6], "result_dir": 1, "batteri": [1, 5, 6, 8], "updat": [1, 2, 3], "lcoe": 1, "directori": 1, "dictionari": [1, 3, 4, 11], "return": [1, 2, 3, 4, 11], "dict": [1, 3, 4], "result_dict": 1, "calculate_electricity_cost_pgebev2": [1, 6], "pge_separate_fil": 1, "true": [1, 2, 3], "electr": [1, 3], "pgebev2": 1, "given": [1, 2, 3], "str": [1, 3], "compris": 1, "dollar": 1, "calculate_solar_cost": [1, 6], "pull": [1, 3], "solar": [1, 5, 6], "ref": [1, 3], "www": [1, 3], "gov": 1, "market": 1, "research": 1, "html": 1, "To": 1, "deprec": [1, 3], "soon": 1, "none": [1, 2, 3], "calculate_trans_loss_of_lif": [1, 6], "expect": 1, "loss": [1, 3], "life": [1, 3], "refer": 1, "5": 1, "11": 1, "3": [1, 2, 5], "std": 1, "c57": 1, "00": 1, "2010": 1, "minimum": [1, 3], "insul": 1, "180": 1, "000": 1, "hour": [1, 3], "static": [1, 3], "plot_load": [1, 6], "total_load": 1, "net_load": 1, "prefix": [1, 3], "overlai": 1, "net": [1, 3], "post": [3, 5, 6], "visual": [1, 3, 6], "demand": [1, 3], "control": [1, 6], "minu": 1, "buffer": 1, "legend": 1, "curv": 1, "plot_pow": [1, 6], "power_pr": 1, "predict": [1, 3], "plot_soc": [1, 6], "soc": [1, 2, 3], "soc_pr": 1, "state": [1, 2, 3], "charg": [1, 2, 5, 6], "solar_cost": [1, 6], "capit": 1, "Not": [1, 2, 3], "fulli": [1, 3], "locat": [1, 3], "pv": [1, 3], "transformer_cost": [1, 3, 6], "cannot": [1, 3], "find": [1, 2, 3], "good": 1, "yet": [1, 2, 3], "ag": [1, 3], "battery_typ": [3, 6], "instanti": [2, 3], "constraint": 3, "properti": 3, "mainli": 3, "max": 3, "c": 3, "determin": 3, "capac": 3, "cell": [2, 3], "multipl": 3, "v": 3, "maximum": 3, "allow": 3, "min": 3, "nomin": 3, "kwh": 3, "deliver": 3, "id": 3, "celsiu": 3, "type": 3, "inconsequenti": 3, "current": [2, 3], "dynam": [3, 6], "bu": 3, "resid": 3, "self": 3, "main": [3, 6], "attribut": [2, 3], "battery_setup": [3, 6], "up": 3, "seri": [2, 3], "parallel": 3, "scale": 3, "ah": 3, "setup": [3, 6], "fix": 3, "while": 3, "float": 3, "pack": 3, "wh": 3, "topologi": 3, "battery_setup_2": [3, 6], "instead": 3, "therebi": 3, "same": 3, "pack_max_ah": 3, "watt": 3, "amp": 3, "cell_amp_hr": 3, "cell_voltag": 3, "propag": 3, "forward": 3, "step": [3, 6], "It": [3, 5], "take": [2, 3], "amper": 3, "np": 3, "cycl": 3, "respons": [2, 3], "est_calendar_ag": [3, 6], "constant": 3, "calendar": 3, "sole": 3, "depend": 3, "later": 3, "linear": [2, 3], "est_cyc_ag": [3, 6], "hess": 3, "et": 3, "al": 3, "its": 3, "cvx": 3, "cvxpy": 3, "describ": [2, 3], "function": [3, 4, 11], "get_ocv": [3, 6], "map": 3, "store": 3, "via": [2, 3, 5], "interpol": 3, "obtain": 3, "priori": 3, "": 3, "get_ro": [2, 3, 6], "possibli": 3, "get_aging_valu": [3, 6], "experienc": 3, "far": 3, "get_power_profil": [3, 6], "profil": 3, "certain": 3, "get_properti": [3, 6], "get_roundtrip_effici": [3, 6], "get_total_ag": [3, 6], "get_true_pow": [3, 6], "save_sim_data": [3, 6], "save_prefix": 3, "over": [2, 3], "call": 3, "upon": 3, "conclus": 3, "desir": [2, 3], "folder": [2, 3], "save_st": [3, 6], "state_eqn": [3, 6], "append": 3, "discret": 3, "equat": 3, "here": 3, "g": 3, "l": 3, "plett": 3, "manag": 3, "volum": 3, "artech": 3, "hous": 3, "2015": 3, "vol": 3, "boolean": 3, "decid": 3, "track": 3, "b": 3, "analys": 3, "histori": 3, "vector": [2, 3], "thermal_dynam": [3, 6], "futur": 3, "track_soc": [3, 6], "update_soc": [3, 6], "update_capac": [3, 6], "anticip": 3, "update_max_curr": [3, 6], "verbos": 3, "fals": [2, 3], "update_param": [3, 6], "chang": 3, "update_voltag": [3, 6], "option": 3, "batteryag": [3, 6], "enact": 3, "resist": [2, 3], "datetim": 3, "num_step": 3, "re": 3, "linimncoo2": 3, "ad": 3, "link": [3, 5], "sciencedirect": 3, "scienc": 3, "articl": 3, "pii": 3, "s0378775314001876": 3, "beta_cap": 3, "fade": 3, "factor": 3, "alpha_cap": 3, "beta_r": 3, "growth": 3, "alpha_r": 3, "assumpt": 3, "homogen": 3, "uniform": 3, "across": 3, "vicin": 3, "lfp_cal_ag": [3, 6], "lfp_cyc_ag": [3, 6], "nmc_cal_ag": [3, 6], "nmc_cyc_ag": [3, 6], "get_calendar_ag": [3, 6], "tupl": 3, "due": 3, "get_cyc_ag": [3, 6], "THe": 3, "both": 3, "adopt": 3, "schmalsteig": 3, "update_resist": [3, 6], "program": 3, "usag": 3, "proper": 3, "py": 3, "exampl": 3, "battery_config_path": 3, "r": 3, "battery_config": 3, "params_list": 3, "kei": 3, "params_": 3, "Then": 3, "params_kei": 3, "actual": 3, "those": 3, "prior": 3, "loadtxt": 3, "path_prefix": 3, "constructor": 3, "buffer_batteri": 3, "r_pack": [3, 6], "sum": 3, "aging_c": 3, "lost": 3, "after": 3, "round": 3, "trip": 3, "effici": 3, "_eff": 3, "last": 3, "load_pack_prop": [3, 6], "dx": 3, "nominal_pack_cap": [3, 6], "meth": 3, "intern": 3, "avail": [3, 5], "defer": 3, "TO": 3, "BE": 3, "anymor": 3, "onli": 3, "right": 3, "behavior": 3, "inspect": 3, "end": 3, "host": [2, 3], "station": [3, 5], "storag": 3, "statu": 3, "idl": 3, "produc": 3, "reactiv": 3, "contribut": 3, "retain": 3, "inform": [3, 5], "etc": 3, "ingest": 3, "assign": 3, "get_current_load": [3, 6], "kw": 3, "is_ev_arriv": [3, 6], "is_charg": [3, 6], "set_current_load": [3, 6], "update_load": [3, 6], "net_grid_load": 3, "ev_load": 3, "mpc": [3, 6], "mode": 3, "update_load_oneshot": [3, 6], "offlin": 3, "non": [2, 3], "update_statu": [3, 6], "scheme": [2, 3], "bess": 3, "compute_control": [3, 6], "price_vector": 3, "action": 3, "comput": 3, "pass": 3, "control_act": 3, "signal": 3, "arbitrag": 3, "get_battery_constraint": [3, 6], "requir": 3, "satisfi": 3, "storage_constraint": 3, "initialize_forecast_data": [3, 6], "load_battery_ocv": [3, 6], "learn": 3, "reset_load": [3, 6], "oneshot": [3, 6], "96": 3, "feedback": 3, "price": 3, "structur": [3, 4, 11], "problem": 3, "pge_bev2_": [3, 6], "valid": 3, "california": 3, "howev": [2, 3], "own": 3, "numpi": 3, "arrai": 3, "priceload": [3, 6], "evs": 3, "profit": 3, "loader": 3, "first": 3, "repositori": 3, "input_r": 3, "output_r": 3, "finer": 3, "similar": 3, "panda": [2, 3], "typic": 3, "get_pric": [3, 6], "start_idx": 3, "7": [2, 3], "assum": 3, "do": 3, "int": 3, "start": 3, "cardin": 3, "being": [2, 3], "jan": 3, "ndarrai": 3, "set_month_data": [3, 6], "solv": 3, "objective_typ": 3, "power_demand": 3, "time_r": 3, "0": [2, 3], "solver": [3, 5], "gurobi": 3, "degrad": 3, "convex": 3, "mix": 3, "integ": 3, "select": [2, 3], "separ": 3, "pc": 3, "success": 3, "counter": 3, "identifi": 3, "backend": 3, "invok": 3, "eco": 3, "mosek": 3, "add_demand_charg": [3, 6], "aggregate_constraint": [3, 6], "aggreg": 3, "build_battery_cost": [3, 6], "build_emissions_cost": [3, 6], "emiss": 3, "build_transformer_cost": [3, 6], "get_constraint": [3, 6], "instanc": [2, 3, 4], "chargingsim": [3, 6], "entir": 3, "num_charging_sit": 3, "6": 3, "num_ev": 3, "1600": 3, "custom_ev_data": 3, "custom_ev_data_path": 3, "custom_solar_data": 3, "custom_solar_data_path": 3, "organ": 3, "other": 3, "sequenti": 3, "manner": 3, "bool": 3, "If": 3, "site": 3, "o": 3, "create_battery_object": [3, 6], "idx": 3, "node_prop": 3, "l2": 3, "dcfc": 3, "create_charging_st": [3, 6], "power_nod": 3, "buse": 3, "create_charging_stations_oneshot": [3, 6], "create_solar_object": [3, 6], "loc": 3, "get_act": [3, 6], "get_charger_obj_by_loc": [3, 6], "get_charging_sit": [3, 6], "initialize_aging_sim": [3, 6], "initialize_control": [3, 6], "initialize_price_load": [3, 6], "memori": 3, "initialize_solar_modul": [3, 6], "load_battery_param": [3, 6], "directli": 3, "unless": 3, "otherwis": 3, "load_config": [3, 6], "walk": 3, "through": 3, "them": 3, "load_results_summari": [3, 6], "save_path_prefix": 3, "some": [2, 3], "multistep": [3, 6], "faster": 3, "than": 3, "horizon": 3, "perfect": 3, "foresight": 3, "daili": 3, "reset": 3, "power_nodes_list": 3, "accordingli": 3, "specif": 3, "stepsiz": 3, "update_scenario": [3, 6], "match": 3, "update_step": [3, 6], "move": 3, "namepl": 3, "p_": 3, "eta": 3, "panel": 3, "make": 3, "decis": 3, "flow": [3, 5], "devic": 3, "get_pow": [3, 6], "desired_shap": 3, "get_solar_output": [3, 6], "modify_r": [3, 6], "new_r": 3, "update_histori": [3, 6], "purpos": 3, "mayb": 3, "schedul": 3, "pge": 3, "doc": 3, "found": 3, "add_power_profile_to_object": [3, 6], "battery_power_profil": 3, "build_cost_pge_bev2": [3, 6], "energy_prices_t": 3, "penalize_max_pow": 3, "max_power_pen": 3, "1000": 3, "heurist": 3, "averag": 3, "conserv": 3, "gamma": 3, "build_electricity_cost": [3, 6], "demand_charg": 3, "opt": 3, "build_object": [3, 6], "electricity_cost": 3, "battery_degradation_cost": 3, "we": [3, 5], "minim": 3, "load_pric": [3, 6], "time_interv": 3, "load_base_glm": [4, 6, 10, 11], "base_file_dir": [4, 11], "base_glm_fil": [4, 11], "replace_load_w_met": [4, 6, 10, 11], "glm_dict": [4, 11], "match_str": [4, 11], "rep_str": [4, 11], "obj_typ": [4, 11], "replac": [4, 11], "meter": [4, 11], "replace_load_w_meter_old": [4, 6, 10, 11], "write_base_glm": [4, 6, 10, 11], "globals_list": [4, 11], "include_list": [4, 11], "out_dir": [4, 11], "file_nam": [4, 11], "sync_list": [4, 11], "write_class_dict": [4, 6, 10, 11], "gld_dict": [4, 11], "class_nam": [4, 11], "correspond": [2, 4, 11], "gld": [4, 11], "write_clock_dict": [4, 6, 10, 11], "clock": [4, 11], "write_filter_dict": [4, 6, 10, 11], "write_mod_dict": [4, 6, 10, 11], "mod_nam": [4, 11], "write_obj_dict": [4, 6, 10, 11], "dict_kei": [4, 11], "co": 5, "platform": 5, "interfac": 5, "phase": 5, "unbalanc": 5, "fast": 5, "made": 5, "web": [2, 5], "tool": [2, 5], "public": 5, "most": 5, "code": 5, "document": [2, 5], "project": 5, "still": 5, "under": 5, "activ": 5, "improv": 5, "todo": 5, "tutori": 5, "analysi": [5, 6], "feeder": [5, 6], "case": [2, 5, 6], "readm": 5, "guid": [], "cite": [], "modul": [2, 5, 6], "search": [2, 5], "page": 5, "submodul": [6, 8], "content": 6, "charging_sim": 6, "batteryagingsim": 6, "batterypack": 6, "batterytest": 6, "capacitor": 6, "chargingst": 6, "electricitypric": 6, "optim": [2, 6], "orchestr": 6, "util": 6, "feeder_popul": [6, 8, 10], "glm_mod_funct": [6, 8, 10], "subpackag": 6, "test_cas": [6, 8], "event_handl": [6, 8], "gblvar": [6, 8], "glmptime": [6, 8], "voltdump2": [6, 8], "data_analysi": [6, 8], "event_handlers_oneshot": [6, 8], "parse_voltag": [6, 8], "feeder_population_old": [8, 10], "without": 3, "studi": 3, "character": 3, "what": 3, "would": 3, "occur": 3, "situ": 3, "wa": [2, 3], "make_scenario": [3, 6], "No": 3, "preload": 3, "reflect": 3, "run_scenario_singl": [3, 6], "singl": 3, "run_scenarios_parallel": [3, 6], "multiprocess": 3, "enough": 3, "core": 3, "ram": 3, "mai": [2, 3], "lead": 3, "process": 3, "freez": 3, "run_scenarios_sequenti": [3, 6], "combin": [2, 3], "fit": 2, "batt_sys_identif": 2, "battery_identif": 2, "batteryparam": [2, 6], "datafram": 2, "liter": 2, "how": 2, "pd": 2, "read_csv": 2, "data_path": 2, "run_sys_identif": [2, 6], "plot_correction_scheme_comparison": [2, 6], "download": 2, "ga": [2, 6], "num_gener": 2, "100": 2, "num_parents_m": 2, "sol_per_pop": 2, "num_gen": 2, "crossover_typ": 2, "single_point": 2, "mutation_typ": 2, "adapt": 2, "parent_selection_typ": 2, "sss": 2, "mutation_percent_gen": 2, "60": 2, "mutation_prob": 2, "crossover_prob": 2, "pygad": 2, "offici": 2, "explan": 2, "been": 2, "accuraci": 2, "speed": 2, "better": 2, "parent": 2, "form": 2, "next": 2, "offspr": 2, "solut": 2, "gene": 2, "cross": 2, "between": 2, "mate": 2, "mutat": 2, "undergo": 2, "probabl": 2, "appli": 2, "oper": 2, "Its": 2, "high": 2, "frequenc": 2, "ro": 2, "r_o": 2, "get_corrected_voltag": [2, 6], "get_uncorrected_voltag": [2, 6], "uncorrect": 2, "plot_ro": [2, 6], "xlim": 2, "20000": 2, "36000": 2, "ylim": 2, "75": 2, "85": 2, "run_ocv_correct": [2, 6], "use_quadrat": 2, "cell_nam": 2, "diagn": 2, "quadrat": 2, "run_pre_check": [2, 6], "check": 2, "length": 2, "begin": 2, "use_initial_pop": 2, "quadratic_bia": 2, "simulate_respons": [2, 6], "complet": 2}, "objects": {"": [[1, 0, 0, "-", "analysis"], [3, 0, 0, "-", "charging_sim"], [4, 0, 0, "-", "feeder_population"], [8, 0, 0, "-", "test_cases"]], "analysis": [[1, 0, 0, "-", "cost_analysis"]], "analysis.cost_analysis": [[1, 1, 1, "", "CostEstimator"]], "analysis.cost_analysis.CostEstimator": [[1, 2, 1, "", "calculate_battery_cost"], [1, 2, 1, "", "calculate_electricity_cost_PGEBEV2s"], [1, 2, 1, "", "calculate_solar_cost"], [1, 2, 1, "", "calculate_trans_loss_of_life"], [1, 2, 1, "", "plot_loads"], [1, 2, 1, "", "plot_power"], [1, 2, 1, "", "plot_soc"], [1, 2, 1, "", "solar_cost"], [1, 2, 1, "", "transformer_cost"]], "batt_sys_identification": [[2, 0, 0, "-", "battery_identification"]], "batt_sys_identification.battery_identification": [[2, 1, 1, "", "BatteryParams"]], "batt_sys_identification.battery_identification.BatteryParams": [[2, 2, 1, "", "ga"], [2, 2, 1, "", "get_Ro"], [2, 2, 1, "", "get_corrected_voltages"], [2, 2, 1, "", "get_uncorrected_voltages"], [2, 2, 1, "", "plot_Ro"], [2, 2, 1, "", "plot_correction_scheme_comparison"], [2, 2, 1, "", "run_ocv_correction"], [2, 2, 1, "", "run_pre_checks"], [2, 2, 1, "", "run_sys_identification"], [2, 2, 1, "", "simulate_response"]], "charging_sim": [[3, 0, 0, "-", "battery"], [3, 0, 0, "-", "batteryAgingSim"], [3, 0, 0, "-", "batterypack"], [3, 0, 0, "-", "capacitor"], [3, 0, 0, "-", "chargingStation"], [3, 0, 0, "-", "controller"], [3, 0, 0, "-", "electricityPrices"], [3, 0, 0, "-", "optimization"], [3, 0, 0, "-", "orchestrator"], [3, 0, 0, "-", "simulate"], [3, 0, 0, "-", "solar"], [3, 0, 0, "-", "utils"]], "charging_sim.battery": [[3, 1, 1, "", "Battery"], [3, 3, 1, "", "test"]], "charging_sim.battery.Battery": [[3, 2, 1, "", "battery_setup"], [3, 2, 1, "", "battery_setup_2"], [3, 2, 1, "", "dynamics"], [3, 2, 1, "", "est_calendar_aging"], [3, 2, 1, "", "est_cyc_aging"], [3, 2, 1, "", "get_OCV"], [3, 2, 1, "", "get_Ro"], [3, 2, 1, "", "get_aging_value"], [3, 2, 1, "", "get_power_profile"], [3, 2, 1, "", "get_properties"], [3, 2, 1, "", "get_roundtrip_efficiency"], [3, 2, 1, "", "get_total_aging"], [3, 2, 1, "", "get_true_power"], [3, 2, 1, "", "save_sim_data"], [3, 2, 1, "", "save_states"], [3, 2, 1, "", "state_eqn"], [3, 2, 1, "", "thermal_dynamics"], [3, 2, 1, "", "track_SOC"], [3, 2, 1, "", "update_SOC"], [3, 2, 1, "", "update_capacity"], [3, 2, 1, "", "update_max_current"], [3, 2, 1, "", "update_params"], [3, 2, 1, "", "update_voltage"], [3, 2, 1, "", "visualize"]], "charging_sim.batteryAgingSim": [[3, 1, 1, "", "BatteryAging"]], "charging_sim.batteryAgingSim.BatteryAging": [[3, 2, 1, "", "LFP_cal_aging"], [3, 2, 1, "", "LFP_cyc_aging"], [3, 2, 1, "", "NMC_cal_aging"], [3, 2, 1, "", "NMC_cyc_aging"], [3, 2, 1, "", "get_aging_value"], [3, 2, 1, "", "get_calendar_aging"], [3, 2, 1, "", "get_cyc_aging"], [3, 2, 1, "", "get_total_aging"], [3, 2, 1, "", "run"], [3, 2, 1, "", "update_capacity"], [3, 2, 1, "", "update_resistance"]], "charging_sim.batterypack": [[3, 1, 1, "", "Battery"], [3, 3, 1, "", "test"]], "charging_sim.batterypack.Battery": [[3, 4, 1, "", "R_pack"], [3, 2, 1, "", "battery_setup"], [3, 2, 1, "", "battery_setup_2"], [3, 4, 1, "", "battery_type"], [3, 4, 1, "", "config"], [3, 4, 1, "", "controller"], [3, 2, 1, "", "dynamics"], [3, 2, 1, "", "est_calendar_aging"], [3, 2, 1, "", "est_cyc_aging"], [3, 2, 1, "", "get_OCV"], [3, 2, 1, "", "get_aging_value"], [3, 2, 1, "", "get_power_profile"], [3, 2, 1, "", "get_roundtrip_efficiency"], [3, 2, 1, "", "get_total_aging"], [3, 2, 1, "", "get_true_power"], [3, 2, 1, "", "load_pack_props"], [3, 4, 1, "", "nominal_pack_cap"], [3, 2, 1, "", "save_sim_data"], [3, 2, 1, "", "state_eqn"], [3, 2, 1, "", "thermal_dynamics"], [3, 2, 1, "", "track_SOC"], [3, 2, 1, "", "update_capacity"], [3, 2, 1, "", "update_max_current"], [3, 2, 1, "", "update_voltage"], [3, 2, 1, "", "visualize"]], "charging_sim.capacitor": [[3, 1, 1, "", "Capacitor"]], "charging_sim.chargingStation": [[3, 1, 1, "", "ChargingStation"]], "charging_sim.chargingStation.ChargingStation": [[3, 2, 1, "", "get_current_load"], [3, 2, 1, "", "is_EV_arrived"], [3, 2, 1, "", "is_charging"], [3, 2, 1, "", "save_sim_data"], [3, 2, 1, "", "set_current_load"], [3, 2, 1, "", "update_load"], [3, 2, 1, "", "update_load_oneshot"], [3, 2, 1, "", "update_status"], [3, 2, 1, "", "visualize"]], "charging_sim.controller": [[3, 1, 1, "", "MPC"], [3, 1, 1, "", "Oneshot"]], "charging_sim.controller.MPC": [[3, 2, 1, "", "compute_control"], [3, 2, 1, "", "get_battery_constraints"], [3, 2, 1, "", "initialize_forecast_data"], [3, 2, 1, "", "load_battery_ocv"], [3, 2, 1, "", "reset_load"]], "charging_sim.controller.Oneshot": [[3, 2, 1, "", "compute_control"], [3, 2, 1, "", "get_battery_constraints"], [3, 2, 1, "", "load_battery_ocv"], [3, 2, 1, "", "reset_load"]], "charging_sim.electricityPrices": [[3, 1, 1, "", "PriceLoader"], [3, 3, 1, "", "main"]], "charging_sim.electricityPrices.PriceLoader": [[3, 2, 1, "", "downscale"], [3, 2, 1, "", "get_prices"], [3, 2, 1, "", "set_month_data"]], "charging_sim.optimization": [[3, 1, 1, "", "Optimization"]], "charging_sim.optimization.Optimization": [[3, 2, 1, "", "add_demand_charge"], [3, 2, 1, "", "aggregate_constraints"], [3, 2, 1, "", "build_battery_cost"], [3, 2, 1, "", "build_emissions_cost"], [3, 2, 1, "", "build_transformer_cost"], [3, 2, 1, "", "get_battery_constraint"], [3, 2, 1, "", "get_constraints"], [3, 2, 1, "", "run"]], "charging_sim.orchestrator": [[3, 1, 1, "", "ChargingSim"]], "charging_sim.orchestrator.ChargingSim": [[3, 2, 1, "", "create_battery_object"], [3, 2, 1, "", "create_charging_stations"], [3, 2, 1, "", "create_charging_stations_oneshot"], [3, 2, 1, "", "create_solar_object"], [3, 2, 1, "", "get_action"], [3, 2, 1, "", "get_charger_obj_by_loc"], [3, 2, 1, "", "get_charging_sites"], [3, 2, 1, "", "initialize_aging_sim"], [3, 2, 1, "", "initialize_controllers"], [3, 2, 1, "", "initialize_price_loader"], [3, 2, 1, "", "initialize_solar_module"], [3, 2, 1, "", "load_battery_params"], [3, 2, 1, "", "load_config"], [3, 2, 1, "", "load_results_summary"], [3, 2, 1, "", "multistep"], [3, 2, 1, "", "reset_loads"], [3, 2, 1, "", "setup"], [3, 2, 1, "", "step"], [3, 2, 1, "", "update_scenario"], [3, 2, 1, "", "update_steps"]], "charging_sim.simulate": [[3, 3, 1, "", "make_scenarios"], [3, 3, 1, "", "run"], [3, 3, 1, "", "run_scenario_single"], [3, 3, 1, "", "run_scenarios_parallel"], [3, 3, 1, "", "run_scenarios_sequential"]], "charging_sim.solar": [[3, 1, 1, "", "Solar"], [3, 3, 1, "", "main"]], "charging_sim.solar.Solar": [[3, 2, 1, "", "downscale"], [3, 2, 1, "", "get_constraints"], [3, 2, 1, "", "get_power"], [3, 2, 1, "", "get_solar_output"], [3, 2, 1, "", "modify_res"], [3, 2, 1, "", "update_history"]], "charging_sim.utils": [[3, 3, 1, "", "PGE_BEV2_S"], [3, 3, 1, "", "add_power_profile_to_object"], [3, 3, 1, "", "build_cost_PGE_BEV2S"], [3, 3, 1, "", "build_electricity_cost"], [3, 3, 1, "", "build_objective"], [3, 3, 1, "", "load_prices"]], "feeder_population": [[4, 0, 0, "-", "glm_mod_functions"]], "feeder_population.glm_mod_functions": [[4, 3, 1, "", "load_base_glm"], [4, 3, 1, "", "replace_load_w_meter"], [4, 3, 1, "", "replace_load_w_meter_old"], [4, 3, 1, "", "write_base_glm"], [4, 3, 1, "", "write_class_dict"], [4, 3, 1, "", "write_clock_dict"], [4, 3, 1, "", "write_filter_dict"], [4, 3, 1, "", "write_mod_dict"], [4, 3, 1, "", "write_obj_dict"]], "test_cases": [[9, 0, 0, "-", "base_case"], [10, 0, 0, "-", "battery"]], "test_cases.battery": [[11, 0, 0, "-", "feeder_population"]], "test_cases.battery.feeder_population": [[11, 0, 0, "-", "glm_mod_functions"]], "test_cases.battery.feeder_population.glm_mod_functions": [[11, 3, 1, "", "load_base_glm"], [11, 3, 1, "", "replace_load_w_meter"], [11, 3, 1, "", "replace_load_w_meter_old"], [11, 3, 1, "", "write_base_glm"], [11, 3, 1, "", "write_class_dict"], [11, 3, 1, "", "write_clock_dict"], [11, 3, 1, "", "write_filter_dict"], [11, 3, 1, "", "write_mod_dict"], [11, 3, 1, "", "write_obj_dict"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"ev": [0, 5], "ecosim": [0, 5], "platform": 0, "author": 0, "requir": 0, "folder": 0, "descript": 0, "ambient_data": 0, "base_load_data": 0, "batt_sys_identif": 0, "charging_sim": [0, 3], "batteri": [0, 2, 3, 10, 11], "py": 0, "cell": 0, "modul": [0, 1, 3, 4, 8, 9, 10, 11], "batterypack": [0, 3], "pack": 0, "batteryagingsim": [0, 3], "ag": 0, "control": [0, 3], "chargingst": [0, 3], "charg": [0, 3], "station": 0, "electricitypric": [0, 3], "electr": 0, "price": 0, "optim": [0, 3], "orchestr": [0, 3], "simul": [0, 1, 3], "solar": [0, 3], "pv": 0, "util": [0, 3], "host": 0, "function": 0, "us": 0, "some": 0, "offlin": 0, "der": 0, "cost": 0, "minim": 0, "thi": 0, "i": 0, "run": 0, "mode": 0, "state": 0, "feedback": 0, "dlmodel": 0, "elec_r": 0, "feeder": [0, 4], "feeder_popul": [0, 4, 11], "solar_data": 0, "test_cas": [0, 9, 10, 11], "co": 0, "case": [0, 8], "analysi": [0, 1], "how": 0, "post": [0, 1], "packag": [6, 9, 10, 11], "submodul": [1, 2, 3, 4, 9, 10, 11], "cost_analysi": 1, "load_post_opt_cost": 1, "plot_result": 1, "content": [1, 3, 4, 5, 8, 9, 10, 11], "batterytest": 3, "capacitor": 3, "popul": 4, "glm_mod_funct": [4, 11], "welcom": 5, "1": 5, "0": 5, "indic": 5, "tabl": 5, "test": 8, "subpackag": [8, 10], "base_cas": 9, "event_handl": [9, 10], "gblvar": [9, 10], "glmptime": [9, 10], "master_sim": [9, 10], "sim": [9, 10], "voltdump2": [9, 10], "data_analysi": 10, "event_handlers_oneshot": 10, "parse_voltag": 10, "scenario": 10, "feeder_population_old": 11, "readm": 7, "system": 2, "identif": 2}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"Test cases": [[8, "test-cases"]], "Subpackages": [[8, "subpackages"], [10, "subpackages"]], "Module contents": [[8, "module-test_cases"], [1, "module-analysis"], [3, "module-charging_sim"], [4, "module-feeder_population"], [9, "module-test_cases.base_case"], [10, "module-test_cases.battery"], [11, "module-test_cases.battery.feeder_population"]], "Welcome to EV-Ecosim 1.0.0": [[5, "welcome-to-ev-ecosim-1-0-0"]], "Contents:": [[5, null]], "Indices and tables": [[5, "indices-and-tables"]], "Readme": [[7, "readme"]], "Submodules": [[2, "submodules"], [1, "submodules"], [3, "submodules"], [4, "submodules"], [9, "submodules"], [10, "submodules"], [11, "submodules"]], "Battery System Identification": [[2, "battery-system-identification"]], "Battery system identification": [[2, "id1"]], "EV-Ecosim platform": [[0, "ev-ecosim-platform"]], "Authors": [[0, "authors"]], "Requirements": [[0, "requirements"]], "Folder descriptions": [[0, "folder-descriptions"]], "ambient_data": [[0, "ambient-data"]], "base_load_data": [[0, "base-load-data"]], "batt_sys_identification": [[0, "batt-sys-identification"]], "charging_sim": [[0, "charging-sim"]], "battery.py - Battery cell module.": [[0, "battery-py-battery-cell-module"]], "batterypack.py - Battery pack module.": [[0, "batterypack-py-battery-pack-module"]], "batteryAgingSim.py - Battery aging module.": [[0, "batteryagingsim-py-battery-aging-module"]], "controller.py - Controller module.": [[0, "controller-py-controller-module"]], "chargingStation.py - Charging station module.": [[0, "chargingstation-py-charging-station-module"]], "electricityPrices.py - Electricity prices module.": [[0, "electricityprices-py-electricity-prices-module"]], "optimization.py - Optimization module.": [[0, "optimization-py-optimization-module"]], "orchestrator.py - Simulation orchestrator module.": [[0, "orchestrator-py-simulation-orchestrator-module"]], "solar.py - Solar PV module.": [[0, "solar-py-solar-pv-module"]], "utils.py - Hosts utility functions used by some modules.": [[0, "utils-py-hosts-utility-functions-used-by-some-modules"]], "simulate.py - Offline DER control optimization for cost minimization (this is run for offline mode (no state feedback)).": [[0, "simulate-py-offline-der-control-optimization-for-cost-minimization-this-is-run-for-offline-mode-no-state-feedback"]], "DLMODELS": [[0, "dlmodels"]], "elec_rates": [[0, "elec-rates"]], "feeders": [[0, "feeders"]], "feeder_population": [[0, "feeder-population"]], "solar_data": [[0, "solar-data"]], "test_cases": [[0, "test-cases"]], "Co-simulation cases.": [[0, "co-simulation-cases"]], "analysis": [[0, "analysis"]], "How to run": [[0, "how-to-run"]], "Post-simulation analysis": [[0, "post-simulation-analysis"], [1, "post-simulation-analysis"]], "cost_analysis module": [[1, "module-analysis.cost_analysis"]], "load_post_opt_costs module": [[1, "load-post-opt-costs-module"]], "plot_results module": [[1, "plot-results-module"]], "Charging simulator": [[3, "charging-simulator"]], "charging_sim.battery module": [[3, "module-charging_sim.battery"]], "charging_sim.batteryAgingSim module": [[3, "module-charging_sim.batteryAgingSim"]], "charging_sim.batterypack module": [[3, "module-charging_sim.batterypack"]], "charging_sim.batterytest module": [[3, "charging-sim-batterytest-module"]], "charging_sim.capacitor module": [[3, "module-charging_sim.capacitor"]], "charging_sim.chargingStation module": [[3, "module-charging_sim.chargingStation"]], "charging_sim.controller module": [[3, "module-charging_sim.controller"]], "charging_sim.electricityPrices module": [[3, "module-charging_sim.electricityPrices"]], "charging_sim.optimization module": [[3, "module-charging_sim.optimization"]], "charging_sim.orchestrator module": [[3, "module-charging_sim.orchestrator"]], "charging_sim.simulate module": [[3, "module-charging_sim.simulate"]], "charging_sim.solar module": [[3, "module-charging_sim.solar"]], "charging_sim.utils module": [[3, "module-charging_sim.utils"]], "Feeder population": [[4, "feeder-population"]], "feeder_population.feeder_population module": [[4, "feeder-population-feeder-population-module"]], "feeder_population.glm_mod_functions module": [[4, "module-feeder_population.glm_mod_functions"]], "Packages": [[6, "packages"]], "test_cases.base_case package": [[9, "test-cases-base-case-package"]], "test_cases.base_case.event_handlers module": [[9, "test-cases-base-case-event-handlers-module"]], "test_cases.base_case.gblvar module": [[9, "test-cases-base-case-gblvar-module"]], "test_cases.base_case.glmptime module": [[9, "test-cases-base-case-glmptime-module"]], "test_cases.base_case.master_sim module": [[9, "test-cases-base-case-master-sim-module"]], "test_cases.base_case.sim module": [[9, "test-cases-base-case-sim-module"]], "test_cases.base_case.voltdump2 module": [[9, "test-cases-base-case-voltdump2-module"]], "test_cases.battery package": [[10, "test-cases-battery-package"]], "test_cases.battery.data_analysis module": [[10, "test-cases-battery-data-analysis-module"]], "test_cases.battery.event_handlers module": [[10, "test-cases-battery-event-handlers-module"]], "test_cases.battery.event_handlers_oneshot module": [[10, "test-cases-battery-event-handlers-oneshot-module"]], "test_cases.battery.gblvar module": [[10, "test-cases-battery-gblvar-module"]], "test_cases.battery.glmptime module": [[10, "test-cases-battery-glmptime-module"]], "test_cases.battery.master_sim module": [[10, "test-cases-battery-master-sim-module"]], "test_cases.battery.parse_voltages module": [[10, "test-cases-battery-parse-voltages-module"]], "test_cases.battery.scenarios module": [[10, "test-cases-battery-scenarios-module"]], "test_cases.battery.sim module": [[10, "test-cases-battery-sim-module"]], "test_cases.battery.voltdump2 module": [[10, "test-cases-battery-voltdump2-module"]], "test_cases.battery.feeder_population package": [[11, "test-cases-battery-feeder-population-package"]], "test_cases.battery.feeder_population.feeder_population module": [[11, "test-cases-battery-feeder-population-feeder-population-module"]], "test_cases.battery.feeder_population.feeder_population_old module": [[11, "test-cases-battery-feeder-population-feeder-population-old-module"]], "test_cases.battery.feeder_population.glm_mod_functions module": [[11, "module-test_cases.battery.feeder_population.glm_mod_functions"]]}, "indexentries": {"costestimator (class in analysis.cost_analysis)": [[1, "analysis.cost_analysis.CostEstimator"]], "analysis": [[1, "module-analysis"]], "analysis.cost_analysis": [[1, "module-analysis.cost_analysis"]], "calculate_battery_cost() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.calculate_battery_cost"]], "calculate_electricity_cost_pgebev2s() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.calculate_electricity_cost_PGEBEV2s"]], "calculate_solar_cost() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.calculate_solar_cost"]], "calculate_trans_loss_of_life() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.calculate_trans_loss_of_life"]], "module": [[1, "module-analysis"], [1, "module-analysis.cost_analysis"], [3, "module-charging_sim"], [3, "module-charging_sim.battery"], [3, "module-charging_sim.batteryAgingSim"], [3, "module-charging_sim.batterypack"], [3, "module-charging_sim.capacitor"], [3, "module-charging_sim.chargingStation"], [3, "module-charging_sim.controller"], [3, "module-charging_sim.electricityPrices"], [3, "module-charging_sim.optimization"], [3, "module-charging_sim.orchestrator"], [3, "module-charging_sim.simulate"], [3, "module-charging_sim.solar"], [3, "module-charging_sim.utils"], [4, "module-feeder_population"], [4, "module-feeder_population.glm_mod_functions"], [8, "module-test_cases"], [9, "module-test_cases.base_case"], [10, "module-test_cases.battery"], [11, "module-test_cases.battery.feeder_population"], [11, "module-test_cases.battery.feeder_population.glm_mod_functions"]], "plot_loads() (analysis.cost_analysis.costestimator static method)": [[1, "analysis.cost_analysis.CostEstimator.plot_loads"]], "plot_power() (analysis.cost_analysis.costestimator static method)": [[1, "analysis.cost_analysis.CostEstimator.plot_power"]], "plot_soc() (analysis.cost_analysis.costestimator static method)": [[1, "analysis.cost_analysis.CostEstimator.plot_soc"]], "solar_cost() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.solar_cost"]], "transformer_cost() (analysis.cost_analysis.costestimator method)": [[1, "analysis.cost_analysis.CostEstimator.transformer_cost"]], "battery (class in charging_sim.battery)": [[3, "charging_sim.battery.Battery"]], "battery (class in charging_sim.batterypack)": [[3, "charging_sim.batterypack.Battery"]], "batteryaging (class in charging_sim.batteryagingsim)": [[3, "charging_sim.batteryAgingSim.BatteryAging"]], "capacitor (class in charging_sim.capacitor)": [[3, "charging_sim.capacitor.Capacitor"]], "chargingsim (class in charging_sim.orchestrator)": [[3, "charging_sim.orchestrator.ChargingSim"]], "chargingstation (class in charging_sim.chargingstation)": [[3, "charging_sim.chargingStation.ChargingStation"]], "lfp_cal_aging() (charging_sim.batteryagingsim.batteryaging static method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.LFP_cal_aging"]], "lfp_cyc_aging() (charging_sim.batteryagingsim.batteryaging static method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.LFP_cyc_aging"]], "mpc (class in charging_sim.controller)": [[3, "charging_sim.controller.MPC"]], "nmc_cal_aging() (charging_sim.batteryagingsim.batteryaging static method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.NMC_cal_aging"]], "nmc_cyc_aging() (charging_sim.batteryagingsim.batteryaging static method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.NMC_cyc_aging"]], "oneshot (class in charging_sim.controller)": [[3, "charging_sim.controller.Oneshot"]], "optimization (class in charging_sim.optimization)": [[3, "charging_sim.optimization.Optimization"]], "pge_bev2_s() (in module charging_sim.utils)": [[3, "charging_sim.utils.PGE_BEV2_S"]], "priceloader (class in charging_sim.electricityprices)": [[3, "charging_sim.electricityPrices.PriceLoader"]], "r_pack (charging_sim.batterypack.battery attribute)": [[3, "charging_sim.batterypack.Battery.R_pack"]], "solar (class in charging_sim.solar)": [[3, "charging_sim.solar.Solar"]], "add_demand_charge() (charging_sim.optimization.optimization method)": [[3, "charging_sim.optimization.Optimization.add_demand_charge"]], "add_power_profile_to_object() (in module charging_sim.utils)": [[3, "charging_sim.utils.add_power_profile_to_object"]], "aggregate_constraints() (charging_sim.optimization.optimization method)": [[3, "charging_sim.optimization.Optimization.aggregate_constraints"]], "battery_setup() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.battery_setup"]], "battery_setup() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.battery_setup"]], "battery_setup_2() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.battery_setup_2"]], "battery_setup_2() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.battery_setup_2"]], "battery_type (charging_sim.batterypack.battery attribute)": [[3, "charging_sim.batterypack.Battery.battery_type"]], "build_battery_cost() (charging_sim.optimization.optimization method)": [[3, "charging_sim.optimization.Optimization.build_battery_cost"]], "build_cost_pge_bev2s() (in module charging_sim.utils)": [[3, "charging_sim.utils.build_cost_PGE_BEV2S"]], "build_electricity_cost() (in module charging_sim.utils)": [[3, "charging_sim.utils.build_electricity_cost"]], "build_emissions_cost() (charging_sim.optimization.optimization method)": [[3, "charging_sim.optimization.Optimization.build_emissions_cost"]], "build_objective() (in module charging_sim.utils)": [[3, "charging_sim.utils.build_objective"]], "build_transformer_cost() (charging_sim.optimization.optimization method)": [[3, "charging_sim.optimization.Optimization.build_transformer_cost"]], "charging_sim": [[3, "module-charging_sim"]], "charging_sim.battery": [[3, "module-charging_sim.battery"]], "charging_sim.batteryagingsim": [[3, "module-charging_sim.batteryAgingSim"]], "charging_sim.batterypack": [[3, "module-charging_sim.batterypack"]], "charging_sim.capacitor": [[3, "module-charging_sim.capacitor"]], "charging_sim.chargingstation": [[3, "module-charging_sim.chargingStation"]], "charging_sim.controller": [[3, "module-charging_sim.controller"]], "charging_sim.electricityprices": [[3, "module-charging_sim.electricityPrices"]], "charging_sim.optimization": [[3, "module-charging_sim.optimization"]], "charging_sim.orchestrator": [[3, "module-charging_sim.orchestrator"]], "charging_sim.simulate": [[3, "module-charging_sim.simulate"]], "charging_sim.solar": [[3, "module-charging_sim.solar"]], "charging_sim.utils": [[3, "module-charging_sim.utils"]], "compute_control() (charging_sim.controller.mpc method)": [[3, "charging_sim.controller.MPC.compute_control"]], "compute_control() (charging_sim.controller.oneshot method)": [[3, "charging_sim.controller.Oneshot.compute_control"]], "config (charging_sim.batterypack.battery attribute)": [[3, "charging_sim.batterypack.Battery.config"]], "controller (charging_sim.batterypack.battery attribute)": [[3, "charging_sim.batterypack.Battery.controller"]], "create_battery_object() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.create_battery_object"]], "create_charging_stations() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.create_charging_stations"]], "create_charging_stations_oneshot() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.create_charging_stations_oneshot"]], "create_solar_object() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.create_solar_object"]], "downscale() (charging_sim.electricityprices.priceloader method)": [[3, "charging_sim.electricityPrices.PriceLoader.downscale"]], "downscale() (charging_sim.solar.solar method)": [[3, "charging_sim.solar.Solar.downscale"]], "dynamics() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.dynamics"]], "dynamics() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.dynamics"]], "est_calendar_aging() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.est_calendar_aging"]], "est_calendar_aging() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.est_calendar_aging"]], "est_cyc_aging() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.est_cyc_aging"]], "est_cyc_aging() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.est_cyc_aging"]], "get_ocv() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.get_OCV"]], "get_ocv() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.get_OCV"]], "get_ro() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.get_Ro"]], "get_action() (charging_sim.orchestrator.chargingsim static method)": [[3, "charging_sim.orchestrator.ChargingSim.get_action"]], "get_aging_value() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.get_aging_value"]], "get_aging_value() (charging_sim.batteryagingsim.batteryaging method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.get_aging_value"]], "get_aging_value() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.get_aging_value"]], "get_battery_constraint() (charging_sim.optimization.optimization method)": [[3, "charging_sim.optimization.Optimization.get_battery_constraint"]], "get_battery_constraints() (charging_sim.controller.mpc method)": [[3, "charging_sim.controller.MPC.get_battery_constraints"]], "get_battery_constraints() (charging_sim.controller.oneshot method)": [[3, "charging_sim.controller.Oneshot.get_battery_constraints"]], "get_calendar_aging() (charging_sim.batteryagingsim.batteryaging method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.get_calendar_aging"]], "get_charger_obj_by_loc() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.get_charger_obj_by_loc"]], "get_charging_sites() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.get_charging_sites"]], "get_constraints() (charging_sim.optimization.optimization method)": [[3, "charging_sim.optimization.Optimization.get_constraints"]], "get_constraints() (charging_sim.solar.solar method)": [[3, "charging_sim.solar.Solar.get_constraints"]], "get_current_load() (charging_sim.chargingstation.chargingstation method)": [[3, "charging_sim.chargingStation.ChargingStation.get_current_load"]], "get_cyc_aging() (charging_sim.batteryagingsim.batteryaging method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.get_cyc_aging"]], "get_power() (charging_sim.solar.solar method)": [[3, "charging_sim.solar.Solar.get_power"]], "get_power_profile() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.get_power_profile"]], "get_power_profile() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.get_power_profile"]], "get_prices() (charging_sim.electricityprices.priceloader method)": [[3, "charging_sim.electricityPrices.PriceLoader.get_prices"]], "get_properties() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.get_properties"]], "get_roundtrip_efficiency() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.get_roundtrip_efficiency"]], "get_roundtrip_efficiency() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.get_roundtrip_efficiency"]], "get_solar_output() (charging_sim.solar.solar method)": [[3, "charging_sim.solar.Solar.get_solar_output"]], "get_total_aging() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.get_total_aging"]], "get_total_aging() (charging_sim.batteryagingsim.batteryaging method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.get_total_aging"]], "get_total_aging() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.get_total_aging"]], "get_true_power() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.get_true_power"]], "get_true_power() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.get_true_power"]], "initialize_aging_sim() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.initialize_aging_sim"]], "initialize_controllers() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.initialize_controllers"]], "initialize_forecast_data() (charging_sim.controller.mpc method)": [[3, "charging_sim.controller.MPC.initialize_forecast_data"]], "initialize_price_loader() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.initialize_price_loader"]], "initialize_solar_module() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.initialize_solar_module"]], "is_ev_arrived() (charging_sim.chargingstation.chargingstation method)": [[3, "charging_sim.chargingStation.ChargingStation.is_EV_arrived"]], "is_charging() (charging_sim.chargingstation.chargingstation method)": [[3, "charging_sim.chargingStation.ChargingStation.is_charging"]], "load_battery_ocv() (charging_sim.controller.mpc method)": [[3, "charging_sim.controller.MPC.load_battery_ocv"]], "load_battery_ocv() (charging_sim.controller.oneshot method)": [[3, "charging_sim.controller.Oneshot.load_battery_ocv"]], "load_battery_params() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.load_battery_params"]], "load_config() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.load_config"]], "load_pack_props() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.load_pack_props"]], "load_prices() (in module charging_sim.utils)": [[3, "charging_sim.utils.load_prices"]], "load_results_summary() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.load_results_summary"]], "main() (in module charging_sim.electricityprices)": [[3, "charging_sim.electricityPrices.main"]], "main() (in module charging_sim.solar)": [[3, "charging_sim.solar.main"]], "make_scenarios() (in module charging_sim.simulate)": [[3, "charging_sim.simulate.make_scenarios"]], "modify_res() (charging_sim.solar.solar method)": [[3, "charging_sim.solar.Solar.modify_res"]], "multistep() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.multistep"]], "nominal_pack_cap (charging_sim.batterypack.battery attribute)": [[3, "charging_sim.batterypack.Battery.nominal_pack_cap"]], "reset_load() (charging_sim.controller.mpc method)": [[3, "charging_sim.controller.MPC.reset_load"]], "reset_load() (charging_sim.controller.oneshot method)": [[3, "charging_sim.controller.Oneshot.reset_load"]], "reset_loads() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.reset_loads"]], "run() (charging_sim.batteryagingsim.batteryaging method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.run"]], "run() (charging_sim.optimization.optimization method)": [[3, "charging_sim.optimization.Optimization.run"]], "run() (in module charging_sim.simulate)": [[3, "charging_sim.simulate.run"]], "run_scenario_single() (in module charging_sim.simulate)": [[3, "charging_sim.simulate.run_scenario_single"]], "run_scenarios_parallel() (in module charging_sim.simulate)": [[3, "charging_sim.simulate.run_scenarios_parallel"]], "run_scenarios_sequential() (in module charging_sim.simulate)": [[3, "charging_sim.simulate.run_scenarios_sequential"]], "save_sim_data() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.save_sim_data"]], "save_sim_data() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.save_sim_data"]], "save_sim_data() (charging_sim.chargingstation.chargingstation method)": [[3, "charging_sim.chargingStation.ChargingStation.save_sim_data"]], "save_states() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.save_states"]], "set_current_load() (charging_sim.chargingstation.chargingstation method)": [[3, "charging_sim.chargingStation.ChargingStation.set_current_load"]], "set_month_data() (charging_sim.electricityprices.priceloader method)": [[3, "charging_sim.electricityPrices.PriceLoader.set_month_data"]], "setup() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.setup"]], "state_eqn() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.state_eqn"]], "state_eqn() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.state_eqn"]], "step() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.step"]], "test() (in module charging_sim.battery)": [[3, "charging_sim.battery.test"]], "test() (in module charging_sim.batterypack)": [[3, "charging_sim.batterypack.test"]], "thermal_dynamics() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.thermal_dynamics"]], "thermal_dynamics() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.thermal_dynamics"]], "track_soc() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.track_SOC"]], "track_soc() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.track_SOC"]], "update_soc() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.update_SOC"]], "update_capacity() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.update_capacity"]], "update_capacity() (charging_sim.batteryagingsim.batteryaging method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.update_capacity"]], "update_capacity() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.update_capacity"]], "update_history() (charging_sim.solar.solar method)": [[3, "charging_sim.solar.Solar.update_history"]], "update_load() (charging_sim.chargingstation.chargingstation method)": [[3, "charging_sim.chargingStation.ChargingStation.update_load"]], "update_load_oneshot() (charging_sim.chargingstation.chargingstation method)": [[3, "charging_sim.chargingStation.ChargingStation.update_load_oneshot"]], "update_max_current() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.update_max_current"]], "update_max_current() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.update_max_current"]], "update_params() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.update_params"]], "update_resistance() (charging_sim.batteryagingsim.batteryaging method)": [[3, "charging_sim.batteryAgingSim.BatteryAging.update_resistance"]], "update_scenario() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.update_scenario"]], "update_status() (charging_sim.chargingstation.chargingstation method)": [[3, "charging_sim.chargingStation.ChargingStation.update_status"]], "update_steps() (charging_sim.orchestrator.chargingsim method)": [[3, "charging_sim.orchestrator.ChargingSim.update_steps"]], "update_voltage() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.update_voltage"]], "update_voltage() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.update_voltage"]], "visualize() (charging_sim.battery.battery method)": [[3, "charging_sim.battery.Battery.visualize"]], "visualize() (charging_sim.batterypack.battery method)": [[3, "charging_sim.batterypack.Battery.visualize"]], "visualize() (charging_sim.chargingstation.chargingstation method)": [[3, "charging_sim.chargingStation.ChargingStation.visualize"]], "feeder_population": [[4, "module-feeder_population"]], "feeder_population.glm_mod_functions": [[4, "module-feeder_population.glm_mod_functions"]], "load_base_glm() (in module feeder_population.glm_mod_functions)": [[4, "feeder_population.glm_mod_functions.load_base_glm"]], "replace_load_w_meter() (in module feeder_population.glm_mod_functions)": [[4, "feeder_population.glm_mod_functions.replace_load_w_meter"]], "replace_load_w_meter_old() (in module feeder_population.glm_mod_functions)": [[4, "feeder_population.glm_mod_functions.replace_load_w_meter_old"]], "write_base_glm() (in module feeder_population.glm_mod_functions)": [[4, "feeder_population.glm_mod_functions.write_base_glm"]], "write_class_dict() (in module feeder_population.glm_mod_functions)": [[4, "feeder_population.glm_mod_functions.write_class_dict"]], "write_clock_dict() (in module feeder_population.glm_mod_functions)": [[4, "feeder_population.glm_mod_functions.write_clock_dict"]], "write_filter_dict() (in module feeder_population.glm_mod_functions)": [[4, "feeder_population.glm_mod_functions.write_filter_dict"]], "write_mod_dict() (in module feeder_population.glm_mod_functions)": [[4, "feeder_population.glm_mod_functions.write_mod_dict"]], "write_obj_dict() (in module feeder_population.glm_mod_functions)": [[4, "feeder_population.glm_mod_functions.write_obj_dict"]], "test_cases": [[8, "module-test_cases"]], "test_cases.base_case": [[9, "module-test_cases.base_case"]], "test_cases.battery": [[10, "module-test_cases.battery"]], "load_base_glm() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[11, "test_cases.battery.feeder_population.glm_mod_functions.load_base_glm"]], "replace_load_w_meter() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[11, "test_cases.battery.feeder_population.glm_mod_functions.replace_load_w_meter"]], "replace_load_w_meter_old() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[11, "test_cases.battery.feeder_population.glm_mod_functions.replace_load_w_meter_old"]], "test_cases.battery.feeder_population": [[11, "module-test_cases.battery.feeder_population"]], "test_cases.battery.feeder_population.glm_mod_functions": [[11, "module-test_cases.battery.feeder_population.glm_mod_functions"]], "write_base_glm() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[11, "test_cases.battery.feeder_population.glm_mod_functions.write_base_glm"]], "write_class_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[11, "test_cases.battery.feeder_population.glm_mod_functions.write_class_dict"]], "write_clock_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[11, "test_cases.battery.feeder_population.glm_mod_functions.write_clock_dict"]], "write_filter_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[11, "test_cases.battery.feeder_population.glm_mod_functions.write_filter_dict"]], "write_mod_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[11, "test_cases.battery.feeder_population.glm_mod_functions.write_mod_dict"]], "write_obj_dict() (in module test_cases.battery.feeder_population.glm_mod_functions)": [[11, "test_cases.battery.feeder_population.glm_mod_functions.write_obj_dict"]]}})
\ No newline at end of file
diff --git a/docs/build/html/test_cases.base_case.html b/docs/build/html/test_cases.base_case.html
index 4a8fb8c2f..1e98ebf56 100644
--- a/docs/build/html/test_cases.base_case.html
+++ b/docs/build/html/test_cases.base_case.html
@@ -46,9 +46,9 @@
|