{
  "schemaVersion": 1,
  "slug": "ideal-gas-calculator",
  "category": "science",
  "kind": "implementation",
  "independentValidation": false,
  "implementationHash": "13c66f46497b62577dbb5a76a4ffa3ee1a7c425f034d92f283465b4ff7560af6",
  "provenance": "Generated from the calculation contract used by the published page. Publication is not external validation.",
  "sourceFiles": [
    "data/calculators/ideal-gas-calculator.json",
    "src/engine.js"
  ],
  "runtimeSource": "/sources/engine.txt",
  "runtimeHash": "5c888d8898afbdee36267bb9977829e1e2ac568f6677c8ee87469c139864645c",
  "scope": "The compute function records implemented equations, constants, lookup tables and custom rules. Inputs record defaults and allowed values; outputs record precision and units. Defaults are examples, not recommendations. General background references are not evidence for this specific algorithm.",
  "publishedFormula": {
    "formula": "P × V = n × R × Tk ; Tk = t + 273.15 ; R = 8.314",
    "vars": [
      [
        "P",
        "pressure (kPa)"
      ],
      [
        "V",
        "volume (L)"
      ],
      [
        "n",
        "amount of substance (mol)"
      ],
      [
        "t",
        "temperature (°C)"
      ]
    ],
    "note": "Rearrange PV = nRT to solve the selected variable; molar volume = V ÷ n. Units: kPa, L, K."
  },
  "externalEvidence": {
    "reviewedAt": "2026-10-04",
    "sources": [
      {
        "name": "OpenStax — The ideal gas law",
        "url": "https://openstax.org/books/chemistry-2e/pages/9-2-relating-pressure-volume-amount-and-temperature-the-ideal-gas-law"
      }
    ],
    "basis": "PV = nRT with R = 8.314462618, pressure in kPa, volume in L and temperature in K; Celsius is converted by adding 273.15.",
    "limitations": "Ideal-gas approximation only; pressure must be absolute. It does not model real-gas compressibility, phase changes or a pressure gauge offset. Singular divisors return the implementation’s fallback zero, not a physical solution.",
    "implementationHash": "13c66f46497b62577dbb5a76a4ffa3ee1a7c425f034d92f283465b4ff7560af6"
  },
  "contract": {
    "compute": "const R = 8.314462618; let P = pressure, V = volume, n = moles, T = temperature + 273.15; if (solveFor === 'pressure') { P = V > 0 ? n*R*T/V : 0; } else if (solveFor === 'volume') { V = P > 0 ? n*R*T/P : 0; } else if (solveFor === 'moles') { n = (R*T) > 0 ? P*V/(R*T) : 0; } else { T = (n*R) > 0 ? P*V/(n*R) : 0; } return { pressureOut: P, volumeOut: V, molesOut: n, temperatureK: T, temperatureC: T - 273.15, molarVolume: n > 0 ? V/n : 0, gasConstant: 'R = 8.314 J/(mol·K) with kPa, L and K' };",
    "inputs": [
      {
        "name": "solveFor",
        "type": "select",
        "default": "pressure",
        "options": [
          {
            "value": "pressure"
          },
          {
            "value": "volume"
          },
          {
            "value": "moles"
          },
          {
            "value": "temperature"
          }
        ]
      },
      {
        "name": "pressure",
        "type": "number",
        "default": 101.325,
        "min": 0.0001,
        "max": 1000000,
        "step": 0.001,
        "showWhen": {
          "solveFor": [
            "volume",
            "moles",
            "temperature"
          ]
        }
      },
      {
        "name": "volume",
        "type": "number",
        "default": 22.414,
        "min": 0.0001,
        "max": 1000000,
        "step": 0.001,
        "showWhen": {
          "solveFor": [
            "pressure",
            "moles",
            "temperature"
          ]
        }
      },
      {
        "name": "moles",
        "type": "number",
        "default": 1,
        "min": 0.000001,
        "max": 100000,
        "step": 0.001,
        "showWhen": {
          "solveFor": [
            "pressure",
            "volume",
            "temperature"
          ]
        }
      },
      {
        "name": "temperature",
        "type": "number",
        "default": 0,
        "min": -273.14,
        "max": 5000,
        "step": 0.01,
        "showWhen": {
          "solveFor": [
            "pressure",
            "volume",
            "moles"
          ]
        }
      }
    ],
    "outputs": [
      {
        "name": "pressureOut",
        "precision": 4,
        "unit": "kPa"
      },
      {
        "name": "volumeOut",
        "precision": 4,
        "unit": "L"
      },
      {
        "name": "molesOut",
        "precision": 5,
        "unit": "mol"
      },
      {
        "name": "temperatureK",
        "precision": 2,
        "unit": "K"
      },
      {
        "name": "temperatureC",
        "precision": 2,
        "unit": "°C"
      },
      {
        "name": "molarVolume",
        "precision": 4,
        "unit": "L/mol"
      },
      {
        "name": "gasConstant",
        "precision": 0,
        "unit": "",
        "type": "text"
      }
    ],
    "interpret": null
  }
}
