v0.10¶
Changelog of the v0.10 release series.
v0.10.2 - Rankine’s Renaissance (July, 15, 2026)¶
New Features¶
SubsystemInterfacenow supports optional power and heat pass-through ports via the newnum_power_interandnum_heat_interparameters. Setting these exposes symmetric inlet/outlet port pairs (power_in{n}/power_out{n}andheat_in{n}/heat_out{n}) and adds the corresponding energy-equality mandatory constraints (\(\dot E_\text{in} = \dot E_\text{out}\)).Subsystemsubclasses can declarenum_power_in,num_power_out,num_heat_in, andnum_heat_outclass attributes before callingsuper().__init__(), following the same pattern as the existingnum_in/num_outfluid interface declaration. This makes it possible to routePowerConnectionandHeatConnectioninstances across subsystem boundaries (PR #1014).
Bug Fixes¶
Default characteristic lines and maps were not available for inherited components. These fell back to x = [0, 1] and y = [1, 1]. Now instances of classes inherit the DEFAULT characteristic lines and maps of parent classes if there is no own DEFAULT (3e65ba3).
Network deserialization wrongly activated serialized but inactive
Refspecifications. Theis_setflags are now restored as exported (PR #1024).Fix some typos in the heat exchanger tutorial (PR #1025).
Contributors¶
v0.10.1 - Rankine’s Renaissance (June, 14, 2026)¶
API Changes¶
The
UA_cecchinatogroup and its parametersre_exp_r,re_exp_sf, andrefrigerant_indexonSectionedHeatExchangerandMovingBoundaryHeatExchangerare deprecated. Use the newUA_cecchinato_hcgroup withre_exp_hotandre_exp_coldinstead. In the next major versionUA_cecchinatowill adopt the hot/cold convention ofUA_cecchinato_hc. Setting the old parameters raises aFutureWarning(PR #985).calc_sections()onHeatExchanger,SectionedHeatExchanger, andMovingBoundaryHeatExchangeris deprecated. Section data is now computed automatically after each solve and exposed asComponentArrayPropertiesattributes directly on the component:Q_sections,T_hot_sections,T_cold_sections,Q_per_section,lmtd_per_section, andphases_per_section. Each attribute provides.valin the network’s user-specified units and.val_SIin SI units. The old return value ofcalc_sections()(a 5-tuple in user units) is still returned but raises aFutureWarning(PR #1001).
New Features¶
phase_ph()is now implemented across all fluid property wrappers, returning a consistent set of string identifiers:"l"(liquid),"g"(gas),"tp"(two-phase), and"sc"(supercritical).Added heat transfer area calculation for the
MovingBoundaryHeatExchangerfollowing the moving-boundary method of [3].A new
ComponentArrayPropertiesdata container has been introduced for array-valued component result properties. It exposes.val_SI(SI units) and.val(network user units, populated by the network after each solve viaset_val_from_SI), following the same unit-routing pattern asComponentProperties. This class is currently intended for result-only use and cannot be set by the user. Its API may change in future versions (PR #1001).
Bug Fixes¶
Fixed specific volume calculation for mixtures containing water in condensing conditions (PR #985).
Fixed
_presolve()to use the actual vapor quality when determining saturation pressure from a simultaneous T and x specification. Previouslyp_sat_T(hardcoded Q=0.5) was used; the newp_sat_TQ()dispatches to the bubble or dew pressure as appropriate. For pure fluids there is no change in behavior (PR #1004).Fixed
Condenserto use the dew temperature at the hot-side inlet incalculate_td_log()andttd_u_func()instead of the bubble temperature. For pure fluids there is no change in behavior (PR #1004).Fixed
PolynomialCompressorEN12900 polynomial evaluation to useT_dew_p()for the evaporation temperature andT_bubble_p()for the condensation temperature, consistent with how reference pressures are defined in the polynomial generation step. For pure fluids there is no change in behavior (PR #1004).Fixed
phase_ph()for mixture-type backends (e.g. REFPROP zeotropic mixtures) wherecalc_phaseis not implemented. Phase is now determined by comparing enthalpy against the bubble and dew enthalpies at the given pressure (PR #1004).
Other Changes¶
All internal pint conversions of the form
.to(...).magnitudehave been replaced with the equivalent but more concise.m_as(...)across the codebase (PR #1001).
Contributors¶
Francesco Witte (@fwitte)
v0.10.0 - Rankine’s Renaissance (June, 03, 2026)¶
API Changes¶
Passing per-quantity unit keyword arguments to
set_attr()(e.g.T_unit,p_unit,h_unit, …) now raises aTypeError. Useset_defaults()instead, e.g.nw.units.set_defaults(temperature='degC', pressure='bar'). The shorthand"C"for Celsius is no longer accepted; use"degC"or"°C"instead (PR #968).The
power_connector_locationattribute ofSimpleHeatExchangeris deprecated and no longer required. UseHeatConnectiontogether with the newHeatSourceandHeatSinkcomponents instead - the inlet or outlet side is detected automatically from the connection (PR #961).Several component parameters have been renamed for clarity (PR #989). Old names remain available as deprecated aliases:
zeta→zeta_d4(zeta1/zeta2→zeta1_d4/zeta2_d4),kA→UA(kA_char→UA_char,kA_group→UA_group,kA_char_group→UA_char_group;kA_char1/kA_char2→UA_char1/UA_char2for two-sided exchangers), andtd_log→lmtd(logarithmic mean temperature difference).The
Busclass has been removed. UsePowerConnectiontogether withPowerBus,MotorandGeneratorinstead (PR #964).The
rpmparameter ofPolynomialCompressoris deprecated in favour offrequency, which integrates with TESPy’s unit framework (e.g. set"1/min"as the network frequency unit). Therpm_displacementandrpm_polykeys inreference_stateare deprecated in favour offrequency_displacement(Hz) andfrequency_poly(Hz). Thedisplacementkey (m³/h) paired withfrequency_displacementremains supported, orswept_volume(m³ per revolution) can be provided directly. A helper functionswept_volume_from_displacement()is available to convert manufacturer displacement data to swept volume (PR #826).Several previously deprecated features have been removed: the
Td_bpparameter ofConnection, theQ_diss_relparameter ofPolynomialCompressor, thezeta="var"option, the helper functionsconvert_to_SIandconvert_from_SI, andfluid_property_datafromglobal_vars(PR #973).Setting a
Refon aConnectionparameter now automatically unsets any previously specified numerical value for that parameter, and setting a numerical value automatically unsets any previously setRef. Both could be set simultaneously before, which raised aFutureWarning.The
char_map_prandchar_map_eta_sparameters ofCompressorare deprecated. UseTurboCompressorinstead, which is the dedicated class providing characteristic map offdesign capability.The pygmo compatibility interface of
OptimizationProblemhas been removed. Thefitness,get_nobj,get_nic,get_bounds,runand_process_generation_datamethods are no longer available. Use pymoo-based workflows instead (install viapip install tespy[opt]).The built-in
ExergyAnalysisclass has been removed and its functionality moved to the external library exerpy. Usetespy.models.template.ModelTemplate.run_exergy_analysis()or callExergyAnalysis.from_tespy(nw, Tamb, pamb)directly from exerpy (PR #963).
New Features¶
A new
f_noxparameter has been added toCombustionChamberand derived combustion components. Setting it enables nitric oxide (NO) formation modelling: the value represents the mass-based NO generation rate (mass of NO created per unit mass of total fuel and air input). Requires pyromat being installed as fluid property backend (PR #904).
Other Changes¶
Internal Newton solver improvements (PR #987):
The CPU Jacobian solve now uses row- and column-scaled
numpy.linalg.solveinstead of explicit matrix inversion vianumpy.linalg.inv, improving numerical stability and performance.The dense incidence matrix is now built once before the Newton loop instead of being rebuilt on every iteration.
Jacobian singularity diagnosis has been extracted into a dedicated
_diagnose_singularitymethod, separated from the matrix solve in_invert_jacobian.Structural singularity detection now uses
numpy.linalg.matrix_rankinstead ofnumpy.linalg.det, which is numerically stable for arbitrarily sized matrices.CoolPropWrappernow caches the lastAS.updatecall and skips redundant updates when the same input pair and values are requested consecutively.get_fluid_data()now caches and reuses the fluid data dict across calls, only rebuilding it when the fluid set changes (e.g. in combustion components).calc_results()now skips the unit conversion for parameters that have not been fixed by the user, avoiding redundant pint conversions during postprocessing.HeatExchangernow caches temperature values computed in_get_T_at_stepsby(p, h)key, so that unperturbed sides of the heat exchanger are not recomputed during finite-difference Jacobian evaluation. The cache is cleared at the start of each solve via_preprocess.
Support for Python 3.10 has been dropped.
Installation instructions now recommend uv as the primary package manager (PR #967).
Companion
print_*methods have been added for all debugging inspection methods onNetwork:print_variables_before_presolve(),print_presolved_variables(),print_variables(),print_presolved_equations(),print_equations(),print_equations_with_dependents(), andprint_incidence_matrix(). Error messages that reference variables or equations now use the same human-readable formatting as these print methods (PR #969).get_ude()has been added, analogous toget_comp()andget_conn(), to retrieve aUserDefinedEquationby label. Not found labels currently returnNone, they will raise aKeyErrorin a future version (PR #966).save()now accepts anas_dict=Trueflag to return the network state as a plaindict, which can be passed directly asdesign_pathorinit_pathin a subsequentsolve()call without writing to disk. PassingNonewithoutas_dict=Truestill works but is deprecated (PR #962).Mixing rules are now registered via a
MixingRuleRegistry, making it possible to add custom mixing rules at runtime (PR #960).You can now pass a
postproc_funcargument tosensitivity_analysis(), which accepts any callablepostproc_func(model) -> dict | Noneto be executed after each solve step (PR #963).The automatic y-axis limits of
plot_Ts_diagram_matplotlib()andplot_logph_diagram_matplotlib()now extend to at least the fluid’s critical temperature or critical pressure respectively, so the two-phase dome is always fully visible when no explicitylimis passed (PR #963).Change outlet 1 description to saturated gas constraint for DropletSeparator (PR #977).
Component parameters can now have a
calcmethod, which is automatically executed in postprocessing to assign the respective SI value to the parameter (PR #980).Fix logging message in connection preprocessing (PR #988).
generate_component_schema()andgenerate_connection_schema()export a JSON description of all registered component and connection parameters - including container type, physical quantity and description - for use in external tooling (PR #938).A docstring updater script has been added at
docs/scripts/docstring_updater.py. It regenerates the Ports, Mandatory Equations, and Parameters sections of all registered component and connection class docstrings from live introspection ofport_schema(),get_mandatory_constraints(), andget_parameters(), while preserving the introductory paragraph,Notessections, andExampleblocks verbatim (PR #938).The isentropic calculation in compressor, pump, turbine and displacement machine components is now guarded against fluid property backend errors in the same way fluid property boundaries already are (PR #1000).
Component parameters whose Jacobian depends on multiple equations can now declare their scalar and vector dependents as separate keys (
{"scalars": [...], "vectors": [...]}) in addition to the flat list form. The derivative dispatcher in_assign_dependents_and_eq_mapping()routes each form correctly, enabling selective finite-difference increments for grouped parameters with mixed scalar/vector dependencies (PR #1000).
Bug Fixes¶
export()andsave()now create the target directory if it does not exist yet (PR #965).save_csv()no longer writesComponentCSV files inside theConnectionsubdirectory when both are exported together (PR #966)._adjust_to_two_phase()was not working correctly withtd_dewortd_bubbleequal to zero (PR #971).
Contributors¶
Francesco Witte (@fwitte)