import glob lookup_table_energy = {} def process_charge(data, r_eq, v_source): t_prev = None v_prev = None e_pj = 0.0 last_t = int(data[-1].split(';')[0]) v_key = int(v_source*10) if v_key not in lookup_table_energy: lookup_table_energy[v_key] = {} lookup_table_energy[v_key][r_eq] = {} # t; v; ; t; ua for line in data[1:]: if 'E' in line: continue line = line.replace(',', '.').replace("\n", '').split(";") # Ignore missing measures if line[3] == '' or line[4] == '': continue t = int(line[0]) v = float(line[1]) i_ua = float(line[4]) if t_prev is None: t_prev = t if v_prev is not None: if v < v_prev: break # E #e_pj += (t-t_prev) * (v_source-v) * i_ua * 1000000.0 e_pj += (t-t_prev) * v * i_ua * 1000000.0 # Q #e_pj += (t-t_prev) * i_ua * 1000000.0 t_prev = t v_prev = v lookup_table_energy[v_key][r_eq][int(e_pj)] = v print(f"Charge @ {v_source}V {r_eq}Ohm - E={round(e_pj/1000000000.0, 4)}mJ; T={t_prev}s ({last_t}s)") def process_discharge(data, r_eq): e = 0.0 t_prev = None v_prev = None lookup_table_energy[r_eq] = {} last_t = int(data[-1].split(';')[0]) # t; v for line in data[1:]: if 'E' in line: continue line = line.replace(',', '.').replace("\n", '').split(";") t = int(line[0]) v = float(line[1]) if t_prev is None: t_prev = t #if v_prev is not None: # if v > v_prev: # break e += (t-t_prev) * (v * v / r_eq) t_prev = t v_prev = v lookup_table_energy[r_eq][int(e*1000000000000.0)] = v print(f"Discharge @ {r_eq}Ohm - E={e*1000.0}mJ; T={t_prev}s ({last_t}s)") for f in glob.glob("*.csv"): name = f.split("_") name[-1] = name[-1].split(".csv")[0] mode = name[0] r = int(name[1].replace('ohm', '')) with open(f) as fp: data = fp.readlines() if mode == 'charge': v = float(name[2].replace('v', '')) process_charge(data, r, v) else: continue process_discharge(data, r) processed = [] print("V_source=0.6V") for e_pj, v in reversed(sorted(lookup_table_energy[6][580].items())): v = round(v, 1) if v not in processed: processed.append(v) print(f"{v}V -> {round(e_pj/1000000000.0, 2)}mJ") print() processed = [] print("V_source=0.8V") for e_pj, v in reversed(sorted(lookup_table_energy[8][580].items())): v = round(v, 1) if v not in processed: processed.append(v) print(f"{v}V -> {round(e_pj/1000000000.0, 2)}mJ")