Skip to main content
Battery parameterization is built around a simple abstraction: pipeline elements that transform input parameters into output parameters, chained together into a pipeline. This design provides flexibility to handle any parameterization workflow—from simple calculations to complex data fitting.

Pipeline Elements

The basic building block is a pipeline element. Any pipeline element accepts a set of parameter values (possibly empty) and returns another set of parameter values. The full pipeline is built by calling each element in series to yield the complete parameter set. There are five types of pipeline element:
The pipeline element types and built-in calculations listed here are not exhaustive. See the Pipelines API how-to for the full configuration surface.
For example, a capacity pipeline chains an electrode-capacity calculation per electrode with cyclable-lithium and electrode-SOH calculations — each element consuming parameters produced by the elements before it. Each element:
  1. Takes input parameters from the parameter dictionary
  2. Performs computation
  3. Returns output parameters that become available to subsequent elements
To assemble and submit a pipeline programmatically, see Pipelines → Overview in the Documentation tab.

Naming conventions

Clear Naming

Use descriptive parameter names with units: "Electrode capacity [A.h]" not "cap"

Unit Consistency

Be explicit about unit conversions; use SI units internally

Built-in Calculations

Geometry & Capacity

Electrode geometry, mass, capacity, cyclable lithium, and microstructure

Thermal Properties

Heat capacity, Arrhenius temperature dependence, and thermal modeling

Piecewise Interpolants

Smooth piecewise functions for SOC and temperature-dependent parameters

Handling pipeline failures

Pipeline elements run sequentially. When an element fails, the pipeline reports an error and any downstream elements stop. The cause is recorded on the element as an error_code:

Resubmitting a failed pipeline

If the first failed element has error_code = SUBMISSION_FAILED, you can resubmit the pipeline. Resubmission resets that element and continues execution from where the pipeline stopped — completed elements are not re-run.
Open the pipeline detail page. When the lead failure is a submission error, a Resubmit button appears on the failed-element alert at the top of the page. Click it to retry the pipeline in place.
For failures with other error codes (timeouts, internal errors, or configuration issues), create a new pipeline with the corrected configuration instead of resubmitting.

Data Fitting

The pipeline abstraction also powers data fitting—estimating unknown parameters by comparing model predictions to experimental data. A DataFit element wraps a pipeline with an optimization loop:
  • The optimizer proposes parameter values
  • The pipeline runs the model with those values
  • The objective computes how well predictions match data
  • This repeats until the best-fit parameters are found

Data Fitting (theory)

Cost functions, identifiability, regularization, and other theory.

Data Fitting (how-to)

Configure and submit data fits with ionworks-schema + ionworks-api.

Pipeline errors

When a pipeline element fails, Studio shows the element in a Failed state with an error message and a machine-readable error code. Hover the status chip in any pipeline list to see the code, and expand the failed element to read the full message. The same fields are returned by the API on failed jobs and pipeline elements:

Error codes

Use the error_code field to branch on failure type without parsing error strings:

Catching configuration errors in Python

Submitting a pipeline with a bad configuration doesn’t fail at submission time — the job is accepted, then the offending element fails with error_code = CONFIGURATION_ERROR once it runs (see the table above). Waiting for the pipeline with the SDK’s wait_for_completion raises that failure as an IonworksError:
The exception message carries the underlying failure text — for a missing parameter, the same pybamm lookup message shown above ("'Negative electrode loading [A.h.cm-2]' not found. Best matches are [...]"). It does not carry the structured error_code; for that, check the failed element’s status on the job (the JSON shown above) rather than parsing the exception message. When a UCP protocol can’t be simulated as written — for example, a drive cycle referenced by name that wasn’t supplied, a goto target that doesn’t resolve, an end-condition string that doesn’t parse, an initial SOC outside [0, 100], or an expression that references an uninitialised variable — the failed pipeline element is tagged with the CONFIGURATION_ERROR code and its message is surfaced verbatim through the API. This distinguishes a user-correctable protocol issue (fix the protocol, drive cycles, or inputs and retry) from an unexpected internal failure, which is reported as INTERNAL_ERROR.