ampworks.gitt#

Tools to analyze Galvanostatic Intermittent Titration Technique (GITT) data. Includes functions to extract diffusion coefficients and equilibrium potentials from experimental measurements.

Functions#

extract_params(data, radius[, tmin, tmax, return_stats])

Extracts parameters from GITT data.

Package Contents#

ampworks.gitt.extract_params(data, radius, tmin=1, tmax=60, return_stats=False)[source]#

Extracts parameters from GITT data.

GITT, or galvanostatic intermittent titration technique, is an experiment that applies intermittent low-rate charge or discharge pulses separated by long rest periods that establish equilibrium. The experiments can be used to extract important parameters for physics-based models. For example, the open-circuit voltage and solid-phase diffusivity.

The following protocol was used to test this algorithm:

  1. Rest for 5 min, log data every 10 s.

  2. Charge at C/20 for 11 min; with a voltage limit. Log every 0.2 s or 5 mV.

  3. Rest for 135 min, log data every 10 min or every 5 mV.

  4. Stop if voltage limit reached in (2), otherwise repeat (2) and (3).

The protocol assumes formation cycles have already been completed and that the cell was rested until equilibrium before starting the steps above. Implementation details are available in [1]. This specific protocol assumes the cell starts at a fully discharged state and only includes charge pulses; however, you can similarly perform the experiment in the discharge direction or in both directions. The only change would be to step (2) where you would discharge at C/20 instead of charge. It is common to perform the GITT tests in both directions, but you must process the charge and discharge segments separately by slicing your data and calling this routine twice.

Parameters:
  • data (Dataset) – The sliced GITT data to process. Must have, at a minimum, columns for {'Seconds', 'Amps', 'Volts'}. See notes for more information.

  • radius (float) – The representative particle radius of your active material (in meters). It’s common to use D50 / 2, i.e., the median radius of a distribution.

  • tmin (float, optional) – The minimum relative pulse time (in seconds) to use when fitting sqrt(t) vs. voltage for time constants. Default is 1.

  • tmax (float, optional) – The maximum relative pulse time (in seconds) to use when fitting sqrt(t) vs. voltage for time constants. Default is 60. See notes for more info.

  • return_stats (bool, optional) – If False (default), only the extracted parameters vs. state of charge are returned. If True, also returns stats with info about each pulse.

Returns:

  • params (Dataset) – Table of parameters. Columns include ‘SOC’ (state of charge, -), ‘Ds’ (diffusivity, m2/s), and ‘Eeq’ (equilibrium potential, V).

  • stats (Dataset) – Only returned if return_stats=True. Provides additional stats about each pulse, including errors from the sqrt(t) vs. voltage regressions.

Raises:
  • ValueError – ‘data’ is missing columns, required=[‘Seconds’, ‘Amps’, ‘Volts’].

  • ValueError – ‘data’ should not include both charge and discharge segments.

Notes

Rests within the dataset are expected to have a current exactly equal to zero. You can use data.zero_below('Amps', threshold) to manually zero out currents below some tolerance, if needed. This should be done prior to passing in the dataset to this function.

This algorithm expects charge/discharge currents to be positive/negative, respectfully. If your sign convention is the opposite, the mapping to ‘SOC’ in the output will be reversed. You must process data in one direction at a time. In other words, if you performed the GITT protocol in both charge and discharge directions you should slice your data into two datasets and call this routine twice.

The algorithm assumes that sqrt(t) vs. voltage is approximately linear. Mathematically this occurs on time scales much less than the time constant tau = R**2 / D. Large tmax that violate tmax << tau will have incorrect results. See the references for a more detailed discussion. Also, if a pulse has fewer than two data points between the set relative tmin and tmax then the linear regression performed to find the diffusivity and equilbrium potential will return NaN for both.

References

Examples

>>> import ampworks as amp
>>> data = amp.datasets.load_datasets('gitt/gitt_discharge')
>>> params, stats = amp.gitt.extract_params(data, 1.8e-6, return_stats=True)
>>> params.plot('SOC', 'Eeq')
>>> params.plot('SOC', 'Ds', logy=True)
>>> print(params)
>>> print(stats)