{
  "node": {
    "id": "term:heat-generation",
    "type": "Term",
    "label": "Heat generation",
    "properties": {
      "id": "heat-generation",
      "name": "Heat generation",
      "aka": [
        "Bernardi equation"
      ],
      "section": "topic-thermal",
      "definition": "The heat a cell produces in operation: an irreversible part equal to current times overpotential, and a reversible part from the entropy change, I·T·dE/dT. The Bernardi equation sums them and feeds every thermal model.",
      "formula": "q = I(V − E_OCV) + I·T·(dE/dT)",
      "unit": "W",
      "related": [
        "entropy-coefficient",
        "internal-resistance",
        "thermal-model",
        "thermal-management",
        "exothermic"
      ],
      "example": {
        "title": "Keep reversible and irreversible heat separate",
        "text": "With charging current +5 A and terminal voltage 0.10 V above OCV, the irreversible term is 0.50 W. At 300 K with dE/dT = +0.1 mV/K, the reversible contribution is +0.15 W, giving 0.65 W under this sign convention."
      },
      "url": "https://lemonergy.com/learn/glossary/heat-generation/",
      "mentions": [
        "overpotential"
      ]
    }
  },
  "edges": [
    {
      "id": "edge:usesBlock/term:heat-generation/block:edge-cooling-plate",
      "source": "term:heat-generation",
      "target": "block:edge-cooling-plate",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:electrothermal-resistor",
      "source": "term:heat-generation",
      "target": "block:electrothermal-resistor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:initial-temperature-constraint",
      "source": "term:heat-generation",
      "target": "block:initial-temperature-constraint",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:liquid-reservoir",
      "source": "term:heat-generation",
      "target": "block:liquid-reservoir",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:parallel-cooling-plate",
      "source": "term:heat-generation",
      "target": "block:parallel-cooling-plate",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-conductor",
      "source": "term:heat-generation",
      "target": "block:thermal-conductor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-controlled-heat-source",
      "source": "term:heat-generation",
      "target": "block:thermal-controlled-heat-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-controlled-temperature-source",
      "source": "term:heat-generation",
      "target": "block:thermal-controlled-temperature-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-convection",
      "source": "term:heat-generation",
      "target": "block:thermal-convection",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-flow-sensor",
      "source": "term:heat-generation",
      "target": "block:thermal-flow-sensor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-heat-source",
      "source": "term:heat-generation",
      "target": "block:thermal-heat-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-insulator",
      "source": "term:heat-generation",
      "target": "block:thermal-insulator",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-radiation",
      "source": "term:heat-generation",
      "target": "block:thermal-radiation",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-reference",
      "source": "term:heat-generation",
      "target": "block:thermal-reference",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-resistance",
      "source": "term:heat-generation",
      "target": "block:thermal-resistance",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-temperature-source",
      "source": "term:heat-generation",
      "target": "block:thermal-temperature-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-variable-resistance",
      "source": "term:heat-generation",
      "target": "block:thermal-variable-resistance",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:u-cooling-plate",
      "source": "term:heat-generation",
      "target": "block:u-cooling-plate",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:battery-ecm-cell",
      "source": "term:heat-generation",
      "target": "block:battery-ecm-cell",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:battery-module",
      "source": "term:heat-generation",
      "target": "block:battery-module",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:battery-module-assembly",
      "source": "term:heat-generation",
      "target": "block:battery-module-assembly",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:battery-pack-assembly",
      "source": "term:heat-generation",
      "target": "block:battery-pack-assembly",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:battery-parallel-group",
      "source": "term:heat-generation",
      "target": "block:battery-parallel-group",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:battery-pem-stack",
      "source": "term:heat-generation",
      "target": "block:battery-pem-stack",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:battery-supercapacitor",
      "source": "term:heat-generation",
      "target": "block:battery-supercapacitor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:battery-tabulated-cell",
      "source": "term:heat-generation",
      "target": "block:battery-tabulated-cell",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:battery-thermal-state-space",
      "source": "term:heat-generation",
      "target": "block:battery-thermal-state-space",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:heat-generation/block:thermal-rate",
      "source": "term:heat-generation",
      "target": "block:thermal-rate",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usedIn/term:heat-generation/workflow:loss-accounting",
      "source": "term:heat-generation",
      "target": "workflow:loss-accounting",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:belongsTo/term:heat-generation/topic:topic-thermal",
      "source": "term:heat-generation",
      "target": "topic:topic-thermal",
      "type": "belongsTo",
      "properties": {
        "sourceFile": "terms.json"
      }
    },
    {
      "id": "edge:relatedTo/term:heat-generation/term:entropy-coefficient",
      "source": "term:heat-generation",
      "target": "term:entropy-coefficient",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:heat-generation/term:internal-resistance",
      "source": "term:heat-generation",
      "target": "term:internal-resistance",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:heat-generation/term:thermal-model",
      "source": "term:heat-generation",
      "target": "term:thermal-model",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:heat-generation/term:thermal-management",
      "source": "term:heat-generation",
      "target": "term:thermal-management",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:heat-generation/term:exothermic",
      "source": "term:heat-generation",
      "target": "term:exothermic",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:mentions/heat-generation/overpotential",
      "source": "term:heat-generation",
      "target": "term:overpotential",
      "type": "mentions",
      "properties": {
        "sourceFile": "terms.json",
        "method": "build_glossary.mention_index + mentions",
        "field": "definition",
        "meaning": "Text mention; not a causal claim"
      }
    },
    {
      "id": "edge:illustratedBy/term:heat-generation/visual:heat",
      "source": "term:heat-generation",
      "target": "visual:heat",
      "type": "illustratedBy",
      "properties": {
        "sourceFile": "visual-pages.json"
      }
    },
    {
      "id": "edge:cites/term:heat-generation/reference:bernardi-energy",
      "source": "term:heat-generation",
      "target": "reference:bernardi-energy",
      "type": "cites",
      "properties": {
        "sourceFile": "wiki-references.json",
        "scope": "direct technical reference"
      }
    }
  ],
  "neighbors": [
    {
      "id": "block:edge-cooling-plate",
      "type": "Block",
      "label": "Edge-cooled plate",
      "properties": {
        "id": "edge-cooling-plate",
        "name": "Edge-cooled plate",
        "kind": "studio",
        "summary": "A plate with four thermal contacts and a defined coolant path. Explore which body connects to each contact and how pressure drives coolant through the plate.",
        "behavior": "Four metal temperature nodes form a fixed 2 × 2 conduction mesh with four thermal contact ports. Coolant follows one two-segment edge path. Metal and coolant have finite heat storage. Pressure difference drives reversible mass and enthalpy transport; hydraulic dissipation enters the coolant energy balance. Each liquid boundary requires an explicit pressure/temperature reservoir.",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal A: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal B: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "h1",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 1 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h2",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 2 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h3",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 3 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h4",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 4 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "massFlow",
            "direction": "output",
            "unit": "kg/s",
            "description": "Total coolant mass flow. Positive means A to B; negative means B to A. Parallel channels contribute to the total."
          },
          {
            "name": "pressureDrop",
            "direction": "output",
            "unit": "Pa",
            "description": "Boundary A pressure minus boundary B pressure. Its sign determines coolant direction."
          },
          {
            "name": "hydraulicPower",
            "direction": "output",
            "unit": "W",
            "description": "Pressure-work dissipation entering the coolant as heat: total mass flow × pressure drop / density."
          },
          {
            "name": "contactHeat",
            "direction": "output",
            "unit": "W",
            "description": "Sum of heat entering the plate through h1 to h4. Positive when the connected bodies deliver heat to the plate."
          },
          {
            "name": "outletTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Coolant temperature leaving the downstream end of the plate, following the actual flow direction. Parallel-channel outlet temperatures are averaged."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Change in metal plus coolant sensible energy relative to their configured initial temperatures."
          }
        ],
        "parameters": [
          {
            "key": "plateCapacityJK",
            "label": "Total plate heat capacity",
            "unit": "J/K",
            "default": 900,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total plate heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantCapacityJK",
            "label": "Total coolant heat capacity",
            "unit": "J/K",
            "default": 420,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total coolant heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "plateConductanceWK",
            "label": "Conductance between metal nodes",
            "unit": "W/K",
            "default": 10,
            "min": 0,
            "max": 1000000,
            "description": "Conductance between metal nodes. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "contactConductanceWK",
            "label": "Thermal contact conductance",
            "unit": "W/K",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Thermal contact conductance. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantConductanceWK",
            "label": "Metal-to-coolant conductance per segment",
            "unit": "W/K per segment",
            "default": 20,
            "min": 0,
            "max": 1000000000,
            "description": "Metal-to-coolant conductance per segment. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "hydraulicResistance",
            "label": "Hydraulic resistance per channel",
            "unit": "Pa s/kg per channel",
            "default": 1000000,
            "min": 0.001,
            "max": 1000000000000000,
            "description": "Hydraulic resistance per channel. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "specificHeatJkgK",
            "label": "Coolant specific heat",
            "unit": "J/(kg K)",
            "default": 4200,
            "min": 1,
            "max": 1000000,
            "description": "Coolant specific heat. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "densityKgM3",
            "label": "Coolant density",
            "unit": "kg/m3",
            "default": 1000,
            "min": 1,
            "max": 100000,
            "description": "Coolant density. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialPlateTemperatureK",
            "label": "Initial plate temperature",
            "unit": "K",
            "default": 310,
            "min": 0,
            "max": 5000,
            "description": "Initial plate temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialCoolantTemperatureK",
            "label": "Initial coolant temperature",
            "unit": "K",
            "default": 300,
            "min": 0,
            "max": 5000,
            "description": "Initial coolant temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          }
        ],
        "equations": [
          "mass flow per channel = (pressureA-pressureB)/hydraulicResistance",
          "contact heat[j] = contactConductance*(contactTemperature[j]-plateTemperature[j])",
          "metal heat capacity per node = plateCapacity/4",
          "hydraulicPower = totalMassFlow*(pressureA-pressureB)/density",
          "coolant heat capacity*dT/dt = metal-to-coolant heat + advective enthalpy + hydraulic heat"
        ],
        "example": {
          "title": "Edge-cooled plate worked example",
          "text": "The bundled model connects four thermal masses initially at 320 K to a 310 K plate, with 300 K coolant reservoirs at 200 kPa and 100 kPa. With channel resistance 10^6 Pa s/kg, the total flow is 0.1 kg/s and hydraulic dissipation is 10 W. After 0.2 s all four loads cool below their initial temperature. The loads cool from stored sensible heat; no continuous heater is attached.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-cooling-edge",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "massFlow",
              "label": "Total coolant mass flow",
              "atS": 0.2,
              "value": 0.1,
              "unit": "kg/s",
              "tolerance": 1e-06
            },
            {
              "port": "hydraulicPower",
              "label": "Hydraulic dissipation",
              "atS": 0.2,
              "value": 10,
              "unit": "W",
              "tolerance": 1e-06
            }
          ],
          "inputs": [
            {
              "port": "a",
              "label": "Inlet boundary pressure",
              "value": 200000,
              "unit": "Pa"
            },
            {
              "port": "b",
              "label": "Outlet boundary pressure",
              "value": 100000,
              "unit": "Pa"
            }
          ]
        },
        "limits": [
          "Fixed 2 × 2 metal mesh and the stated coolant path. Constant properties and single-phase incompressible coolant. No arbitrary liquid junction solver, configurable grid, resolved channel geometry or phase change."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "openstax-heat"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-edge-cooling-plate"
        ],
        "connectionGuide": {
          "kind": "cooling-plate",
          "title": "Trace the cooling connections",
          "summary": "Select a contact to explain its pin. Open a warm body or boundary to follow that connection into its own reference.",
          "paths": [
            [
              1,
              3
            ]
          ],
          "concepts": [
            {
              "id": "coolant",
              "label": "Coolant"
            },
            {
              "id": "thermal-mass",
              "label": "Thermal mass"
            },
            {
              "id": "heat-transfer-modes",
              "label": "Heat transfer"
            },
            {
              "id": "thermal-model",
              "label": "Thermal model"
            }
          ]
        },
        "type": "edge-cooling-plate",
        "implementationId": "edge-cooling-plate",
        "url": "https://lemonergy.com/learn/glossary/blocks/edge-cooling-plate/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/edge-cooling-plate/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-cooling-edge"
          ]
        },
        "studioHelp": {
          "type": "edge-cooling-plate",
          "namespace": "physical",
          "slug": "edge-cooling-plate",
          "canonicalSlug": "edge-cooling-plate",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "edge-cooling-plate",
            "name": "Edge-cooled plate",
            "domain": "thermal",
            "family": "cooling",
            "operation": "Exchanges heat between four plate zones, attached bodies and coolant flowing through the declared channel path.",
            "mechanism": [
              "Thermal contacts",
              "Metal and coolant storage",
              "Coolant transport"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal B",
                "net": null,
                "peers": []
              },
              {
                "id": "h1",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h2",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-right thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h3",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h4",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-right thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "liquid-reservoir",
                "label": "Coolant pressure and temperature boundary"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M50 5V60Q50 75 70 75H130Q150 75 150 60V5"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "contactHeat1",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat1",
                "unit": "W"
              },
              {
                "id": "contactHeat2",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat2",
                "unit": "W"
              },
              {
                "id": "contactHeat3",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat3",
                "unit": "W"
              },
              {
                "id": "contactHeat4",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat4",
                "unit": "W"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              },
              {
                "id": "massFlow",
                "quantity": "mass-rate",
                "declared": true,
                "consumers": [],
                "label": "mass Flow",
                "unit": "kg/s"
              },
              {
                "id": "pressureDrop",
                "quantity": "pressure",
                "declared": true,
                "consumers": [],
                "label": "pressure Drop",
                "unit": "Pa"
              },
              {
                "id": "hydraulicPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "hydraulic Power",
                "unit": "W"
              },
              {
                "id": "contactHeat",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat",
                "unit": "W"
              },
              {
                "id": "outletTemperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "outlet Temperature",
                "unit": "K"
              }
            ],
            "parameters": [
              {
                "id": "plateCapacityJK",
                "default": 900,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 900
              },
              {
                "id": "coolantCapacityJK",
                "default": 420,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 420
              },
              {
                "id": "plateConductanceWK",
                "default": 10,
                "unit": "W/K",
                "min": 0,
                "max": 1000000,
                "value": 10
              },
              {
                "id": "contactConductanceWK",
                "default": 100,
                "unit": "W/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "coolantConductanceWK",
                "default": 20,
                "unit": "W/K per segment",
                "min": 0,
                "max": 1000000000,
                "value": 20
              },
              {
                "id": "hydraulicResistance",
                "default": 1000000,
                "unit": "Pa s/kg per channel",
                "min": 0.001,
                "max": 1000000000000000,
                "value": 1000000
              },
              {
                "id": "specificHeatJkgK",
                "default": 4200,
                "unit": "J/(kg K)",
                "min": 1,
                "max": 1000000,
                "value": 4200
              },
              {
                "id": "densityKgM3",
                "default": 1000,
                "unit": "kg/m3",
                "min": 1,
                "max": 100000,
                "value": 1000
              },
              {
                "id": "initialPlateTemperatureK",
                "default": 310,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 310
              },
              {
                "id": "initialCoolantTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:electrothermal-resistor",
      "type": "Block",
      "label": "Electrothermal resistor",
      "properties": {
        "id": "electrothermal-resistor",
        "name": "Electrothermal resistor",
        "kind": "studio",
        "summary": "Linear temperature coefficient with positive floor; all electrical dissipation enters the thermal port",
        "behavior": "Conserving component solved simultaneously with the connected network. Linear temperature coefficient with positive floor; all electrical dissipation enters the thermal port",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "h",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "referenceResistanceOhm",
            "label": "Reference resistance",
            "unit": "ohm",
            "default": 10,
            "description": "Electrical resistance at the reference temperature.",
            "min": 1e-06,
            "max": 1000000000000
          },
          {
            "key": "referenceTemperatureK",
            "label": "Reference temperature",
            "unit": "K",
            "default": 300,
            "description": "Absolute temperature at which the reference resistance is defined.",
            "min": 0,
            "max": 5000
          },
          {
            "key": "alphaPerK",
            "label": "Temperature coefficient",
            "unit": "1/K",
            "default": 0.004,
            "description": "Fractional resistance change for each kelvin relative to the reference temperature.",
            "min": -1,
            "max": 1
          },
          {
            "key": "minimumResistanceOhm",
            "label": "Minimum resistance",
            "unit": "ohm",
            "default": 1e-06,
            "description": "Positive floor applied to the calculated or commanded electrical resistance.",
            "min": 1e-09,
            "max": 1000000000
          }
        ],
        "equations": [
          "R = max(Rref[1 + α(T − Tref)], Rmin)",
          "Q̇h = V I"
        ],
        "example": {
          "title": "Electrothermal resistor worked example",
          "text": "Editable first-party network. supply: voltageV=12; hot-boundary: differenceK=350; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-electrothermal-resistor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "referenceResistanceOhm",
              "label": "Reference resistance",
              "value": 10,
              "unit": "ohm"
            },
            {
              "port": "referenceTemperatureK",
              "label": "Reference temperature",
              "value": 300,
              "unit": "K"
            },
            {
              "port": "alphaPerK",
              "label": "Temperature coefficient",
              "value": 0.004,
              "unit": "1/K"
            },
            {
              "port": "minimumResistanceOhm",
              "label": "Minimum resistance",
              "value": 1e-06,
              "unit": "ohm"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 1,
              "unit": "A",
              "tolerance": 9.999999999993736e-07
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 12,
              "unit": "V",
              "tolerance": 1.1999999999999997e-05
            },
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 12,
              "unit": "W",
              "tolerance": 1.1999999999140553e-05
            }
          ]
        },
        "limits": [
          "Linear temperature coefficient with positive floor; all electrical dissipation enters the thermal port",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-power",
          "openstax-heat"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-electrothermal-resistor"
        ],
        "type": "electrothermal-resistor",
        "implementationId": "electrothermal-resistor",
        "url": "https://lemonergy.com/learn/glossary/blocks/electrothermal-resistor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/electrothermal-resistor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-electrothermal-resistor"
          ]
        },
        "studioHelp": {
          "type": "electrothermal-resistor",
          "namespace": "physical",
          "slug": "electrothermal-resistor",
          "canonicalSlug": "electrothermal-resistor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "electrothermal-resistor",
            "name": "Electrothermal resistor",
            "domain": "electrical",
            "family": "resistance",
            "operation": "Changes resistance with temperature and transfers all modeled electrical dissipation into its thermal contact.",
            "mechanism": [
              "Electrical current",
              "Temperature-dependent resistance",
              "Heat at h"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Heat delivery and temperature contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "resistor",
                "label": "Resistor"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "resistance",
                "quantity": "resistance",
                "declared": true,
                "consumers": [],
                "label": "resistance",
                "unit": "Ω"
              },
              {
                "id": "limited",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "limited",
                "unit": "fraction"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "referenceResistanceOhm",
                "default": 10,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000000000,
                "value": 10
              },
              {
                "id": "referenceTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              },
              {
                "id": "alphaPerK",
                "default": 0.004,
                "unit": "1/K",
                "min": -1,
                "max": 1,
                "value": 0.004
              },
              {
                "id": "minimumResistanceOhm",
                "default": 1e-06,
                "unit": "ohm",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1e-06
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:initial-temperature-constraint",
      "type": "Block",
      "label": "Insulated branch with initial temperature target",
      "properties": {
        "id": "initial-temperature-constraint",
        "name": "Insulated branch with initial temperature target",
        "kind": "studio",
        "summary": "Zero heat transfer; initializes directly attached unspecified thermal storage temperatures and verifies the consistent initial difference",
        "behavior": "Conserving component solved simultaneously with the connected network. Zero heat transfer; initializes directly attached unspecified thermal storage temperatures and verifies the consistent initial difference",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "initialDifferenceK",
            "label": "Initial temperature difference",
            "unit": "K difference",
            "default": 0,
            "description": "Requested initial temperature at a minus temperature at b.",
            "min": -5000,
            "max": 5000
          }
        ],
        "equations": [
          "Q̇ = 0",
          "Ta(0) − Tb(0) = requested initial difference, subject to consistent storage initialization"
        ],
        "example": {
          "title": "Insulated branch with initial temperature target worked example",
          "text": "Editable first-party network. constraint: initialDifferenceK=20. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-initial-temperature-constraint",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "initialDifferenceK",
              "label": "Initial temperature difference",
              "value": 20,
              "unit": "K difference"
            }
          ],
          "checks": [
            {
              "port": "constraint/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 0,
              "unit": "W",
              "tolerance": 1e-10
            },
            {
              "port": "constraint/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "constraint/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "Zero heat transfer; initializes directly attached unspecified thermal storage temperatures and verifies the consistent initial difference",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-initial-temperature-constraint"
        ],
        "type": "initial-temperature-constraint",
        "implementationId": "initial-temperature-constraint",
        "url": "https://lemonergy.com/learn/glossary/blocks/initial-temperature-constraint/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/initial-temperature-constraint/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-initial-temperature-constraint"
          ]
        },
        "studioHelp": {
          "type": "initial-temperature-constraint",
          "namespace": "physical",
          "slug": "initial-temperature-constraint",
          "canonicalSlug": "initial-temperature-constraint",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "initial-temperature-constraint",
            "name": "Insulated branch with initial temperature target",
            "domain": "thermal",
            "family": "initial",
            "operation": "Passes no heat and applies an initial temperature-difference target to directly attached storage. It does not hold that difference during the run.",
            "mechanism": [
              "Initial temperature target",
              "Initial consistency",
              "Zero heat transfer"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-source",
                "label": "Temperature difference source"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M100 20V40L118 50M10 40H70M130 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "initialDifferenceK",
                "default": 0,
                "unit": "K difference",
                "min": -5000,
                "max": 5000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:liquid-reservoir",
      "type": "Block",
      "label": "Coolant pressure and temperature boundary",
      "properties": {
        "id": "liquid-reservoir",
        "name": "Coolant pressure and temperature boundary",
        "kind": "studio",
        "summary": "Fixes pressure and inflowing coolant temperature at one liquid terminal. In the plate example, inlet and outlet are two instances of this same boundary.",
        "behavior": "This ideal boundary supplies or receives coolant while holding its configured pressure and inflow temperature. A pressure difference across the cooling plate determines the flow. When flow reverses, the receiving boundary becomes the supplying boundary. Outgoing coolant carries the plate outlet temperature; the receiving boundary does not clamp that outlet temperature.",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Thermal-liquid terminal connecting this boundary to a cooling plate. The boundary fixes pressure and the temperature used when coolant flows out of the boundary. Mass and enthalpy reaction flows balance the connected plate."
          },
          {
            "name": "pressure",
            "direction": "output",
            "unit": "Pa",
            "description": "The configured absolute pressure at this boundary."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "The configured inflow temperature, not a measurement of returning coolant."
          },
          {
            "name": "massFlow",
            "direction": "output",
            "unit": "kg/s",
            "description": "Net mass flow into this boundary. Negative when it supplies the plate; positive when it receives returning coolant."
          },
          {
            "name": "enthalpyFlow",
            "direction": "output",
            "unit": "W",
            "description": "Net advected enthalpy flow into this boundary. Returning coolant uses its plate outlet temperature."
          }
        ],
        "parameters": [
          {
            "key": "pressurePa",
            "label": "Boundary pressure",
            "unit": "Pa",
            "default": 101325,
            "min": 1,
            "max": 1000000000.0,
            "description": "Absolute pressure held at this liquid node. Set a pressure difference between the two boundaries to drive coolant flow."
          },
          {
            "key": "temperatureK",
            "label": "Coolant supply temperature",
            "unit": "K",
            "default": 300,
            "min": 0,
            "max": 5000,
            "description": "Temperature of coolant supplied by this boundary. It is used as the inlet condition only when flow leaves this boundary."
          }
        ],
        "equations": [
          "pressure = pressurePa",
          "inflow temperature = temperatureK",
          "boundary massFlow + mass flow leaving the boundary = 0"
        ],
        "example": {
          "title": "Two boundaries in the U-channel plate example",
          "text": "The existing U-channel example sets inlet to 200000 Pa and outlet to 100000 Pa, both at 300 K. The plate carries 0.1 kg/s from inlet to outlet. These checks describe the boundary within the released plate network, not a separate standalone validation.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-cooling-u",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "inlet/pressure",
              "label": "Supply boundary pressure",
              "atS": 0,
              "value": 200000,
              "unit": "Pa",
              "tolerance": 1e-06
            },
            {
              "port": "inlet/temperature",
              "label": "Supply coolant temperature",
              "atS": 0,
              "value": 300,
              "unit": "K",
              "tolerance": 1e-06
            },
            {
              "port": "inlet/massFlow",
              "label": "Mass supplied by inlet boundary",
              "atS": 0,
              "value": -0.1,
              "unit": "kg/s",
              "tolerance": 1e-09
            }
          ]
        },
        "limits": [
          "Ideal fixed pressure and inflow temperature, not a finite tank, pump or radiator model. Each coolant node requires exactly one explicit boundary in the current bounded plate solver.",
          "Boundary checks reuse the existing released U-channel network; they are synthetic model checks, not measured equipment data."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "openstax-heat"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-edge-cooling-plate",
          "native-parallel-cooling-plate",
          "native-u-cooling-plate"
        ],
        "connectionGuide": {
          "kind": "boundary",
          "title": "What inlet and outlet actually mean",
          "summary": "Both are coolant boundary blocks. Their names describe the example role; their pressures determine the actual direction.",
          "concepts": [
            {
              "id": "coolant",
              "label": "Coolant"
            },
            {
              "id": "thermal-mass",
              "label": "Thermal mass"
            },
            {
              "id": "heat-transfer-modes",
              "label": "Heat transfer"
            },
            {
              "id": "thermal-model",
              "label": "Thermal model"
            }
          ]
        },
        "type": "liquid-reservoir",
        "implementationId": "liquid-reservoir",
        "url": "https://lemonergy.com/learn/glossary/blocks/liquid-reservoir/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/liquid-reservoir/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-cooling-u"
          ]
        },
        "studioHelp": {
          "type": "liquid-reservoir",
          "namespace": "physical",
          "slug": "liquid-reservoir",
          "canonicalSlug": "liquid-reservoir",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "liquid-reservoir",
            "name": "Coolant pressure and temperature boundary",
            "domain": "thermal-liquid",
            "family": "fluid-boundary",
            "operation": "Sets an ideal coolant pressure and temperature boundary and supplies or receives mass and energy.",
            "mechanism": [
              "Pressure and temperature",
              "Coolant boundary",
              "Mass and energy reaction"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant pressure and temperature boundary",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "u-cooling-plate",
                "label": "U-channel plate"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M190 40H140M140 10V70M65 10H140M65 70H140M75 25H125M75 55H125"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "massFlow",
                "quantity": "mass-rate",
                "declared": true,
                "consumers": [],
                "label": "mass Flow",
                "unit": "kg/s"
              },
              {
                "id": "enthalpyFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "enthalpy Flow",
                "unit": "W"
              },
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "pressure",
                "quantity": "pressure",
                "declared": true,
                "consumers": [],
                "label": "pressure",
                "unit": "Pa"
              }
            ],
            "parameters": [
              {
                "id": "pressurePa",
                "default": 101325,
                "unit": "Pa",
                "min": 1,
                "max": 1000000000,
                "value": 101325
              },
              {
                "id": "temperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:parallel-cooling-plate",
      "type": "Block",
      "label": "Parallel-channel plate",
      "properties": {
        "id": "parallel-cooling-plate",
        "name": "Parallel-channel plate",
        "kind": "studio",
        "summary": "A plate with four thermal contacts and a defined coolant path. Explore which body connects to each contact and how pressure drives coolant through the plate.",
        "behavior": "Four metal temperature nodes form a fixed 2 × 2 conduction mesh with four thermal contact ports. Coolant follows two parallel two-segment paths. Metal and coolant have finite heat storage. Pressure difference drives reversible mass and enthalpy transport; hydraulic dissipation enters the coolant energy balance. Each liquid boundary requires an explicit pressure/temperature reservoir.",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal A: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal B: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "h1",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 1 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h2",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 2 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h3",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 3 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h4",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 4 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "massFlow",
            "direction": "output",
            "unit": "kg/s",
            "description": "Total coolant mass flow. Positive means A to B; negative means B to A. Parallel channels contribute to the total."
          },
          {
            "name": "pressureDrop",
            "direction": "output",
            "unit": "Pa",
            "description": "Boundary A pressure minus boundary B pressure. Its sign determines coolant direction."
          },
          {
            "name": "hydraulicPower",
            "direction": "output",
            "unit": "W",
            "description": "Pressure-work dissipation entering the coolant as heat: total mass flow × pressure drop / density."
          },
          {
            "name": "contactHeat",
            "direction": "output",
            "unit": "W",
            "description": "Sum of heat entering the plate through h1 to h4. Positive when the connected bodies deliver heat to the plate."
          },
          {
            "name": "outletTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Coolant temperature leaving the downstream end of the plate, following the actual flow direction. Parallel-channel outlet temperatures are averaged."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Change in metal plus coolant sensible energy relative to their configured initial temperatures."
          }
        ],
        "parameters": [
          {
            "key": "plateCapacityJK",
            "label": "Total plate heat capacity",
            "unit": "J/K",
            "default": 900,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total plate heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantCapacityJK",
            "label": "Total coolant heat capacity",
            "unit": "J/K",
            "default": 420,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total coolant heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "plateConductanceWK",
            "label": "Conductance between metal nodes",
            "unit": "W/K",
            "default": 10,
            "min": 0,
            "max": 1000000,
            "description": "Conductance between metal nodes. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "contactConductanceWK",
            "label": "Thermal contact conductance",
            "unit": "W/K",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Thermal contact conductance. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantConductanceWK",
            "label": "Metal-to-coolant conductance per segment",
            "unit": "W/K per segment",
            "default": 20,
            "min": 0,
            "max": 1000000000,
            "description": "Metal-to-coolant conductance per segment. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "hydraulicResistance",
            "label": "Hydraulic resistance per channel",
            "unit": "Pa s/kg per channel",
            "default": 1000000,
            "min": 0.001,
            "max": 1000000000000000,
            "description": "Hydraulic resistance per channel. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "specificHeatJkgK",
            "label": "Coolant specific heat",
            "unit": "J/(kg K)",
            "default": 4200,
            "min": 1,
            "max": 1000000,
            "description": "Coolant specific heat. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "densityKgM3",
            "label": "Coolant density",
            "unit": "kg/m3",
            "default": 1000,
            "min": 1,
            "max": 100000,
            "description": "Coolant density. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialPlateTemperatureK",
            "label": "Initial plate temperature",
            "unit": "K",
            "default": 310,
            "min": 0,
            "max": 5000,
            "description": "Initial plate temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialCoolantTemperatureK",
            "label": "Initial coolant temperature",
            "unit": "K",
            "default": 300,
            "min": 0,
            "max": 5000,
            "description": "Initial coolant temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          }
        ],
        "equations": [
          "mass flow per channel = (pressureA-pressureB)/hydraulicResistance",
          "contact heat[j] = contactConductance*(contactTemperature[j]-plateTemperature[j])",
          "metal heat capacity per node = plateCapacity/4",
          "hydraulicPower = totalMassFlow*(pressureA-pressureB)/density",
          "coolant heat capacity*dT/dt = metal-to-coolant heat + advective enthalpy + hydraulic heat"
        ],
        "example": {
          "title": "Parallel-channel plate worked example",
          "text": "The bundled model connects four thermal masses initially at 320 K to a 310 K plate, with 300 K coolant reservoirs at 200 kPa and 100 kPa. With channel resistance 10^6 Pa s/kg, the total flow is 0.2 kg/s and hydraulic dissipation is 20 W. After 0.2 s all four loads cool below their initial temperature. The loads cool from stored sensible heat; no continuous heater is attached.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-cooling-parallel",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "massFlow",
              "label": "Total coolant mass flow",
              "atS": 0.2,
              "value": 0.2,
              "unit": "kg/s",
              "tolerance": 1e-06
            },
            {
              "port": "hydraulicPower",
              "label": "Hydraulic dissipation",
              "atS": 0.2,
              "value": 20,
              "unit": "W",
              "tolerance": 1e-06
            }
          ],
          "inputs": [
            {
              "port": "a",
              "label": "Inlet boundary pressure",
              "value": 200000,
              "unit": "Pa"
            },
            {
              "port": "b",
              "label": "Outlet boundary pressure",
              "value": 100000,
              "unit": "Pa"
            }
          ]
        },
        "limits": [
          "Fixed 2 × 2 metal mesh and the stated coolant path. Constant properties and single-phase incompressible coolant. No arbitrary liquid junction solver, configurable grid, resolved channel geometry or phase change."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "openstax-heat"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-parallel-cooling-plate"
        ],
        "connectionGuide": {
          "kind": "cooling-plate",
          "title": "Trace the cooling connections",
          "summary": "Select a contact to explain its pin. Open a warm body or boundary to follow that connection into its own reference.",
          "paths": [
            [
              1,
              3
            ],
            [
              2,
              4
            ]
          ],
          "concepts": [
            {
              "id": "coolant",
              "label": "Coolant"
            },
            {
              "id": "thermal-mass",
              "label": "Thermal mass"
            },
            {
              "id": "heat-transfer-modes",
              "label": "Heat transfer"
            },
            {
              "id": "thermal-model",
              "label": "Thermal model"
            }
          ]
        },
        "type": "parallel-cooling-plate",
        "implementationId": "parallel-cooling-plate",
        "url": "https://lemonergy.com/learn/glossary/blocks/parallel-cooling-plate/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/parallel-cooling-plate/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-cooling-parallel"
          ]
        },
        "studioHelp": {
          "type": "parallel-cooling-plate",
          "namespace": "physical",
          "slug": "parallel-cooling-plate",
          "canonicalSlug": "parallel-cooling-plate",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "parallel-cooling-plate",
            "name": "Parallel-channel plate",
            "domain": "thermal",
            "family": "cooling",
            "operation": "Exchanges heat between four plate zones, attached bodies and coolant flowing through the declared channel path.",
            "mechanism": [
              "Thermal contacts",
              "Metal and coolant storage",
              "Coolant transport"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal B",
                "net": null,
                "peers": []
              },
              {
                "id": "h1",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h2",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-right thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h3",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h4",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-right thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "liquid-reservoir",
                "label": "Coolant pressure and temperature boundary"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M50 5V60Q50 75 70 75H130Q150 75 150 60V5"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "contactHeat1",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat1",
                "unit": "W"
              },
              {
                "id": "contactHeat2",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat2",
                "unit": "W"
              },
              {
                "id": "contactHeat3",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat3",
                "unit": "W"
              },
              {
                "id": "contactHeat4",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat4",
                "unit": "W"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              },
              {
                "id": "massFlow",
                "quantity": "mass-rate",
                "declared": true,
                "consumers": [],
                "label": "mass Flow",
                "unit": "kg/s"
              },
              {
                "id": "pressureDrop",
                "quantity": "pressure",
                "declared": true,
                "consumers": [],
                "label": "pressure Drop",
                "unit": "Pa"
              },
              {
                "id": "hydraulicPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "hydraulic Power",
                "unit": "W"
              },
              {
                "id": "contactHeat",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat",
                "unit": "W"
              },
              {
                "id": "outletTemperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "outlet Temperature",
                "unit": "K"
              }
            ],
            "parameters": [
              {
                "id": "plateCapacityJK",
                "default": 900,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 900
              },
              {
                "id": "coolantCapacityJK",
                "default": 420,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 420
              },
              {
                "id": "plateConductanceWK",
                "default": 10,
                "unit": "W/K",
                "min": 0,
                "max": 1000000,
                "value": 10
              },
              {
                "id": "contactConductanceWK",
                "default": 100,
                "unit": "W/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "coolantConductanceWK",
                "default": 20,
                "unit": "W/K per segment",
                "min": 0,
                "max": 1000000000,
                "value": 20
              },
              {
                "id": "hydraulicResistance",
                "default": 1000000,
                "unit": "Pa s/kg per channel",
                "min": 0.001,
                "max": 1000000000000000,
                "value": 1000000
              },
              {
                "id": "specificHeatJkgK",
                "default": 4200,
                "unit": "J/(kg K)",
                "min": 1,
                "max": 1000000,
                "value": 4200
              },
              {
                "id": "densityKgM3",
                "default": 1000,
                "unit": "kg/m3",
                "min": 1,
                "max": 100000,
                "value": 1000
              },
              {
                "id": "initialPlateTemperatureK",
                "default": 310,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 310
              },
              {
                "id": "initialCoolantTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-conductor",
      "type": "Block",
      "label": "Thermal conductor",
      "properties": {
        "id": "thermal-conductor",
        "name": "Thermal conductor",
        "kind": "studio",
        "summary": "One-dimensional lumped Fourier conductance",
        "behavior": "Conserving component solved simultaneously with the connected network. One-dimensional lumped Fourier conductance",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "conductivityWmK",
            "label": "Thermal conductivity",
            "unit": "W/(m K)",
            "default": 200,
            "description": "Material conductivity used by the one-dimensional conduction law.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "areaM2",
            "label": "Exchange area",
            "unit": "m2",
            "default": 0.001,
            "description": "Area used by the declared heat-transfer or parallel-plate field equation.",
            "min": 1e-12,
            "max": 1000000
          },
          {
            "key": "lengthM",
            "label": "Conduction length",
            "unit": "m",
            "default": 0.01,
            "description": "Distance through the conducting material.",
            "min": 1e-12,
            "max": 1000000
          }
        ],
        "equations": [
          "Q̇a→b = k A (Ta − Tb)/length"
        ],
        "example": {
          "title": "Thermal conductor worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-conductor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "conductivityWmK",
              "label": "Thermal conductivity",
              "value": 200,
              "unit": "W/(m K)"
            },
            {
              "port": "areaM2",
              "label": "Exchange area",
              "value": 0.001,
              "unit": "m2"
            },
            {
              "port": "lengthM",
              "label": "Conduction length",
              "value": 0.01,
              "unit": "m"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 400,
              "unit": "W",
              "tolerance": 0.00039999999999999996
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "One-dimensional lumped Fourier conductance",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-conductor"
        ],
        "type": "thermal-conductor",
        "implementationId": "thermal-conductor",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-conductor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-conductor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-conductor"
          ]
        },
        "studioHelp": {
          "type": "thermal-conductor",
          "namespace": "physical",
          "slug": "thermal-conductor",
          "canonicalSlug": "thermal-conductor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-conductor",
            "name": "Thermal conductor",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Transfers heat by a lumped conductance set by conductivity, area and length.",
            "mechanism": [
              "Temperature difference",
              "Material conductance",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "conductivityWmK",
                "default": 200,
                "unit": "W/(m K)",
                "min": 0,
                "max": 1000000,
                "value": 200
              },
              {
                "id": "areaM2",
                "default": 0.001,
                "unit": "m2",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.001
              },
              {
                "id": "lengthM",
                "default": 0.01,
                "unit": "m",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.01
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-controlled-heat-source",
      "type": "Block",
      "label": "Controlled heat flow source",
      "properties": {
        "id": "thermal-controlled-heat-source",
        "name": "Controlled heat flow source",
        "kind": "studio",
        "summary": "Ideal commanded heat transfer from a to b",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal commanded heat transfer from a to b",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "heatFlowW",
            "label": "Heat flow",
            "unit": "W",
            "default": 100,
            "description": "Heat transferred from terminal a to terminal b.",
            "min": -1000000000000,
            "max": 1000000000000
          }
        ],
        "equations": [
          "Q̇a→b = commanded heat flow"
        ],
        "example": {
          "title": "Controlled heat flow source worked example",
          "text": "Editable first-party network. heater: heatFlowW=100; command: before=100; command: after=200; command: atS=0.5. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-controlled-heat-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "heatFlowW",
              "label": "Heat flow",
              "value": 100,
              "unit": "W"
            }
          ],
          "checks": [
            {
              "port": "heater/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 200,
              "unit": "W",
              "tolerance": 0.00019999999999999998
            },
            {
              "port": "heater/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "heater/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": -300.15,
              "unit": "K",
              "tolerance": 0.0003001500000000037
            }
          ]
        },
        "limits": [
          "Ideal commanded heat transfer from a to b",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-controlled-heat-source"
        ],
        "type": "thermal-controlled-heat-source",
        "implementationId": "thermal-controlled-heat-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-controlled-heat-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-controlled-heat-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-controlled-heat-source"
          ]
        },
        "studioHelp": {
          "type": "thermal-controlled-heat-source",
          "namespace": "physical",
          "slug": "thermal-controlled-heat-source",
          "canonicalSlug": "thermal-controlled-heat-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-controlled-heat-source",
            "name": "Controlled heat flow source",
            "domain": "thermal",
            "family": "heat-source",
            "operation": "Transfers the configured or commanded heat flow from a to b; negative values reverse that transfer.",
            "mechanism": [
              "Heat-flow setting",
              "Energy transfer a → b"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H70M130 40H190M85 55C70 40 105 40 90 20M110 55C95 40 130 40 115 20"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Heat-flow setting",
                "quantity": "heat",
                "unit": "W",
                "active": true,
                "summary": "Heat-flow setting is a directed heat input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "heatFlowW",
                "default": 100,
                "unit": "W",
                "min": -1000000000000,
                "max": 1000000000000,
                "value": 100
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-controlled-temperature-source",
      "type": "Block",
      "label": "Controlled temperature difference source",
      "properties": {
        "id": "thermal-controlled-temperature-source",
        "name": "Controlled temperature difference source",
        "kind": "studio",
        "summary": "Ideal commanded Tb-Ta with solved reaction heat flow",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal commanded Tb-Ta with solved reaction heat flow",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "branchHeatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded branchHeatFlow measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "differenceK",
            "label": "Temperature difference",
            "unit": "K difference",
            "default": 300,
            "description": "Temperature at terminal b minus temperature at terminal a.",
            "min": -5000,
            "max": 5000
          }
        ],
        "equations": [
          "Tb − Ta = commanded temperature difference"
        ],
        "example": {
          "title": "Controlled temperature difference source worked example",
          "text": "Editable first-party network. target: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-controlled-temperature-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "differenceK",
              "label": "Temperature difference",
              "value": 320,
              "unit": "K difference"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "target/branchHeatFlow",
              "label": "branchHeatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            }
          ]
        },
        "limits": [
          "Ideal commanded Tb-Ta with solved reaction heat flow",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-controlled-temperature-source"
        ],
        "type": "thermal-controlled-temperature-source",
        "implementationId": "thermal-controlled-temperature-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-controlled-temperature-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-controlled-temperature-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-controlled-temperature-source"
          ]
        },
        "studioHelp": {
          "type": "thermal-controlled-temperature-source",
          "namespace": "physical",
          "slug": "thermal-controlled-temperature-source",
          "canonicalSlug": "thermal-controlled-temperature-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-controlled-temperature-source",
            "name": "Controlled temperature difference source",
            "domain": "thermal",
            "family": "temperature-source",
            "operation": "Imposes temperature at b minus temperature at a; the network solves the reaction heat flow needed to enforce it.",
            "mechanism": [
              "Temperature difference",
              "Imposed Tb − Ta",
              "Solved heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 53,
                  "r": 12
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M93 43V14A7 7 0 0 1 107 14V43M100 48V19M10 40H65M135 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Temperature difference",
                "quantity": "temperature-difference",
                "unit": "K difference",
                "active": true,
                "summary": "Temperature difference is a directed temperature-difference input to this component, expressed in K difference. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "differenceK",
                "default": 300,
                "unit": "K difference",
                "min": -5000,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-convection",
      "type": "Block",
      "label": "Thermal convection",
      "properties": {
        "id": "thermal-convection",
        "name": "Thermal convection",
        "kind": "studio",
        "summary": "Prescribed lumped film coefficient; no resolved fluid dynamics",
        "behavior": "Conserving component solved simultaneously with the connected network. Prescribed lumped film coefficient; no resolved fluid dynamics",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "coefficientWm2K",
            "label": "Convection coefficient",
            "unit": "W/(m2 K)",
            "default": 10,
            "description": "Prescribed heat-transfer coefficient multiplying area and temperature difference.",
            "min": 0,
            "max": 1000000000
          },
          {
            "key": "areaM2",
            "label": "Exchange area",
            "unit": "m2",
            "default": 0.2,
            "description": "Area used by the declared heat-transfer or parallel-plate field equation.",
            "min": 1e-12,
            "max": 1000000
          }
        ],
        "equations": [
          "Q̇a→b = h A (Ta − Tb)"
        ],
        "example": {
          "title": "Thermal convection worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-convection",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "coefficientWm2K",
              "label": "Convection coefficient",
              "value": 10,
              "unit": "W/(m2 K)"
            },
            {
              "port": "areaM2",
              "label": "Exchange area",
              "value": 0.2,
              "unit": "m2"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 40,
              "unit": "W",
              "tolerance": 3.9999999999999996e-05
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "Prescribed lumped film coefficient; no resolved fluid dynamics",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-convection"
        ],
        "type": "thermal-convection",
        "implementationId": "thermal-convection",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-convection/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-convection/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-convection"
          ]
        },
        "studioHelp": {
          "type": "thermal-convection",
          "namespace": "physical",
          "slug": "thermal-convection",
          "canonicalSlug": "thermal-convection",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-convection",
            "name": "Thermal convection",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Transfers heat using a prescribed film coefficient and area; it does not solve the surrounding fluid.",
            "mechanism": [
              "Temperature difference",
              "Film coefficient × area",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "coefficientWm2K",
                "default": 10,
                "unit": "W/(m2 K)",
                "min": 0,
                "max": 1000000000,
                "value": 10
              },
              {
                "id": "areaM2",
                "default": 0.2,
                "unit": "m2",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.2
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-flow-sensor",
      "type": "Block",
      "label": "Heat flow sensor",
      "properties": {
        "id": "thermal-flow-sensor",
        "name": "Heat flow sensor",
        "kind": "studio",
        "summary": "Ideal inline sensor with zero temperature drop; positive flow a to b",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal inline sensor with zero temperature drop; positive flow a to b",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "branchHeatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded branchHeatFlow measurement from the conserving simulation."
          }
        ],
        "parameters": [],
        "equations": [
          "Ta = Tb",
          "Q̇a→b is solved by the connected heat balance"
        ],
        "example": {
          "title": "Heat flow sensor worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-flow-sensor",
          "label": "Open Studio example",
          "inputs": [],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/branchHeatFlow",
              "label": "branchHeatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            }
          ]
        },
        "limits": [
          "Ideal inline sensor with zero temperature drop; positive flow a to b",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-flow-sensor"
        ],
        "type": "thermal-flow-sensor",
        "implementationId": "thermal-flow-sensor",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-flow-sensor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-flow-sensor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-flow-sensor"
          ]
        },
        "studioHelp": {
          "type": "thermal-flow-sensor",
          "namespace": "physical",
          "slug": "thermal-flow-sensor",
          "canonicalSlug": "thermal-flow-sensor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-flow-sensor",
            "name": "Heat flow sensor",
            "domain": "thermal",
            "family": "sensor",
            "operation": "Measures series heat flow with zero temperature difference across its terminals. Positive measured flow is a to b.",
            "mechanism": [
              "Series thermal branch",
              "Zero temperature drop",
              "Heat-flow signal"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              },
              {
                "type": "thermal-conductor",
                "label": "Thermal conductor"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H70M130 40H190M100 40L116 22M80 52A24 24 0 0 1 120 52"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:thermal-heat-source",
      "type": "Block",
      "label": "Heat flow source",
      "properties": {
        "id": "thermal-heat-source",
        "name": "Heat flow source",
        "kind": "studio",
        "summary": "Ideal configured heat transfer from a to b",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal configured heat transfer from a to b",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "heatFlowW",
            "label": "Heat flow",
            "unit": "W",
            "default": 100,
            "description": "Heat transferred from terminal a to terminal b.",
            "min": -1000000000000,
            "max": 1000000000000
          }
        ],
        "equations": [
          "Q̇a→b = configured heat flow"
        ],
        "example": {
          "title": "Heat flow source worked example",
          "text": "Editable first-party network. heater: heatFlowW=100. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-heat-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "heatFlowW",
              "label": "Heat flow",
              "value": 100,
              "unit": "W"
            }
          ],
          "checks": [
            {
              "port": "heater/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 100,
              "unit": "W",
              "tolerance": 9.999999999999999e-05
            },
            {
              "port": "heater/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "heater/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": -300.1,
              "unit": "K",
              "tolerance": 0.0003001000000000015
            }
          ]
        },
        "limits": [
          "Ideal configured heat transfer from a to b",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-heat-source"
        ],
        "type": "thermal-heat-source",
        "implementationId": "thermal-heat-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-heat-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-heat-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-heat-source"
          ]
        },
        "studioHelp": {
          "type": "thermal-heat-source",
          "namespace": "physical",
          "slug": "thermal-heat-source",
          "canonicalSlug": "thermal-heat-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-heat-source",
            "name": "Heat flow source",
            "domain": "thermal",
            "family": "heat-source",
            "operation": "Transfers the configured or commanded heat flow from a to b; negative values reverse that transfer.",
            "mechanism": [
              "Heat-flow setting",
              "Energy transfer a → b"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H70M130 40H190M85 55C70 40 105 40 90 20M110 55C95 40 130 40 115 20"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "heatFlowW",
                "default": 100,
                "unit": "W",
                "min": -1000000000000,
                "max": 1000000000000,
                "value": 100
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-insulator",
      "type": "Block",
      "label": "Insulated thermal port",
      "properties": {
        "id": "thermal-insulator",
        "name": "Insulated thermal port",
        "kind": "studio",
        "summary": "Zero heat-flow termination with unconstrained temperature",
        "behavior": "Conserving component solved simultaneously with the connected network. Zero heat-flow termination with unconstrained temperature",
        "ports": [
          {
            "name": "h",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          }
        ],
        "parameters": [],
        "equations": [
          "Q̇ = 0"
        ],
        "example": {
          "title": "Insulated thermal port worked example",
          "text": "Editable first-party network. heater: heatFlowW=100. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-insulator",
          "label": "Open Studio example",
          "inputs": [],
          "checks": [
            {
              "port": "insulator/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 0,
              "unit": "W",
              "tolerance": 1e-10
            },
            {
              "port": "insulator/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 300.1,
              "unit": "K",
              "tolerance": 0.0003001000000000015
            }
          ]
        },
        "limits": [
          "Zero heat-flow termination with unconstrained temperature",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-insulator"
        ],
        "type": "thermal-insulator",
        "implementationId": "thermal-insulator",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-insulator/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-insulator/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-insulator"
          ]
        },
        "studioHelp": {
          "type": "thermal-insulator",
          "namespace": "physical",
          "slug": "thermal-insulator",
          "canonicalSlug": "thermal-insulator",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-insulator",
            "name": "Insulated thermal port",
            "domain": "thermal",
            "family": "open",
            "operation": "Terminates a thermal pin with zero heat flow without fixing its temperature.",
            "mechanism": [
              "Thermal contact",
              "No heat transfer"
            ],
            "ports": [
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Insulated thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H80M120 40H190"
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 85,
                  "cy": 40,
                  "r": 5
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 115,
                  "cy": 40,
                  "r": 5
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:thermal-radiation",
      "type": "Block",
      "label": "Thermal radiation",
      "properties": {
        "id": "thermal-radiation",
        "name": "Thermal radiation",
        "kind": "studio",
        "summary": "Effective two-body Stefan-Boltzmann exchange at absolute temperatures",
        "behavior": "Conserving component solved simultaneously with the connected network. Effective two-body Stefan-Boltzmann exchange at absolute temperatures",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "emissivity",
            "label": "Effective emissivity",
            "unit": "fraction",
            "default": 0.8,
            "description": "Effective surface emissivity used in radiative heat exchange.",
            "min": 0,
            "max": 1
          },
          {
            "key": "viewFactor",
            "label": "Effective view factor",
            "unit": "fraction",
            "default": 1,
            "description": "Fraction of radiative exchange represented between the two modeled surfaces.",
            "min": 0,
            "max": 1
          },
          {
            "key": "areaM2",
            "label": "Exchange area",
            "unit": "m2",
            "default": 0.02,
            "description": "Area used by the declared heat-transfer or parallel-plate field equation.",
            "min": 1e-12,
            "max": 1000000
          }
        ],
        "equations": [
          "Q̇a→b = ε F σ A (Ta⁴ − Tb⁴)"
        ],
        "example": {
          "title": "Thermal radiation worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-radiation",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "emissivity",
              "label": "Effective emissivity",
              "value": 0.8,
              "unit": "fraction"
            },
            {
              "port": "viewFactor",
              "label": "Effective view factor",
              "value": 1,
              "unit": "fraction"
            },
            {
              "port": "areaM2",
              "label": "Exchange area",
              "value": 0.02,
              "unit": "m2"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 2.1645044,
              "unit": "W",
              "tolerance": 2.1645043958220922e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "Effective two-body Stefan-Boltzmann exchange at absolute temperatures",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-radiation"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-radiation"
        ],
        "type": "thermal-radiation",
        "implementationId": "thermal-radiation",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-radiation/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-radiation/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-radiation"
          ]
        },
        "studioHelp": {
          "type": "thermal-radiation",
          "namespace": "physical",
          "slug": "thermal-radiation",
          "canonicalSlug": "thermal-radiation",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-radiation",
            "name": "Thermal radiation",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Exchanges heat according to absolute temperatures to the fourth power, emissivity, area and view factor.",
            "mechanism": [
              "Absolute temperatures",
              "Radiative exchange",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "emissivity",
                "default": 0.8,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.8
              },
              {
                "id": "viewFactor",
                "default": 1,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 1
              },
              {
                "id": "areaM2",
                "default": 0.02,
                "unit": "m2",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.02
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-reference",
      "type": "Block",
      "label": "Thermal reference",
      "properties": {
        "id": "thermal-reference",
        "name": "Thermal reference",
        "kind": "studio",
        "summary": "Absolute-zero temperature datum; not an ambient-temperature boundary",
        "behavior": "Conserving component solved simultaneously with the connected network. Absolute-zero temperature datum; not an ambient-temperature boundary",
        "ports": [
          {
            "name": "h",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "reactionHeat",
            "direction": "output",
            "unit": "W",
            "description": "Recorded reactionHeat measurement from the conserving simulation."
          }
        ],
        "parameters": [],
        "equations": [
          "T = 0 K"
        ],
        "example": {
          "title": "Thermal reference worked example",
          "text": "Editable first-party network. heater: heatFlowW=100. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-reference",
          "label": "Open Studio example",
          "inputs": [],
          "checks": [
            {
              "port": "reference/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "reference/reactionHeat",
              "label": "reactionHeat",
              "atS": 1,
              "value": 100,
              "unit": "W",
              "tolerance": 9.999999999999999e-05
            }
          ]
        },
        "limits": [
          "Absolute-zero temperature datum; not an ambient-temperature boundary",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-reference"
        ],
        "type": "thermal-reference",
        "implementationId": "thermal-reference",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-reference/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-reference/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-reference"
          ]
        },
        "studioHelp": {
          "type": "thermal-reference",
          "namespace": "physical",
          "slug": "thermal-reference",
          "canonicalSlug": "thermal-reference",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-reference",
            "name": "Thermal reference",
            "domain": "thermal",
            "family": "reference",
            "operation": "Provides an absolute-zero temperature datum; an ambient boundary requires a temperature source.",
            "mechanism": [
              "Absolute temperature datum",
              "T = 0 K"
            ],
            "ports": [
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Absolute-zero thermal reference",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-temperature-source",
                "label": "Temperature difference source"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M100 5V35M65 35H135M75 47H125M88 59H112"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "reactionHeat",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "reaction Heat",
                "unit": "W"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:thermal-resistance",
      "type": "Block",
      "label": "Thermal resistance",
      "properties": {
        "id": "thermal-resistance",
        "name": "Thermal resistance",
        "kind": "studio",
        "summary": "Finite linear two-port thermal resistance",
        "behavior": "Conserving component solved simultaneously with the connected network. Finite linear two-port thermal resistance",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "resistanceKW",
            "label": "Thermal resistance",
            "unit": "K/W",
            "default": 2,
            "description": "Temperature difference required per unit heat flow.",
            "min": 1e-09,
            "max": 1000000000000
          }
        ],
        "equations": [
          "Q̇a→b = (Ta − Tb)/Rthermal"
        ],
        "example": {
          "title": "Thermal resistance worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-resistance",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "resistanceKW",
              "label": "Thermal resistance",
              "value": 2,
              "unit": "K/W"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "Finite linear two-port thermal resistance",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-resistance"
        ],
        "type": "thermal-resistance",
        "implementationId": "thermal-resistance",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-resistance/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-resistance/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-resistance"
          ]
        },
        "studioHelp": {
          "type": "thermal-resistance",
          "namespace": "physical",
          "slug": "thermal-resistance",
          "canonicalSlug": "thermal-resistance",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-resistance",
            "name": "Thermal resistance",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Transfers heat in proportion to temperature difference divided by thermal resistance.",
            "mechanism": [
              "Temperature difference",
              "Thermal resistance",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "resistanceKW",
                "default": 2,
                "unit": "K/W",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 2
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-temperature-source",
      "type": "Block",
      "label": "Temperature difference source",
      "properties": {
        "id": "thermal-temperature-source",
        "name": "Temperature difference source",
        "kind": "studio",
        "summary": "Ideal constraint Tb-Ta; reaction heat flow is solved, not prescribed",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal constraint Tb-Ta; reaction heat flow is solved, not prescribed",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "branchHeatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded branchHeatFlow measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "differenceK",
            "label": "Temperature difference",
            "unit": "K difference",
            "default": 300,
            "description": "Temperature at terminal b minus temperature at terminal a.",
            "min": -5000,
            "max": 5000
          }
        ],
        "equations": [
          "Tb − Ta = configured temperature difference"
        ],
        "example": {
          "title": "Temperature difference source worked example",
          "text": "Editable first-party network. target: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-temperature-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "differenceK",
              "label": "Temperature difference",
              "value": 320,
              "unit": "K difference"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "target/branchHeatFlow",
              "label": "branchHeatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            }
          ]
        },
        "limits": [
          "Ideal constraint Tb-Ta; reaction heat flow is solved, not prescribed",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-temperature-source"
        ],
        "type": "thermal-temperature-source",
        "implementationId": "thermal-temperature-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-temperature-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-temperature-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-temperature-source"
          ]
        },
        "studioHelp": {
          "type": "thermal-temperature-source",
          "namespace": "physical",
          "slug": "thermal-temperature-source",
          "canonicalSlug": "thermal-temperature-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-temperature-source",
            "name": "Temperature difference source",
            "domain": "thermal",
            "family": "temperature-source",
            "operation": "Imposes temperature at b minus temperature at a; the network solves the reaction heat flow needed to enforce it.",
            "mechanism": [
              "Temperature difference",
              "Imposed Tb − Ta",
              "Solved heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 53,
                  "r": 12
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M93 43V14A7 7 0 0 1 107 14V43M100 48V19M10 40H65M135 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "differenceK",
                "default": 300,
                "unit": "K difference",
                "min": -5000,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-variable-resistance",
      "type": "Block",
      "label": "Controlled thermal resistance",
      "properties": {
        "id": "thermal-variable-resistance",
        "name": "Controlled thermal resistance",
        "kind": "studio",
        "summary": "Live thermal resistance with declared positive floor and limited-command diagnostic",
        "behavior": "Conserving component solved simultaneously with the connected network. Live thermal resistance with declared positive floor and limited-command diagnostic",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "limited",
            "direction": "output",
            "unit": "fraction",
            "description": "Recorded limited measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "resistanceKW",
            "label": "Thermal resistance",
            "unit": "K/W",
            "default": 2,
            "description": "Temperature difference required per unit heat flow.",
            "min": 1e-09,
            "max": 1000000000000
          },
          {
            "key": "minimumResistanceKW",
            "label": "Minimum thermal resistance",
            "unit": "K/W",
            "default": 1e-06,
            "description": "Positive floor applied to the commanded thermal resistance.",
            "min": 1e-12,
            "max": 1000000000
          }
        ],
        "equations": [
          "R = max(Rcommand, Rmin)",
          "Q̇a→b = (Ta − Tb)/R"
        ],
        "example": {
          "title": "Controlled thermal resistance worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-variable-resistance",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "resistanceKW",
              "label": "Thermal resistance",
              "value": 2,
              "unit": "K/W"
            },
            {
              "port": "minimumResistanceKW",
              "label": "Minimum thermal resistance",
              "value": 1e-06,
              "unit": "K/W"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/limited",
              "label": "limited",
              "atS": 1,
              "value": 0,
              "unit": "fraction",
              "tolerance": 1e-10
            }
          ]
        },
        "limits": [
          "Live thermal resistance with declared positive floor and limited-command diagnostic",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-thermal-variable-resistance"
        ],
        "type": "thermal-variable-resistance",
        "implementationId": "thermal-variable-resistance",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-variable-resistance/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-variable-resistance/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-variable-resistance"
          ]
        },
        "studioHelp": {
          "type": "thermal-variable-resistance",
          "namespace": "physical",
          "slug": "thermal-variable-resistance",
          "canonicalSlug": "thermal-variable-resistance",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-variable-resistance",
            "name": "Controlled thermal resistance",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Transfers heat through a commanded thermal resistance with a positive lower bound.",
            "mechanism": [
              "Resistance command",
              "Temperature difference",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "resistance",
                "label": "Resistance command",
                "quantity": "thermal-resistance",
                "unit": "K/W",
                "active": true,
                "summary": "Resistance command is a directed thermal-resistance input to this component, expressed in K/W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              },
              {
                "id": "resistance",
                "quantity": "thermal-resistance",
                "declared": true,
                "consumers": [],
                "label": "resistance",
                "unit": "K/W"
              },
              {
                "id": "limited",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "limited",
                "unit": "fraction"
              }
            ],
            "parameters": [
              {
                "id": "resistanceKW",
                "default": 2,
                "unit": "K/W",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 2
              },
              {
                "id": "minimumResistanceKW",
                "default": 1e-06,
                "unit": "K/W",
                "min": 1e-12,
                "max": 1000000000,
                "value": 1e-06
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:u-cooling-plate",
      "type": "Block",
      "label": "U-channel plate",
      "properties": {
        "id": "u-cooling-plate",
        "name": "U-channel plate",
        "kind": "studio",
        "summary": "A plate with four thermal contacts and a defined coolant path. Explore which body connects to each contact and how pressure drives coolant through the plate.",
        "behavior": "Four metal temperature nodes form a fixed 2 × 2 conduction mesh with four thermal contact ports. Coolant follows one four-segment U path. Metal and coolant have finite heat storage. Pressure difference drives reversible mass and enthalpy transport; hydraulic dissipation enters the coolant energy balance. Each liquid boundary requires an explicit pressure/temperature reservoir.",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal A: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal B: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "h1",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 1 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h2",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 2 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h3",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 3 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h4",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 4 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "massFlow",
            "direction": "output",
            "unit": "kg/s",
            "description": "Total coolant mass flow. Positive means A to B; negative means B to A. Parallel channels contribute to the total."
          },
          {
            "name": "pressureDrop",
            "direction": "output",
            "unit": "Pa",
            "description": "Boundary A pressure minus boundary B pressure. Its sign determines coolant direction."
          },
          {
            "name": "hydraulicPower",
            "direction": "output",
            "unit": "W",
            "description": "Pressure-work dissipation entering the coolant as heat: total mass flow × pressure drop / density."
          },
          {
            "name": "contactHeat",
            "direction": "output",
            "unit": "W",
            "description": "Sum of heat entering the plate through h1 to h4. Positive when the connected bodies deliver heat to the plate."
          },
          {
            "name": "outletTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Coolant temperature leaving the downstream end of the plate, following the actual flow direction. Parallel-channel outlet temperatures are averaged."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Change in metal plus coolant sensible energy relative to their configured initial temperatures."
          }
        ],
        "parameters": [
          {
            "key": "plateCapacityJK",
            "label": "Total plate heat capacity",
            "unit": "J/K",
            "default": 900,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total plate heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantCapacityJK",
            "label": "Total coolant heat capacity",
            "unit": "J/K",
            "default": 420,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total coolant heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "plateConductanceWK",
            "label": "Conductance between metal nodes",
            "unit": "W/K",
            "default": 10,
            "min": 0,
            "max": 1000000,
            "description": "Conductance between metal nodes. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "contactConductanceWK",
            "label": "Thermal contact conductance",
            "unit": "W/K",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Thermal contact conductance. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantConductanceWK",
            "label": "Metal-to-coolant conductance per segment",
            "unit": "W/K per segment",
            "default": 20,
            "min": 0,
            "max": 1000000000,
            "description": "Metal-to-coolant conductance per segment. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "hydraulicResistance",
            "label": "Hydraulic resistance per channel",
            "unit": "Pa s/kg per channel",
            "default": 1000000,
            "min": 0.001,
            "max": 1000000000000000,
            "description": "Hydraulic resistance per channel. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "specificHeatJkgK",
            "label": "Coolant specific heat",
            "unit": "J/(kg K)",
            "default": 4200,
            "min": 1,
            "max": 1000000,
            "description": "Coolant specific heat. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "densityKgM3",
            "label": "Coolant density",
            "unit": "kg/m3",
            "default": 1000,
            "min": 1,
            "max": 100000,
            "description": "Coolant density. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialPlateTemperatureK",
            "label": "Initial plate temperature",
            "unit": "K",
            "default": 310,
            "min": 0,
            "max": 5000,
            "description": "Initial plate temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialCoolantTemperatureK",
            "label": "Initial coolant temperature",
            "unit": "K",
            "default": 300,
            "min": 0,
            "max": 5000,
            "description": "Initial coolant temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          }
        ],
        "equations": [
          "mass flow per channel = (pressureA-pressureB)/hydraulicResistance",
          "contact heat[j] = contactConductance*(contactTemperature[j]-plateTemperature[j])",
          "metal heat capacity per node = plateCapacity/4",
          "hydraulicPower = totalMassFlow*(pressureA-pressureB)/density",
          "coolant heat capacity*dT/dt = metal-to-coolant heat + advective enthalpy + hydraulic heat"
        ],
        "example": {
          "title": "U-channel plate worked example",
          "text": "The bundled model connects four thermal masses initially at 320 K to a 310 K plate, with 300 K coolant reservoirs at 200 kPa and 100 kPa. With channel resistance 10^6 Pa s/kg, the total flow is 0.1 kg/s and hydraulic dissipation is 10 W. After 0.2 s all four loads cool below their initial temperature. The loads cool from stored sensible heat; no continuous heater is attached.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-cooling-u",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "massFlow",
              "label": "Total coolant mass flow",
              "atS": 0.2,
              "value": 0.1,
              "unit": "kg/s",
              "tolerance": 1e-06
            },
            {
              "port": "hydraulicPower",
              "label": "Hydraulic dissipation",
              "atS": 0.2,
              "value": 10,
              "unit": "W",
              "tolerance": 1e-06
            }
          ],
          "inputs": [
            {
              "port": "a",
              "label": "Inlet boundary pressure",
              "value": 200000,
              "unit": "Pa"
            },
            {
              "port": "b",
              "label": "Outlet boundary pressure",
              "value": 100000,
              "unit": "Pa"
            }
          ]
        },
        "limits": [
          "Fixed 2 × 2 metal mesh and the stated coolant path. Constant properties and single-phase incompressible coolant. No arbitrary liquid junction solver, configurable grid, resolved channel geometry or phase change."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "openstax-heat"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-u-cooling-plate"
        ],
        "connectionGuide": {
          "kind": "cooling-plate",
          "title": "Trace the cooling connections",
          "summary": "Select a contact to explain its pin. Open a warm body or boundary to follow that connection into its own reference.",
          "paths": [
            [
              1,
              3,
              4,
              2
            ]
          ],
          "concepts": [
            {
              "id": "coolant",
              "label": "Coolant"
            },
            {
              "id": "thermal-mass",
              "label": "Thermal mass"
            },
            {
              "id": "heat-transfer-modes",
              "label": "Heat transfer"
            },
            {
              "id": "thermal-model",
              "label": "Thermal model"
            }
          ]
        },
        "type": "u-cooling-plate",
        "implementationId": "u-cooling-plate",
        "url": "https://lemonergy.com/learn/glossary/blocks/u-cooling-plate/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/u-cooling-plate/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-cooling-u"
          ]
        },
        "studioHelp": {
          "type": "u-cooling-plate",
          "namespace": "physical",
          "slug": "u-cooling-plate",
          "canonicalSlug": "u-cooling-plate",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "u-cooling-plate",
            "name": "U-channel plate",
            "domain": "thermal",
            "family": "cooling",
            "operation": "Exchanges heat between four plate zones, attached bodies and coolant flowing through the declared channel path.",
            "mechanism": [
              "Thermal contacts",
              "Metal and coolant storage",
              "Coolant transport"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal B",
                "net": null,
                "peers": []
              },
              {
                "id": "h1",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h2",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-right thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h3",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h4",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-right thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "liquid-reservoir",
                "label": "Coolant pressure and temperature boundary"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M50 5V60Q50 75 70 75H130Q150 75 150 60V5"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "contactHeat1",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat1",
                "unit": "W"
              },
              {
                "id": "contactHeat2",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat2",
                "unit": "W"
              },
              {
                "id": "contactHeat3",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat3",
                "unit": "W"
              },
              {
                "id": "contactHeat4",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat4",
                "unit": "W"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              },
              {
                "id": "massFlow",
                "quantity": "mass-rate",
                "declared": true,
                "consumers": [],
                "label": "mass Flow",
                "unit": "kg/s"
              },
              {
                "id": "pressureDrop",
                "quantity": "pressure",
                "declared": true,
                "consumers": [],
                "label": "pressure Drop",
                "unit": "Pa"
              },
              {
                "id": "hydraulicPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "hydraulic Power",
                "unit": "W"
              },
              {
                "id": "contactHeat",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat",
                "unit": "W"
              },
              {
                "id": "outletTemperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "outlet Temperature",
                "unit": "K"
              }
            ],
            "parameters": [
              {
                "id": "plateCapacityJK",
                "default": 900,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 900
              },
              {
                "id": "coolantCapacityJK",
                "default": 420,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 420
              },
              {
                "id": "plateConductanceWK",
                "default": 10,
                "unit": "W/K",
                "min": 0,
                "max": 1000000,
                "value": 10
              },
              {
                "id": "contactConductanceWK",
                "default": 100,
                "unit": "W/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "coolantConductanceWK",
                "default": 20,
                "unit": "W/K per segment",
                "min": 0,
                "max": 1000000000,
                "value": 20
              },
              {
                "id": "hydraulicResistance",
                "default": 1000000,
                "unit": "Pa s/kg per channel",
                "min": 0.001,
                "max": 1000000000000000,
                "value": 1000000
              },
              {
                "id": "specificHeatJkgK",
                "default": 4200,
                "unit": "J/(kg K)",
                "min": 1,
                "max": 1000000,
                "value": 4200
              },
              {
                "id": "densityKgM3",
                "default": 1000,
                "unit": "kg/m3",
                "min": 1,
                "max": 100000,
                "value": 1000
              },
              {
                "id": "initialPlateTemperatureK",
                "default": 310,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 310
              },
              {
                "id": "initialCoolantTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:battery-ecm-cell",
      "type": "Block",
      "label": "Electrothermal ECM cell",
      "properties": {
        "id": "battery-ecm-cell",
        "name": "Electrothermal ECM cell",
        "kind": "studio",
        "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
        "behavior": "Accepts signed discharge current, ambient temperature and external heat. Charge balance drives SOC; an OCV table sets equilibrium voltage. The ECM adds two RC polarization states. Both variants include an ohmic loss and a lumped temperature state.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed cell current (discharge positive); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Ambient temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External heat flow; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "soc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Cell temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Irreversible heat; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "ocv",
            "direction": "output",
            "unit": "V",
            "description": "Open-circuit voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "inRange",
            "direction": "output",
            "unit": "true / false",
            "description": "SOC in characterized range; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "capacityAh",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 5,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "r1Ohm",
            "label": "First polarization resistance (Ω)",
            "unit": "Ω",
            "default": 0.02,
            "description": "First polarization resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "c1F",
            "label": "First polarization capacitance (F)",
            "unit": "F",
            "default": 500,
            "description": "First polarization capacitance (F). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "r2Ohm",
            "label": "Second polarization resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Second polarization resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "c2F",
            "label": "Second polarization capacitance (F)",
            "unit": "F",
            "default": 2000,
            "description": "Second polarization capacitance (F). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "heatCapacityJPerK",
            "label": "Heat capacity (J/K)",
            "unit": "J/K",
            "default": 100,
            "description": "Heat capacity (J/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "conductanceWPerK",
            "label": "Ambient thermal conductance (W/K)",
            "unit": "W/K",
            "default": 1,
            "description": "Ambient thermal conductance (W/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialSoc",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.8,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialTemperatureK",
            "label": "Initial cell temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Initial cell temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "dSOC/dt = -I / (3600 * capacityAh)",
          "dVk/dt = (I - Vk/Rk) / Ck  [ECM branches only]",
          "Vterminal = OCV(SOC) - I*R0 - sum(Vk)",
          "Cthermal*dT/dt = I^2*R0 + sum(Vk^2/Rk) + Qexternal - G*(T-Tambient)"
        ],
        "example": {
          "title": "Electrothermal ECM cell worked example",
          "text": "Use the defaults below with Signed cell current (discharge positive) = 2 A, Ambient temperature = 298.15 K, External heat flow = 0 W. At 0 s, Terminal voltage is 3.68 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-ecm-cell",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.68,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "soc",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            },
            {
              "port": "voltage",
              "atS": 10,
              "value": 3.646845790452711,
              "tolerance": 1e-06,
              "label": "Terminal voltage",
              "unit": "V"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed cell current (discharge positive)",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Ambient temperature",
              "value": 298.15,
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External heat flow",
              "value": 0,
              "unit": "W"
            }
          ]
        },
        "limits": [
          "The external interface is causal current-to-voltage, without conserving terminals. Parameters are constant except the one-dimensional SOC-to-OCV table. No hysteresis, aging, reversible entropic heat or automatic parameter identification.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-ecm-cell"
        ],
        "exampleTraces": [
          {
            "id": "battery-ecm-cell",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-ecm-cell.json?v=4bb6ace37339",
            "title": "Electrothermal ECM cell recorded example",
            "exampleId": "block-battery-ecm-cell",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-ecm-cell",
        "implementationId": "battery-ecm-cell",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-ecm-cell/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-ecm-cell/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-ecm-cell"
          ]
        },
        "studioHelp": {
          "type": "battery-ecm-cell",
          "namespace": "signal",
          "slug": "signal-block-battery-ecm-cell",
          "canonicalSlug": "battery-ecm-cell",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Electrothermal ECM cell",
            "label": "Electrothermal ECM cell",
            "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
            "details": [
              "Block type: battery-ecm-cell.",
              "3 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "I → SOC, RC → V, T",
              "label": "Equivalent-circuit cell",
              "caption": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed cell current (discharge positive)",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Ambient temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External heat flow",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "loss",
                "label": "Irreversible heat",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ocv",
                "label": "Open-circuit voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "inRange",
                "label": "SOC in characterized range",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacityAh\":5,\"resistanceOhm\":0.01,\"r1Ohm\":0.02,\"c1F\":500,\"r2Ohm\":0.01,\"c2F\":2000,\"heatCapacityJPerK\":100,\"conductanceWPerK\":1,\"initialSoc\":0.8,\"initialTemperatureK\":298.15,\"ocvTable\":[[0,3.7],[1,3.7]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/",
            "related": [
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-module",
      "type": "Block",
      "label": "Battery module",
      "properties": {
        "id": "battery-module",
        "name": "Battery module",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 10 channels at the default configuration.",
            "shape": [
              10
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 10 channels at the default configuration.",
            "shape": [
              10
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "seriesGroups",
            "label": "Series groups in each module",
            "unit": "1",
            "default": 3,
            "description": "Series groups in each module. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Battery module worked example",
          "text": "Use the defaults below with Signed pack current = 6 A, Cell ambient temperatures = [298.15, 298.15, 298.15, 298.15, 298.15, 298.15] K, External cell heat inputs = [0, 0, 0, 0, 0, 0] W. At 0 s, Pack terminal voltage is 10.92 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-module",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 10.92,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                3,
                3,
                3,
                3,
                3,
                3
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 6,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0,
                0,
                0,
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-module"
        ],
        "exampleTraces": [
          {
            "id": "battery-module",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-module.json?v=36868c05ddb3",
            "title": "Battery module recorded example",
            "exampleId": "block-battery-module",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 39,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-module",
        "implementationId": "battery-module",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-module/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-module/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-module"
          ]
        },
        "studioHelp": {
          "type": "battery-module",
          "namespace": "signal",
          "slug": "signal-block-battery-module",
          "canonicalSlug": "battery-module",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery module",
            "label": "Battery module",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-module.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Battery module",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  10
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 10",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  10
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 10",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-module/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-module-assembly",
      "type": "Block",
      "label": "Module assembly",
      "properties": {
        "id": "battery-module-assembly",
        "name": "Module assembly",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 21 channels at the default configuration.",
            "shape": [
              21
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 21 channels at the default configuration.",
            "shape": [
              21
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "seriesGroups",
            "label": "Series groups in each module",
            "unit": "1",
            "default": 3,
            "description": "Series groups in each module. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "modules",
            "label": "Modules in each assembly",
            "unit": "1",
            "default": 2,
            "description": "Modules in each assembly. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "moduleConnection",
            "label": "Module connection (0 series, 1 parallel)",
            "unit": "0 series, 1 parallel",
            "default": 0,
            "description": "0 connects modules in series; 1 connects them in parallel."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Module assembly worked example",
          "text": "Use the defaults below with Signed pack current = 6 A, Cell ambient temperatures = 12 channels each 298.15 K, External cell heat inputs = 12 channels each 0 W. At 0 s, Pack terminal voltage is 21.84 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-module-assembly",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 21.84,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 6,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-module-assembly"
        ],
        "exampleTraces": [
          {
            "id": "battery-module-assembly",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-module-assembly.json?v=fdf80bf25db5",
            "title": "Module assembly recorded example",
            "exampleId": "block-battery-module-assembly",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 91,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-module-assembly",
        "implementationId": "battery-module-assembly",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-module-assembly/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-module-assembly/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-module-assembly"
          ]
        },
        "studioHelp": {
          "type": "battery-module-assembly",
          "namespace": "signal",
          "slug": "signal-block-battery-module-assembly",
          "canonicalSlug": "battery-module-assembly",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Module assembly",
            "label": "Module assembly",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-module-assembly.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Module assembly",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  21
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 21",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  21
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 21",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"modules\":2,\"moduleConnection\":0,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-module-assembly/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-pack-assembly",
      "type": "Block",
      "label": "Battery pack assembly",
      "properties": {
        "id": "battery-pack-assembly",
        "name": "Battery pack assembly",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 43 channels at the default configuration.",
            "shape": [
              43
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 43 channels at the default configuration.",
            "shape": [
              43
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "seriesGroups",
            "label": "Series groups in each module",
            "unit": "1",
            "default": 3,
            "description": "Series groups in each module. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "modules",
            "label": "Modules in each assembly",
            "unit": "1",
            "default": 2,
            "description": "Modules in each assembly. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "moduleConnection",
            "label": "Module connection (0 series, 1 parallel)",
            "unit": "0 series, 1 parallel",
            "default": 0,
            "description": "0 connects modules in series; 1 connects them in parallel."
          },
          {
            "key": "seriesAssemblies",
            "label": "Series assemblies in each string",
            "unit": "1",
            "default": 1,
            "description": "Series assemblies in each string. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "parallelStrings",
            "label": "Parallel pack strings",
            "unit": "1",
            "default": 2,
            "description": "Parallel pack strings. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Battery pack assembly worked example",
          "text": "Use the defaults below with Signed pack current = 12 A, Cell ambient temperatures = 24 channels each 298.15 K, External cell heat inputs = 24 channels each 0 W. At 0 s, Pack terminal voltage is 21.84 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-pack-assembly",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 21.84,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 12,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-pack-assembly"
        ],
        "exampleTraces": [
          {
            "id": "battery-pack-assembly",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-pack-assembly.json?v=8c005753d771",
            "title": "Battery pack assembly recorded example",
            "exampleId": "block-battery-pack-assembly",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 195,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-pack-assembly",
        "implementationId": "battery-pack-assembly",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-pack-assembly/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-pack-assembly/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-pack-assembly"
          ]
        },
        "studioHelp": {
          "type": "battery-pack-assembly",
          "namespace": "signal",
          "slug": "signal-block-battery-pack-assembly",
          "canonicalSlug": "battery-pack-assembly",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery pack assembly",
            "label": "Battery pack assembly",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-pack-assembly.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Battery pack assembly",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  43
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 43",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  43
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 43",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"modules\":2,\"moduleConnection\":0,\"seriesAssemblies\":1,\"parallelStrings\":2,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pack-assembly/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-parallel-group",
      "type": "Block",
      "label": "Parallel cell group",
      "properties": {
        "id": "battery-parallel-group",
        "name": "Parallel cell group",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Parallel cell group worked example",
          "text": "Use the defaults below with Signed pack current = 4 A, Cell ambient temperatures = [298.15, 298.15] K, External cell heat inputs = [0, 0] W. At 0 s, Pack terminal voltage is 3.66 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-parallel-group",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.66,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                2,
                2
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.798888888888889,
                0.798888888888889
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 4,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-parallel-group"
        ],
        "exampleTraces": [
          {
            "id": "battery-parallel-group",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-parallel-group.json?v=d377de1011ff",
            "title": "Parallel cell group recorded example",
            "exampleId": "block-battery-parallel-group",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 5,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          },
          {
            "id": "battery-parallel-mismatch",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-parallel-mismatch.json?v=9c00f108fa95",
            "title": "Unequal parallel cells",
            "exampleId": "block-battery-parallel-mismatch",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 5,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          },
          {
            "id": "battery-cell-thermal-link",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-cell-thermal-link.json?v=a5718ede583b",
            "title": "Heat exchange between cells",
            "exampleId": "block-battery-cell-thermal-link",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 5,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-parallel-group",
        "implementationId": "battery-parallel-group",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-parallel-group/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-parallel-group/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-cell-thermal-link",
            "https://design.lemonergy.com/cosim.html?example=block-battery-parallel-group",
            "https://design.lemonergy.com/cosim.html?example=block-battery-parallel-mismatch"
          ]
        },
        "studioHelp": {
          "type": "battery-parallel-group",
          "namespace": "signal",
          "slug": "signal-block-battery-parallel-group",
          "canonicalSlug": "battery-parallel-group",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Parallel cell group",
            "label": "Parallel cell group",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-parallel-group.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Parallel cell group",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-parallel-group/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-pem-stack",
      "type": "Block",
      "label": "Reduced PEM fuel-cell stack",
      "properties": {
        "id": "battery-pem-stack",
        "name": "Reduced PEM fuel-cell stack",
        "kind": "studio",
        "summary": "Prescribed gas/temperature Nernst potential with activation, ohmic and limiting-current losses plus an identified polarization lag. No humidity, gas-flow or thermal network states.",
        "behavior": "Computes a reduced PEM stack polarization from prescribed hydrogen/oxygen pressures and temperature. Nernst potential, activation, ohmic and limiting-current losses determine cell voltage. An identified first-order polarization lag adds dynamics. Faraday balance gives reactant consumption.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Stack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Cell temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "hydrogenPressure",
            "direction": "input",
            "unit": "Pa",
            "description": "Hydrogen partial pressure; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "pressure"
          },
          {
            "name": "oxygenPressure",
            "direction": "input",
            "unit": "Pa",
            "description": "Oxygen partial pressure; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "pressure"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Stack voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Electrical output power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "heat",
            "direction": "output",
            "unit": "W",
            "description": "Thermoneutral power difference; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "hydrogen",
            "direction": "output",
            "unit": "1",
            "description": "Hydrogen consumption (mol/s); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "oxygen",
            "direction": "output",
            "unit": "1",
            "description": "Oxygen consumption (mol/s); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "reversible",
            "direction": "output",
            "unit": "V",
            "description": "Per-cell reversible voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "polarization",
            "direction": "output",
            "unit": "V",
            "description": "Per-cell polarization state; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "activationTarget",
            "direction": "output",
            "unit": "V",
            "description": "Steady activation loss; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "concentration",
            "direction": "output",
            "unit": "V",
            "description": "Concentration loss; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          }
        ],
        "parameters": [
          {
            "key": "seriesCells",
            "label": "Number of series cells",
            "unit": "1",
            "default": 5,
            "description": "Number of series cells. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "reversibleV",
            "label": "Reference reversible cell voltage (V)",
            "unit": "V",
            "default": 1.229,
            "description": "Reference reversible cell voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "temperatureSlopeVPerK",
            "label": "Reversible-voltage temperature slope (V/K)",
            "unit": "V/K",
            "default": -0.00085,
            "description": "Reversible-voltage temperature slope (V/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "referenceTemperatureK",
            "label": "Reference temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Reference temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "referencePressurePa",
            "label": "Reference pressure (Pa)",
            "unit": "Pa",
            "default": 100000,
            "description": "Reference pressure (Pa). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "waterActivity",
            "label": "Liquid-water activity",
            "unit": "1",
            "default": 1,
            "description": "Liquid-water activity. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Per-cell ohmic resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Per-cell ohmic resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "exchangeCurrentA",
            "label": "Effective exchange current (A)",
            "unit": "A",
            "default": 1,
            "description": "Effective exchange current (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "limitingCurrentA",
            "label": "Limiting current (A)",
            "unit": "A",
            "default": 20,
            "description": "Limiting current (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "transferCoefficient",
            "label": "Effective transfer coefficient",
            "unit": "1",
            "default": 0.5,
            "description": "Effective transfer coefficient. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "timeConstantS",
            "label": "Polarization time constant (s)",
            "unit": "s",
            "default": 1,
            "description": "Polarization time constant (s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialPolarizationV",
            "label": "Initial polarization loss (V)",
            "unit": "V",
            "default": 0,
            "description": "Initial polarization loss (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "thermoneutralV",
            "label": "Thermoneutral cell voltage (V)",
            "unit": "V",
            "default": 1.48,
            "description": "Thermoneutral cell voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "Vstack = cells * (E_Nernst - eta_activation - I*R - eta_concentration)",
          "tau*deta_activation/dt = eta_steady - eta_activation",
          "hydrogen mol/s = cells*I/(2*F)",
          "oxygen mol/s = cells*I/(4*F)"
        ],
        "example": {
          "title": "Reduced PEM fuel-cell stack worked example",
          "text": "Use the defaults below with Stack current = 2 A, Cell temperature = 298.15 K, Hydrogen partial pressure = 100000 Pa, Oxygen partial pressure = 100000 Pa. At 0 s, Stack voltage is 6.038232542 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-pem-stack",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 6.03823254153795,
              "tolerance": 1e-08,
              "label": "Stack voltage",
              "unit": "V"
            },
            {
              "port": "hydrogen",
              "atS": 0,
              "value": 5.1821348283088646e-05,
              "tolerance": 1e-08,
              "label": "Hydrogen consumption (mol/s)",
              "unit": "1"
            },
            {
              "port": "oxygen",
              "atS": 0,
              "value": 2.5910674141544323e-05,
              "tolerance": 1e-08,
              "label": "Oxygen consumption (mol/s)",
              "unit": "1"
            },
            {
              "port": "voltage",
              "atS": 10,
              "value": 5.811795216042423,
              "tolerance": 1e-06,
              "label": "Stack voltage",
              "unit": "V"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Stack current",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "temperature",
              "label": "Cell temperature",
              "value": 298.15,
              "unit": "K"
            },
            {
              "port": "hydrogenPressure",
              "label": "Hydrogen partial pressure",
              "value": 100000,
              "unit": "Pa"
            },
            {
              "port": "oxygenPressure",
              "label": "Oxygen partial pressure",
              "value": 100000,
              "unit": "Pa"
            }
          ]
        },
        "limits": [
          "Positive gas pressures and temperature are required; current is nonnegative and below the limiting current. No hydration, gas-channel flow, internal thermal or conserving network states. Literature supplies background, not a claim to reproduce a full published model.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "netl-fuel-cell-handbook",
          "haddad-pem"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-pem-stack"
        ],
        "exampleTraces": [
          {
            "id": "battery-pem-stack",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-pem-stack.json?v=0a7e3822b2f0",
            "title": "Reduced PEM fuel-cell stack recorded example",
            "exampleId": "block-battery-pem-stack",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 9,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-pem-stack",
        "implementationId": "battery-pem-stack",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-pem-stack/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-pem-stack/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-pem-stack"
          ]
        },
        "studioHelp": {
          "type": "battery-pem-stack",
          "namespace": "signal",
          "slug": "signal-block-battery-pem-stack",
          "canonicalSlug": "battery-pem-stack",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Reduced PEM fuel-cell stack",
            "label": "Reduced PEM fuel-cell stack",
            "summary": "Prescribed gas/temperature Nernst potential with activation, ohmic and limiting-current losses plus an identified polarization lag. No humidity, gas-flow or thermal network states.",
            "details": [
              "Block type: battery-pem-stack.",
              "4 declared inputs and 9 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Reduced PEM fuel-cell stack",
              "caption": "Prescribed gas/temperature Nernst potential with activation, ohmic and limiting-current losses plus an identified polarization lag. No humidity, gas-flow or thermal network states."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Stack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "hydrogenPressure",
                "label": "Hydrogen partial pressure",
                "quantity": "pressure",
                "shape": [],
                "elementType": "real",
                "unit": "Pa",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Pressure",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "oxygenPressure",
                "label": "Oxygen partial pressure",
                "quantity": "pressure",
                "shape": [],
                "elementType": "real",
                "unit": "Pa",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Pressure",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Stack voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "power",
                "label": "Electrical output power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "heat",
                "label": "Thermoneutral power difference",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "hydrogen",
                "label": "Hydrogen consumption (mol/s)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "oxygen",
                "label": "Oxygen consumption (mol/s)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "reversible",
                "label": "Per-cell reversible voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "polarization",
                "label": "Per-cell polarization state",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "activationTarget",
                "label": "Steady activation loss",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "concentration",
                "label": "Concentration loss",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"seriesCells\":5,\"reversibleV\":1.229,\"temperatureSlopeVPerK\":-0.00085,\"referenceTemperatureK\":298.15,\"referencePressurePa\":100000,\"waterActivity\":1,\"resistanceOhm\":0.01,\"exchangeCurrentA\":1,\"limitingCurrentA\":20,\"transferCoefficient\":0.5,\"timeConstantS\":1,\"initialPolarizationV\":0,\"thermoneutralV\":1.48}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pem-stack/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-supercapacitor",
      "type": "Block",
      "label": "Supercapacitor cell",
      "properties": {
        "id": "battery-supercapacitor",
        "name": "Supercapacitor cell",
        "kind": "studio",
        "summary": "Causal capacitor state with series loss, leakage and stored energy.",
        "behavior": "Integrates the internal capacitor voltage from discharge current and leakage. A series resistance produces terminal voltage drop and heat. Stored energy uses the internal capacitor voltage.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed discharge current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "internalVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Capacitor voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "energy",
            "direction": "output",
            "unit": "J",
            "description": "Stored energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Dissipated heat; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          }
        ],
        "parameters": [
          {
            "key": "capacitanceF",
            "label": "Capacitance (F)",
            "unit": "F",
            "default": 100,
            "description": "Capacitance (F). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "leakageSiemens",
            "label": "Leakage conductance (S)",
            "unit": "S",
            "default": 0,
            "description": "Leakage conductance (S). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVoltageV",
            "label": "Initial capacitor voltage (V)",
            "unit": "V",
            "default": 2.5,
            "description": "Initial capacitor voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "C*dVcap/dt = -I - Gleak*Vcap",
          "Vterminal = Vcap - I*Rseries",
          "E = 0.5*C*Vcap^2",
          "Ploss = I^2*Rseries + Gleak*Vcap^2"
        ],
        "example": {
          "title": "Supercapacitor cell worked example",
          "text": "Use the defaults below with Signed discharge current = 1 A. At 0 s, Terminal voltage is 2.45 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-supercapacitor",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 2.45,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "energy",
              "atS": 0,
              "value": 312.5,
              "tolerance": 1e-08,
              "label": "Stored energy",
              "unit": "J"
            },
            {
              "port": "energy",
              "atS": 10,
              "value": 288,
              "tolerance": 1e-06,
              "label": "Stored energy",
              "unit": "J"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed discharge current",
              "value": 1,
              "unit": "A"
            }
          ]
        },
        "limits": [
          "Constant capacitance, series resistance and leakage. The external interface is causal; voltage- or temperature-dependent parameters are not included.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "bipm-si"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-supercapacitor"
        ],
        "exampleTraces": [
          {
            "id": "battery-supercapacitor",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-supercapacitor.json?v=8efe06cb84e3",
            "title": "Supercapacitor cell recorded example",
            "exampleId": "block-battery-supercapacitor",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 4,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-supercapacitor",
        "implementationId": "battery-supercapacitor",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-supercapacitor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-supercapacitor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-supercapacitor"
          ]
        },
        "studioHelp": {
          "type": "battery-supercapacitor",
          "namespace": "signal",
          "slug": "signal-block-battery-supercapacitor",
          "canonicalSlug": "battery-supercapacitor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Supercapacitor cell",
            "label": "Supercapacitor cell",
            "summary": "Causal capacitor state with series loss, leakage and stored energy.",
            "details": [
              "Block type: battery-supercapacitor.",
              "1 declared input and 4 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Supercapacitor cell",
              "caption": "Causal capacitor state with series loss, leakage and stored energy."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed discharge current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "internalVoltage",
                "label": "Capacitor voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "energy",
                "label": "Stored energy",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "loss",
                "label": "Dissipated heat",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacitanceF\":100,\"resistanceOhm\":0.05,\"leakageSiemens\":0,\"initialVoltageV\":2.5}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-supercapacitor/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-tabulated-cell",
      "type": "Block",
      "label": "Tabulated OCV cell",
      "properties": {
        "id": "battery-tabulated-cell",
        "name": "Tabulated OCV cell",
        "kind": "studio",
        "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
        "behavior": "Accepts signed discharge current, ambient temperature and external heat. Charge balance drives SOC; an OCV table sets equilibrium voltage. The ECM adds two RC polarization states. Both variants include an ohmic loss and a lumped temperature state.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed cell current (discharge positive); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Ambient temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External heat flow; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "soc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Cell temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Irreversible heat; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "ocv",
            "direction": "output",
            "unit": "V",
            "description": "Open-circuit voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "inRange",
            "direction": "output",
            "unit": "true / false",
            "description": "SOC in characterized range; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "capacityAh",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 5,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "heatCapacityJPerK",
            "label": "Heat capacity (J/K)",
            "unit": "J/K",
            "default": 100,
            "description": "Heat capacity (J/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "conductanceWPerK",
            "label": "Ambient thermal conductance (W/K)",
            "unit": "W/K",
            "default": 1,
            "description": "Ambient thermal conductance (W/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialSoc",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.8,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialTemperatureK",
            "label": "Initial cell temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Initial cell temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "dSOC/dt = -I / (3600 * capacityAh)",
          "dVk/dt = (I - Vk/Rk) / Ck  [ECM branches only]",
          "Vterminal = OCV(SOC) - I*R0 - sum(Vk)",
          "Cthermal*dT/dt = I^2*R0 + sum(Vk^2/Rk) + Qexternal - G*(T-Tambient)"
        ],
        "example": {
          "title": "Tabulated OCV cell worked example",
          "text": "Use the defaults below with Signed cell current (discharge positive) = 2 A, Ambient temperature = 298.15 K, External heat flow = 0 W. At 0 s, Terminal voltage is 3.68 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-tabulated-cell",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.68,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "soc",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed cell current (discharge positive)",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Ambient temperature",
              "value": 298.15,
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External heat flow",
              "value": 0,
              "unit": "W"
            }
          ]
        },
        "limits": [
          "The external interface is causal current-to-voltage, without conserving terminals. Parameters are constant except the one-dimensional SOC-to-OCV table. No hysteresis, aging, reversible entropic heat or automatic parameter identification.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-tabulated-cell"
        ],
        "exampleTraces": [
          {
            "id": "battery-tabulated-cell",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-tabulated-cell.json?v=eaf379d0c89d",
            "title": "Tabulated OCV cell recorded example",
            "exampleId": "block-battery-tabulated-cell",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-tabulated-cell",
        "implementationId": "battery-tabulated-cell",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-tabulated-cell/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-tabulated-cell/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-tabulated-cell"
          ]
        },
        "studioHelp": {
          "type": "battery-tabulated-cell",
          "namespace": "signal",
          "slug": "signal-block-battery-tabulated-cell",
          "canonicalSlug": "battery-tabulated-cell",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Tabulated OCV cell",
            "label": "Tabulated OCV cell",
            "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
            "details": [
              "Block type: battery-tabulated-cell.",
              "3 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "I → cell state → V, T",
              "label": "Tabulated electrical cell",
              "caption": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed cell current (discharge positive)",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Ambient temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External heat flow",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "loss",
                "label": "Irreversible heat",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ocv",
                "label": "Open-circuit voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "inRange",
                "label": "SOC in characterized range",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacityAh\":5,\"resistanceOhm\":0.01,\"heatCapacityJPerK\":100,\"conductanceWPerK\":1,\"initialSoc\":0.8,\"initialTemperatureK\":298.15,\"ocvTable\":[[0,3.7],[1,3.7]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-tabulated-cell/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-thermal-state-space",
      "type": "Block",
      "label": "Thermal state-space model",
      "properties": {
        "id": "battery-thermal-state-space",
        "name": "Thermal state-space model",
        "kind": "studio",
        "summary": "Linear thermal rise model with a positive diagonal heat-capacity descriptor. User supplies validated matrices.",
        "behavior": "Solves a linear temperature-rise model with positive diagonal heat capacities. Heat inputs drive the state; output temperatures add the configured ambient temperature to the linear result.",
        "ports": [
          {
            "name": "input",
            "direction": "input",
            "unit": "W",
            "description": "Heat inputs; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "output",
            "direction": "output",
            "unit": "K",
            "description": "Temperature outputs; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "temperature"
          }
        ],
        "parameters": [
          {
            "key": "ambientK",
            "label": "Ambient temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Ambient temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "A",
            "label": "State matrix A",
            "unit": "Model-dependent",
            "default": [
              [
                -2,
                1
              ],
              [
                1,
                -2
              ]
            ],
            "description": "Row-oriented state matrix. Dimensions must agree with B, C, D and the initial state."
          },
          {
            "key": "B",
            "label": "Input matrix B",
            "unit": "Model-dependent",
            "default": [
              [
                1,
                0
              ],
              [
                0,
                1
              ]
            ],
            "description": "Row-oriented input matrix. One column per input channel."
          },
          {
            "key": "C",
            "label": "Output matrix C",
            "unit": "Model-dependent",
            "default": [
              [
                1,
                0
              ],
              [
                0,
                1
              ]
            ],
            "description": "Row-oriented output matrix. One row per output channel."
          },
          {
            "key": "D",
            "label": "Feedthrough matrix D",
            "unit": "Model-dependent",
            "default": [
              [
                0,
                0
              ],
              [
                0,
                0
              ]
            ],
            "description": "Row-oriented direct feedthrough matrix; output rows by input columns."
          },
          {
            "key": "initial",
            "label": "Initial state vector",
            "unit": "See field order",
            "default": [
              0,
              0
            ],
            "description": "Initial state vector, with one value per state."
          },
          {
            "key": "capacityDiagonal",
            "label": "Node heat capacities (J/K)",
            "unit": "See field order",
            "default": [
              100,
              100
            ],
            "description": "Node heat capacities (J/K). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "diag(capacity)*dx/dt = A*x + B*Q",
          "Toutput = ambientK + C*x + D*Q"
        ],
        "example": {
          "title": "Thermal state-space model worked example",
          "text": "Use the defaults below with Heat inputs = [10, 0] W. At 0 s, Temperature outputs is [298.15, 298.15] K. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-thermal-state-space",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "output",
              "atS": 0,
              "value": [
                298.15,
                298.15
              ],
              "tolerance": 1e-08,
              "label": "Temperature outputs",
              "unit": "K"
            }
          ],
          "inputs": [
            {
              "port": "input",
              "label": "Heat inputs",
              "value": [
                10,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Supports a positive diagonal descriptor, not an arbitrary descriptor matrix. No finite-element import or conserving thermal adapter; supplied matrices determine heat conservation and stability.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "openstax-heat",
          "astrom-murray-feedback"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-thermal-state-space"
        ],
        "exampleTraces": [
          {
            "id": "battery-thermal-state-space",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-thermal-state-space.json?v=e398d07c9249",
            "title": "Thermal state-space model recorded example",
            "exampleId": "block-battery-thermal-state-space",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 2,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-thermal-state-space",
        "implementationId": "battery-thermal-state-space",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-thermal-state-space/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-thermal-state-space/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-thermal-state-space"
          ]
        },
        "studioHelp": {
          "type": "battery-thermal-state-space",
          "namespace": "signal",
          "slug": "signal-block-battery-thermal-state-space",
          "canonicalSlug": "battery-thermal-state-space",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Thermal state-space model",
            "label": "Thermal state-space model",
            "summary": "Linear thermal rise model with a positive diagonal heat-capacity descriptor. User supplies validated matrices.",
            "details": [
              "Block type: battery-thermal-state-space.",
              "1 declared input and 1 declared output in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Thermal state-space model",
              "caption": "Linear thermal rise model with a positive diagonal heat-capacity descriptor. User supplies validated matrices."
            },
            "inputs": [
              {
                "id": "input",
                "label": "Heat inputs",
                "quantity": "heat",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "output",
                "label": "Temperature outputs",
                "quantity": "temperature",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"ambientK\":298.15,\"A\":[[-2,1],[1,-2]],\"B\":[[1,0],[0,1]],\"C\":[[1,0],[0,1]],\"D\":[[0,0],[0,0]],\"initial\":[0,0],\"capacityDiagonal\":[100,100]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-thermal-state-space/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:thermal-rate",
      "type": "Block",
      "label": "Thermal balance",
      "properties": {
        "id": "thermal-rate",
        "kind": "studio",
        "name": "Thermal balance",
        "summary": "Lumped heat balance with ambient loss.",
        "behavior": "Lumped heat balance with ambient loss.",
        "documentationSlug": "signal-block-thermal-rate",
        "referenceOnly": true,
        "ports": [
          {
            "name": "Generated heat",
            "direction": "input",
            "unit": "W",
            "description": "Heat flow; Scalar; real. Received from a connected producer."
          },
          {
            "name": "Temperature",
            "direction": "input",
            "unit": "K",
            "description": "Temperature; Scalar; real. Received from a connected producer."
          },
          {
            "name": "Ambient",
            "direction": "input",
            "unit": "K",
            "description": "Temperature; Scalar; real. Received from a connected producer."
          },
          {
            "name": "Output",
            "direction": "output",
            "unit": "K/s",
            "description": "Temperature rate; Scalar; real. Produced for connected consumers."
          }
        ],
        "parameters": [
          {
            "key": "heatCapacityJPerK",
            "label": "Heat capacity",
            "unit": "J/K",
            "default": "900",
            "description": "Declared authoring field: Heat capacity."
          },
          {
            "key": "conductanceWPerK",
            "label": "Ambient conductance",
            "unit": "W/K",
            "default": "1",
            "description": "Declared authoring field: Ambient conductance."
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "thermal-rate",
        "implementationId": "thermal-rate",
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-thermal-rate/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/signal-block-thermal-rate/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "thermal-rate",
          "namespace": "signal",
          "slug": "signal-block-thermal-rate",
          "canonicalSlug": "signal-block-thermal-rate",
          "existing": false,
          "dynamic": false,
          "scene": {
            "title": "Thermal balance",
            "label": "Thermal balance",
            "summary": "Lumped heat balance with ambient loss.",
            "details": [
              "Block type: thermal-rate.",
              "3 declared inputs and 1 declared output in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "thermal",
              "symbol": "(Q − UA·ΔT) / C",
              "label": "Lumped heat balance",
              "caption": "Lumped heat balance with ambient loss."
            },
            "inputs": [
              {
                "id": "in0",
                "label": "Generated heat",
                "quantity": "heat",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "in1",
                "label": "Temperature",
                "quantity": "temperature",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "in2",
                "label": "Ambient",
                "quantity": "temperature",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "out0",
                "label": "Output",
                "quantity": "temperature-rate",
                "unit": "K/s",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature rate",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "heatCapacityJPerK",
                "label": "Heat capacity",
                "unit": "J/K",
                "value": "900"
              },
              {
                "id": "conductanceWPerK",
                "label": "Ambient conductance",
                "unit": "W/K",
                "value": "1"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-thermal-rate/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "workflow:loss-accounting",
      "type": "Workflow",
      "label": "Compare grid and battery energy",
      "properties": {
        "id": "loss-accounting",
        "title": "Compare grid and battery energy",
        "kind": "studio",
        "summary": "Separate energy and loss signals make efficiency visible.",
        "steps": [
          "Keep battery settings fixed.",
          "Change converter efficiency."
        ],
        "example": "7 kW battery-side power at 95% efficiency requires about 7.37 kW grid power and produces about 0.37 kW converter loss.",
        "observe": "Battery I²R loss differs from converter loss.",
        "limits": "A loss signal is not a predicted temperature. This network takes external temperature.",
        "url": "https://design.lemonergy.com/cosim.html?example=charging-home",
        "label": "Open the Studio example",
        "evidence": [
          "js/charging-control.js",
          "js/charging-scenarios.js",
          "docs/CHARGING_BLOCKS_SPEC.md"
        ]
      }
    },
    {
      "id": "topic:topic-thermal",
      "type": "Topic",
      "label": "Thermal management and heat transfer",
      "properties": {
        "id": "topic-thermal",
        "name": "Thermal management and heat transfer",
        "lede": "How heat is made, moved and removed in cells and packs, and the hardware that keeps a battery at the right temperature.",
        "context": "Select spatial detail for the question.",
        "example": "Equal total heat in different layouts can produce different gradients. Average temperature can miss a hot spot.",
        "lesson_url": "https://lemonergy.com/learn/fundamentals/battery-aging/",
        "lesson_label": "Open temperature and aging"
      }
    },
    {
      "id": "term:entropy-coefficient",
      "type": "Term",
      "label": "Entropy coefficient",
      "properties": {
        "id": "entropy-coefficient",
        "name": "Entropy coefficient",
        "section": "topic-electrochemistry",
        "definition": "The change of open-circuit voltage with temperature, dE/dT, usually a fraction of a millivolt per kelvin and varying with state of charge. It sets the reversible heat a cell absorbs or releases, which can be a large share of total heat at low current.",
        "formula": "q_rev = I·T·(dE/dT)",
        "unit": "mV/K",
        "related": [
          "heat-generation",
          "gibbs-free-energy",
          "open-circuit-voltage"
        ],
        "example": {
          "title": "Track reversible heat with the sign convention",
          "text": "With positive charging current of 5 A, temperature 300 K and dE/dT = 0.1 mV/K, q_rev = IT(dE/dT) gives +0.15 W. Reversing the current reverses this contribution."
        },
        "notes": [
          "The glossary plot takes positive heat as heat released. Other sources may use positive-discharge current and a different written sign."
        ],
        "url": "https://lemonergy.com/learn/glossary/entropy-coefficient/",
        "mentions": [
          "state-of-charge"
        ]
      }
    },
    {
      "id": "term:internal-resistance",
      "type": "Term",
      "label": "Internal resistance",
      "properties": {
        "id": "internal-resistance",
        "name": "Internal resistance",
        "abbr": "IR",
        "aka": [
          "DC resistance",
          "DCIR"
        ],
        "section": "topic-units",
        "definition": "The resistance a cell presents to current, from its foils, electrolyte, interfaces and the reactions themselves. It converts part of the delivered energy into heat, sets the voltage drop under load, and rises as the cell ages; a large automotive cell has about a milliohm, a small cylindrical cell tens.",
        "unit": "mΩ",
        "related": [
          "ohms-law",
          "ir-drop",
          "impedance-rise",
          "dcir",
          "area-specific-resistance",
          "resistance-capacity-product"
        ],
        "lesson": "fundamentals/battery-basics/#datasheet",
        "url": "https://lemonergy.com/learn/glossary/internal-resistance/",
        "mentions": [
          "electrolyte",
          "cylindrical-cell"
        ]
      }
    },
    {
      "id": "term:thermal-model",
      "type": "Term",
      "label": "Thermal model",
      "properties": {
        "id": "thermal-model",
        "name": "Thermal model",
        "aka": [
          "lumped thermal model"
        ],
        "section": "topic-thermal",
        "definition": "A model of cell temperature: at its simplest one thermal mass with heat generation inside and convection outside, at its most detailed a 3D simulation of the pack. Temperature feeds back into every rate, so electrical and thermal models are usually solved together.",
        "related": [
          "heat-generation",
          "thermal-management",
          "arrhenius",
          "newman-model",
          "thermal-characterisation"
        ],
        "url": "https://lemonergy.com/learn/glossary/thermal-model/",
        "mentions": [
          "thermal-mass",
          "heat-transfer-modes"
        ]
      }
    },
    {
      "id": "term:thermal-management",
      "type": "Term",
      "label": "Thermal management",
      "properties": {
        "id": "thermal-management",
        "name": "Thermal management",
        "abbr": "TMS",
        "aka": [
          "battery thermal management system",
          "BTMS"
        ],
        "section": "topic-thermal",
        "definition": "Keeping cells in their comfortable range, roughly 15–35 °C, and within a few degrees of each other: liquid cooling plates, refrigerant plates or immersion for heat removal, and heaters or waste heat for warming before fast charging in the cold.",
        "related": [
          "cooling-plate",
          "thermal-interface-material",
          "operating-temperature",
          "heat-generation",
          "preconditioning",
          "temperature-sensor"
        ],
        "url": "https://lemonergy.com/learn/glossary/thermal-management/",
        "mentions": [
          "fast-charging"
        ]
      }
    },
    {
      "id": "term:exothermic",
      "type": "Term",
      "label": "Exothermic and endothermic",
      "properties": {
        "id": "exothermic",
        "name": "Exothermic and endothermic",
        "section": "topic-safety",
        "definition": "A reaction that releases heat is exothermic; one that absorbs it is endothermic. Thermal runaway is a chain of exothermic reactions; a few cell processes, such as graphite lithiation at some stages, are mildly endothermic and cool the cell.",
        "related": [
          "thermal-runaway",
          "heat-generation",
          "entropy-coefficient"
        ],
        "url": "https://lemonergy.com/learn/glossary/exothermic/",
        "mentions": [
          "graphite",
          "calcination"
        ]
      }
    },
    {
      "id": "term:overpotential",
      "type": "Term",
      "label": "Overpotential",
      "properties": {
        "id": "overpotential",
        "name": "Overpotential",
        "abbr": "η",
        "section": "topic-electrochemistry",
        "definition": "The extra voltage, beyond the equilibrium potential, needed to drive a reaction at a given rate at one electrode. Activation overpotential pays for charge transfer, concentration overpotential for depleted reactant, and both appear as polarization at the terminals.",
        "unit": "V",
        "related": [
          "polarization",
          "butler-volmer",
          "exchange-current-density",
          "concentration-polarization"
        ],
        "url": "https://lemonergy.com/learn/glossary/overpotential/",
        "mentions": [
          "electrode",
          "charge-transfer"
        ]
      }
    },
    {
      "id": "visual:heat",
      "type": "Visual",
      "label": "Current and resistive heating",
      "properties": {
        "title": "Current and resistive heating",
        "summary": "Double the current and ohmic heating increases fourfold.",
        "readout": "At 5 A: 0.5 W. At 10 A: 2 W.",
        "formula": "P_heat = I²R",
        "note": "Resistance is constant; reversible entropic heat and other losses are excluded.",
        "software": {
          "status": "reference",
          "label": "Reference concept",
          "body": "P = I²R is the ohmic contribution. The product Charge session can also use a lumped thermal model; the native Studio battery does not calculate temperature evolution.",
          "href": "https://design.lemonergy.com/"
        },
        "html": "<figure class=\"visual-figure\"><figcaption>Ohmic heating</figcaption><svg class=\"visual-chart\" viewBox=\"0 0 360 330\" role=\"img\" aria-labelledby=\"static-heat-0-title static-heat-0-desc\"><title id=\"static-heat-0-title\">Ohmic heating</title><desc id=\"static-heat-0-desc\">Current magnitude (A) versus Heat rate (W). I²R. Interpretation follows the graphs.</desc><path d=\"M74,238h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"242\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">0</text><text x=\"74\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">0</text><path d=\"M74,188.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"192.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">2</text><text x=\"141\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">5</text><path d=\"M74,139h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"143\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">4</text><text x=\"208\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">10</text><path d=\"M74,89.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"93.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">6</text><text x=\"275\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">15</text><path d=\"M74,40h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"44\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">8</text><text x=\"342\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">20</text><path d=\"M74,40v198h268\" fill=\"none\" stroke=\"currentColor\" opacity=\".3\"/><polyline fill=\"none\" stroke=\"#a45b2b\" stroke-width=\"2.8\" points=\"74.00,238.00 76.68,237.98 79.36,237.92 82.04,237.82 84.72,237.68 87.40,237.50 90.08,237.29 92.76,237.03 95.44,236.73 98.12,236.40 100.80,236.02 103.48,235.60 106.16,235.15 108.84,234.65 111.52,234.12 114.20,233.54 116.88,232.93 119.56,232.28 122.24,231.58 124.92,230.85 127.60,230.08 130.28,229.27 132.96,228.42 135.64,227.53 138.32,226.60 141.00,225.63 143.68,224.62 146.36,223.57 149.04,222.48 151.72,221.35 154.40,220.18 157.08,218.97 159.76,217.72 162.44,216.44 165.12,215.11 167.80,213.75 170.48,212.34 173.16,210.89 175.84,209.41 178.52,207.88 181.20,206.32 183.88,204.72 186.56,203.07 189.24,201.39 191.92,199.67 194.60,197.91 197.28,196.10 199.96,194.26 202.64,192.38 205.32,190.46 208.00,188.50 210.68,186.50 213.36,184.46 216.04,182.38 218.72,180.26 221.40,178.11 224.08,175.91 226.76,173.67 229.44,171.39 232.12,169.08 234.80,166.72 237.48,164.32 240.16,161.89 242.84,159.41 245.52,156.90 248.20,154.34 250.88,151.75 253.56,149.12 256.24,146.44 258.92,143.73 261.60,140.98 264.28,138.19 266.96,135.36 269.64,132.49 272.32,129.58 275.00,126.63 277.68,123.64 280.36,120.61 283.04,117.54 285.72,114.43 288.40,111.28 291.08,108.09 293.76,104.86 296.44,101.60 299.12,98.29 301.80,94.94 304.48,91.56 307.16,88.13 309.84,84.67 312.52,81.16 315.20,77.62 317.88,74.04 320.56,70.41 323.24,66.75 325.92,63.05 328.60,59.31 331.28,55.52 333.96,51.70 336.64,47.84 339.32,43.94 342.00,40.00\"/><text transform=\"translate(208 303)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Current magnitude (A)</tspan></text><text transform=\"translate(20 139) rotate(-90)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Heat rate (W)</tspan></text></svg><div class=\"visual-legend\"><span><i style=\"background:#a45b2b\"></i>I²R</span></div></figure>"
      }
    },
    {
      "id": "reference:bernardi-energy",
      "type": "Reference",
      "label": "A General Energy Balance for Battery Systems",
      "properties": {
        "title": "A General Energy Balance for Battery Systems",
        "publisher": "Journal of The Electrochemical Society",
        "url": "https://doi.org/10.1149/1.2113792",
        "type": "Research article",
        "scope": "Battery energy balance and irreversible and reversible heat contributions. Reduced thermal models require explicit assumptions and current-sign conventions.",
        "year": 1985,
        "authors": [
          "Dawn Bernardi",
          "Ellen Pawlikowski",
          "John Newman"
        ],
        "accessed": "2026-10-27"
      }
    }
  ]
}
