Skip to content

Commit

Permalink
Merge pull request #6 from GES-mpalermo/main
Browse files Browse the repository at this point in the history
Miscellaneous code fixes
  • Loading branch information
GES-compchem authored Dec 28, 2021
2 parents f5b5ec0 + ee4d18a commit 866d992
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 27 deletions.
77 changes: 52 additions & 25 deletions echemsuite/cellcycling/read_input.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import pandas as pd
import numpy as np
import scipy.integrate as integrate
import sys
import warnings


class CellCycling:
Expand All @@ -9,6 +11,13 @@ class CellCycling:
"""
def __init__(self, cycles):
self._cycles = cycles
self._number_of_cycles = len(self._cycles)

self._capacity_retentions = None # to be initialized in calculate_retention()
self._capacity_efficiencies = None # to be initialized in calculate_efficiency()

self.calculate_capacity_efficiencies()
self.calculate_capacity_retention()

def __getitem__(self, cycle):
return self._cycles[cycle]
Expand All @@ -17,39 +26,41 @@ def __iter__(self):
for obj in self._cycles:
yield obj

def calculate_retention(self, reference = 0):
def calculate_capacity_retention(self, reference = 0):
"""
Calculates capacity retention between cycles, as the ratio between
capacity of cycle n (discharge) minus cycle 1 (discharge)
"""

initial_capacity = self._cycles[reference].capacity_discharge

self._retention = []
self._capacity_retentions = []

for cycle in self._cycles:
self._retention.append(cycle.capacity_discharge / initial_capacity * 100)
self._capacity_retentions.append(cycle.capacity_discharge / initial_capacity * 100)

return self._retention

def calculate_efficiency(self):
def calculate_capacity_efficiencies(self):
"""
Calculates capacity efficiency of the cycles, as the ratio between
capacity of cycle n in charge and discharge
"""

self._efficiency = []
self._capacity_efficiencies = []

for cycle in self._cycles:
self._efficiency.append(cycle.capacity_discharge / cycle.capacity_charge * 100)
self._capacity_efficiencies.append(cycle.capacity_discharge / cycle.capacity_charge * 100)

@property
def retention(self):
return self._retention
def capacity_retention(self):
return self._capacity_retentions

@property
def efficiency(self):
return self._efficiency
def capacity_efficiency(self):
return self._capacity_efficiencies

@property
def number_of_cycles(self):
return self._number_of_cycles


class Cycle:
Expand All @@ -59,6 +70,8 @@ class Cycle:

def __init__(self, number):
self._number = number

# DEV NOTE: move all variable initializations here to default value

@property
def number(self):
Expand Down Expand Up @@ -198,10 +211,18 @@ def calculate_efficiencies(self):
Computes the coulombic and energy efficiency of the cycle as the ratio
between the discharge and charge energies.
"""

self._coulomb_efficiency = self._capacity_discharge / self._capacity_charge * 100
self._energy_efficiency = self._total_energy_discharge / self._total_energy_charge * 100
self._voltage_efficiency = self._energy_efficiency / self._coulomb_efficiency * 100
if any((self._capacity_charge <= 0, self._total_energy_charge <= 0)):
print(f"Warning: cycle {self._number} will be removed due to unphysical charge/discharge value")
#warnings.warn(f"Cycle {self._number} will be removed due to unphysical charge/discharge value")

# 101 is a sentinel value
self._coulomb_efficiency = 101
self._energy_efficiency = 101
self._voltage_efficiency = 101
else:
self._coulomb_efficiency = self._capacity_discharge / self._capacity_charge * 100
self._energy_efficiency = self._total_energy_discharge / self._total_energy_charge * 100
self._voltage_efficiency = self._energy_efficiency / self._coulomb_efficiency * 100

return self._coulomb_efficiency, self._energy_efficiency, self._voltage_efficiency

Expand All @@ -221,13 +242,13 @@ def voltage_efficiency(self):
def build_DTA_cycles(filelist):

cycles = []
cycle_number = 1
cycle_number = 0

for filepath in filelist:

print("Loading:", filepath, "\n")

if filepath.endswith(".DTA"):
if filepath.endswith(".DTA".lower()):

with open(filepath, "r", encoding="utf8", errors="ignore") as file:

Expand Down Expand Up @@ -291,21 +312,21 @@ def build_DTA_cycles(filelist):

else:
print("This is not a .DTA file!")
exit()
sys.exit()

return cycles


def read_mpt_cycles(filelist):

cycles = []
cycle_number = 1
cycle_number = 0

for filepath in filelist:

print("Loading:", filepath, "\n")

if filepath.endswith(".mpt"):
if filepath.endswith(".mpt".lower()):

with open(filepath, "r", encoding="utf8", errors="ignore") as file:

Expand Down Expand Up @@ -382,32 +403,38 @@ def read_mpt_cycles(filelist):

else:
print("This is not a .mpt file!")
exit()
sys.exit()

return cycles


def read_cycles(filelist):

for filepath in filelist:
filepath = r'%s' %filepath

cycles = read_mpt_cycles(filelist)

return CellCycling(cycles)


def build_cycles(filelist):

for filepath in filelist:
filepath = r'%s' %filepath
cycles = build_DTA_cycles(filelist)

return CellCycling(cycles)


def time_adjust(cycle):
def time_adjust(cycle, reverse=False):

if cycle.time_discharge.iloc[0] != cycle.time_charge.iloc[0]:
time_charge = cycle.time_charge.subtract(cycle.time_charge.iloc[0])
time_discharge = cycle.time_discharge.subtract(cycle.time_charge.iloc[-1])
else:
time_charge = cycle.time_charge
time_discharge = cycle.time_discharge

if reverse is True:
time_discharge=time_discharge.sort_values(ascending=False)

return time_charge, time_discharge
2 changes: 1 addition & 1 deletion meta.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{% set name = "GES-echem-suite" %}
{% set version = "0.1.3a" %}
{% set version = "0.1.4a" %}



Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

setuptools.setup(
name="GES-echem-suite",
version="0.1.3a",
version="0.1.4a",
description="",
long_description="",
packages=["echemsuite"],
Expand Down

0 comments on commit 866d992

Please sign in to comment.