THERMOS Job Server

Input schema
buildings

Each row is a building, or demand that can be connected to a heat network. Buildings which are forbidden (by 'constraint') are not validated, because they cannot be in a solution.

FieldTypeDescription
geometryanything but nullA point or polygon for the building
building_idnullable stringUsed to identify this building in other outputs.
annual_demand_kwhdouble greater than or equal to 0.0The annual heat demand for the building; drives revenues from tariffs.
peak_demand_kwdouble greater than or equal to 0.0The peak heat demand for the building; drives connection costs. Assumed to already incorporate any load diversity within the building.
connectionsinteger greater than or equal to 1The number of end users in the building; for example a block of flats might have multiple connections in it.
constraintkeyword, and enum of :required, :optional, :forbiddenHow the solution is constrained for this element. If required, it must be in the network. If optional, it may or may not. Otherwise it may not be used
demand_groupanythingAny buildings which have the same demand group will either all be connected at once or not at all.
connection_cost_idintegerRefers to the connection costs table
tariff_idintegerRefers to the tariffs table
extra_pvnullable doubleAn additional PV for connecting this building (or if negative, cost)
paths

Each row is a path where a heat network pipe can be laid.

FieldTypeDescription
geometryanything but nullThe line-string geometry for this path
path_idnullable stringUsed to identify this path in other outputs. Paths may be split into parts, in which case a new ID will be generated.
constraintkeyword, and enum of :required, :optional, :forbiddenHow the solution is constrained for this element. If required, it must be in the network. If optional, it may or may not. Otherwise it may not be used
existing_diameternullable double greater than or equal to 10.0If a pipe is already here, the diameter of that pipe (in mm). When there is an existing pipe, the network will pay only REPEX for it unless a larger pipe is needed. If a larger pipe is needed, the cost is as for a new pipe.
civil_cost_idnullable integerRefers to the civil costs table. Determines the cost of putting a pipe here
extra_pvnullable doubleAn additional PV for using this path (or if negative, cost)
supply_costs

Additional complex supply costs table. Each supply may have a number of additional cost components added through this table. They are added together, and are applied additionally to the simple costs present in the supply table.

FieldTypeDescription
supply_cost_typestringAn identifier to group related supply cost rows. Can be referred to from supply table.
typestringA user-defined name for the cost (e.g. plant, energy_centre, ...)
costkeyword, and enum of :capex_per_kw, :capex_fixed, :opex_per_kw, :opex_fixed, :repex_per_kw, :repex_fixed, :heat_per_kwhWhat kind of cost this is
valueA ¤/kW curve. Each entry is a point on the curve, as (kW capacity, ¤ cost). If the curve is too short, it continues flat. Can be used for any _per_kw type, or A timeseries; entry N is the cost in year N. Can be used for heat_per_kwh type., or A constant value. Can be used for any type; for _per_kw or _per_kwh implies a series of enough length.The cost itself; can be a curve expressed as json, or a constant value.
tariffs

Tariffs produce income for the network; they determine the value of connecting a building.

FieldTypeDescription
tariff_idintegerUsed to refer to the tariff in other tables
namestringA friendly name for the tariff
annual_charge_fixeddouble greater than or equal to 0.0Customers on this tariff pay this fixed cost every year from year 1
annual_charge_per_kwhdouble greater than or equal to 0.0Customers on this tarriff pay this per unit heat delivered from year 1
annual_charge_per_kwdouble greater than or equal to 0.0Customers on this tariff pay this per kW peak demand from year 1
connection_charge_fixeddouble greater than or equal to 0.0Customers on this tariff pay this fixed cost up-front in year 0
connection_charge_per_kwdouble greater than or equal to 0.0Customers on this tariff pay this fixed cost per kW peak demand up-front in year 0
connection_costs

Connection costs are costs to the network (distinct from connection charges, seen in the tariff structure). They represent works in the building to connect it to a network, e.g. HIU installation.

FieldTypeDescription
connection_cost_idanythingUsed to refer to the connection cost in other tables
namestringA friendly name for the connection cost
capex_fixeddouble greater than or equal to 0.0The fixed up-front part of this connection cost
capex_per_connectiondouble greater than or equal to 0.0An up-front cost paid per connection within the building (see the buildings table column 'connections')
capex_per_kwdouble greater than or equal to 0.0An up-front cost paid per unit capacity
repex_fixeddouble greater than or equal to 0.0The fixed repex for this connection cost; lifetime is set by the parameters
repex_per_connectiondouble greater than or equal to 0.0The repex per connection within the building (see buildings -> connections).
repex_per_kwdouble greater than or equal to 0.0The repex per unit capacity
opex_fixeddouble greater than or equal to 0.0The annual fixed opex paid for this connection cost
opex_per_connectiondouble greater than or equal to 0.0The annual opex per connection within the building (see buildings -> connections)
opex_per_kwdouble greater than or equal to 0.0The annual opex per kW capacity needed
supplies

Each row is a point where the heat network can be supplied with heat.

FieldTypeDescription
geometryanything but nullA point or polygon where the supply is
supply_idnullable stringUsed to identify this supply in other outputs
constraintkeyword, and enum of :required, :optional, :forbiddenHow the solution is constrained for this element. If required, it must be in the network. If optional, it may or may not. Otherwise it may not be used
annual_capacity_kwhdouble greater than or equal to 0.0The maximum kWh our this supply can yield
peak_capacity_kwdouble greater than or equal to 0.0The maximum output this supply can yield
capex_fixeddouble greater than or equal to 0.0The fixed upfront cost
capex_per_kwdouble greater than or equal to 0.0The upfront cost per unit capacity
opex_fixeddouble greater than or equal to 0.0The annual fixed opex
opex_per_kwdouble greater than or equal to 0.0The annual opex per unit capacity
repex_fixeddouble greater than or equal to 0.0The fixed repex - lifetime is set by parameters
repex_per_kwdouble greater than or equal to 0.0The capacity related repex - lifetime is set by parameters
cost_per_kwhdouble greater than or equal to 0.0The cost per unit heat produced
emissions_per_kwhnullable double greater than or equal to 0.0The emissions factor for kgCO2 equivalent per kWh heat output.
supply_cost_typenullable stringOptionally a reference to supply_cost_type in supply_costs
parameters

Parameters are global settings that control the optimiser. See parameter specific help for more info.

FieldTypeDescription
parameterkeyword, and enum of :finance/npv-rate, :finance/npv-term, :finance/plant-lifetime, :finance/distribution-lifetime, :finance/building-hx-lifetime, :optimiser/runtime-limit, :optimiser/mip-gap, :optimiser/param-gap, :optimiser/iteration-limit, :optimiser/flow-temperature, :optimiser/return-temperature, :optimiser/ground-temperature, :network/diversity-limit, :network/diversity-rate, :optimiser/objective, :optimiser/prevent-loops, :constraint/min-linear-density, :constraint/max-linear-density, :constraint/min-kwh, :constraint/max-kwh, :constraint/min-network-length, :constraint/max-network-length, :constraint/min-npv, :constraint/max-npv, :constraint/max-emissions-factor, :constraint/min-buildings, :constraint/max-buildings, :constraint/min-connections, :constraint/max-connections, :constraint/max-supplies, :objective/use-connection-capex, :objective/use-connection-repex, :objective/use-connection-opex, :objective/use-supply-capex, :objective/use-supply-repex, :objective/use-supply-opex, :objective/use-pipe-capex, :objective/use-pipe-repex, :objective/use-tariffsThe name of a parameter
valuenullable stringThe value of the parameter. A blank string is equivalent to a NULL. Some parameters are allowed to be NULL; see the parameter specific help for more info.
civil_costs

Describes the cost per meter of flow and return pipe and trenching according to different dig conditions.

FieldTypeDescription
diameter_mmdouble greater than or equal to 10.0The diameter of flow / return pipe in mm
civil_cost_idintegerThe civil cost ID; this says what kind of surface is being dug up (see civil_cost_names)
cost_mdouble greater than or equal to 0.0The capex (and repex) of 1m of flow and return pipe of this diameter installed
civil_cost_names

Gives friendly names to the civil cost IDs used in civil_costs

FieldTypeDescription
civil_cost_idintegerThe identifier used in civil_costs and in paths tables to refer to a civil cost
namestringA friendly name (e.g. soft dig / hard dig)
is_defaultnullable booleanWhether this is the default civil cost. It will be used for paths with no civil cost set, and for connectors introduced by the model. Should be true for exactly one row.
Output schema
buildings

The buildings table will be updated with new columns.

FieldTypeDescription
building_idstringThe input building_id, or a new building ID will be generated
in_networkbooleanTrue if the building got connected to a heat network.
unreachablebooleanTrue if the building cannot be on a network because there is no path from any supply to it.
connection_cost_pvdoubleThe PV contribution of the connection cost for the building
tariff_pvdoubleThe PV contribution of tariff revenues for the building
supplies

Supply rows are updated with additional columns.

FieldTypeDescription
supply_idstringThe supply ID from the input, or a newly generated ID if no ID in the input
in_networkbooleanTrue if the supply is used in the network
diversitynullable doubleThe diversity factor applied to the total demand this supply is meeting
load_kwnullable doubleThe peak output from the supply (after diversity, kW)
load_kwhnullable doubleThe annual output from the supply (including losses, kWh/yr)
plant_pvnullable doubleThe total PV contribution from the supply
paths

The paths table will be updated with new rows and new columns. New rows are created for connectors or when an input path is split into pieces.

FieldTypeDescription
geometryanythingThe geometry of the path
path_idstringThe ID for the path. If it is the entirety of an input path, this will be the path_id of the input path (which will be generated if absent). If the input has been split into parts, they will have their original ID with a suffix -1 -2 etc. If the path is a connector an ID like C-1, C-2 will be generated.
in_networkbooleanTrue if the path is used in the heat network.
connectorbooleanTrue if the path was a connector generated by the model.
diameter_mmnullable doubleThe diameter of installed pipe.
diversitynullable doubleThe diversity applied to the loads down the pipe.
load_kwnullable doubleThe peak power the pipe carries (kW)
capacity_kwnullable doubleThe maximum power the pipe could carry (kW)
losses_kwhnullable doubleThe annual heat loss from the pipe (kWh/yr)
cost_pvnullable doubleThe PV contribution of the pipe
peripheralbooleanIf true, the path doesn't go to any demands, so would never be in a network.
unreachablebooleanIf true, the path is not connected to any supply, and so cannot be in a network.
cashflow

The cashflow table is added to the output and contains details of the cost model.

FieldTypeDescription
yearintegerThe year in which the cost happens, starting from 0. Costs in year 0 are not discounted, costs in year 1 are discounted once, and so on.
valuedoubleThe nominal value in that year (without discounting)
costnullable stringWhat kind of cost is this (capex, opex, etc)
typenullable stringWhat part of the system is this cost for (a pipe, a building etc)
connection_cost_idnullable integerRefers to connection_cost_id in the connection_costs table
tariff_idnullable integerRefers to tariff_id in the tariffs table
civil_cost_idnullable integerRefers to civil_cost_id in the civil_costs table
building_idnullable stringRefers to building_id in the buildings table
supply_idnullable stringRefers to supply_id in the supplies table
path_idnullable stringRefers to path_id in the paths table
solution_summary

A single-row giving some high-level information about the optimisation and the solution

FieldTypeDescription
statestringWhether the solution is optimal, non-optimal, proven infeasible, etc.
objectivedoubleThe objective value.
mip_gapdoubleThe MIP gap of the solution.
runtimedoubleThe runtime of the optimisation in seconds.
iterationsintegerThe number of iterations of the optimisation loop
lower_bounddoubleThe lower bound on the objective
upper_bounddoubleThe upper bound on the objective
network_building_countintegerHow many buildings were connected to a network.
network_connection_countintegerHow many customers were connected to a network (some buildings may have multiple connections).
network_lengthdoubleThe length of the network, in meters
network_linear_densitydoubleThe useful heat delivered by the network divided by its length, in kWh/m
network_kwhdoubleThe useful heat delivered by the network, in kWh/yr
network_losses_kwhdoubleThe heat losses from the network, in kWh/yr
network_npvdoubleThe total NPV of all the network components; this does not reflect the parameters controlling which types of cost are included in the objective.
git_revstringThe model version used to generate this result
userstringThe user who ran the model
runstringThe name for the run
start_datestringWhen the run started
infeasible_reasons

If present, possible explanations for why the problem is infeasible

FieldTypeDescription
reason_typestringA short string categorising the explanation
messagestringAn explanatory message that may be the cause of infeasibility