{
  "auditDate": "2026-11-12",
  "auditedBaseCommit": "a6d4de4700dccbeed9c2cb14811760c490fcdbf1",
  "scope": "Single-phase gas straight-pipe methods, numerical verification and controlled comparison. No new production solver or full Crane compliance claim.",
  "solverHashes": {
    "dist/gas-pipe.js": "7ad9225ba5e61803ec1134b2455a4c47ce429f0e637632feb8ff7d2006311f9b",
    "dist/fanno-path.js": "a45ed15dfcf3b870224b46ee73ad45bc90a6d20ad448bbc38916915bef361fb4",
    "dist/isothermal-path.js": "859a10344db4cf47677dd211ea0c6785b5e63c6bdf6b5a7fae796f95611e665b",
    "dist/engine.js": "e63b3a71a6e3f8c5b3e3f37668322e7c06a46ad0b1737dc901fbda2c8abd07e0",
    "dist/gas-flow.js": "3de3c8e7329b3db9411344da4c2e75c9aa1cb6a16e6fbc30084b205a368c5f8f"
  },
  "controlledCases": [
    {
      "name": "Low Mach",
      "inletMach": 0.02,
      "inputs": {
        "inletPressure": 500000,
        "inletTemperature": 300,
        "diameter": 0.1,
        "gasConstant": 287,
        "gamma": 1.4,
        "z": 1,
        "darcyFrictionFactor": 0.02,
        "massFlow": 0.3167031066071945,
        "length": 100
      },
      "resistance": 20,
      "isothermal": {
        "status": "ok",
        "outletPressurePa": 497190.5291329832,
        "outletTemperatureK": 300,
        "outletMach": 0.020113013852935454,
        "criticalLengthM": 8886.133559700254,
        "equationResidual": 2.2737367544323206e-13
      },
      "fanno": {
        "status": "ok",
        "outletPressurePa": 497190.5306613279,
        "outletTemperatureK": 299.99972804458037,
        "outletMach": 0.020113004674701576,
        "criticalLengthM": 8892.249409496306,
        "equationResidual": 2.2737367544323206e-13
      },
      "pressureDifferencePa": 0.0015283446991816163,
      "meaning": "Same inlet STATIC state, mass flow, Darcy factor, bore and length. Different thermal models; difference is not an implementation error."
    },
    {
      "name": "Moderate Mach",
      "inletMach": 0.2,
      "inputs": {
        "inletPressure": 500000,
        "inletTemperature": 300,
        "diameter": 0.1,
        "gasConstant": 287,
        "gamma": 1.4,
        "z": 1,
        "darcyFrictionFactor": 0.02,
        "massFlow": 3.167031066071944,
        "length": 5
      },
      "resistance": 1,
      "isothermal": {
        "status": "ok",
        "outletPressurePa": 484914.6462169318,
        "outletTemperatureK": 300,
        "outletMach": 0.20622185941412852,
        "criticalLengthM": 69.87369634447937,
        "equationResidual": -3.552713678800501e-15
      },
      "fanno": {
        "status": "ok",
        "outletPressurePa": 484933.84590913466,
        "outletTemperatureK": 299.8510870558397,
        "outletMach": 0.20616250843021494,
        "criticalLengthM": 72.66633240975678,
        "equationResidual": 3.552713678800501e-15
      },
      "pressureDifferencePa": 19.199692202848382,
      "meaning": "Same inlet STATIC state, mass flow, Darcy factor, bore and length. Different thermal models; difference is not an implementation error."
    },
    {
      "name": "High Mach",
      "inletMach": 0.6,
      "inputs": {
        "inletPressure": 500000,
        "inletTemperature": 300,
        "diameter": 0.1,
        "gasConstant": 287,
        "gamma": 1.4,
        "z": 1,
        "darcyFrictionFactor": 0.02,
        "massFlow": 9.501093198215834,
        "length": 0.75
      },
      "resistance": 0.15,
      "isothermal": {
        "status": "ok",
        "outletPressurePa": 455863.4193711045,
        "outletTemperatureK": 300,
        "outletMach": 0.6580918478036053,
        "criticalLengthM": 1.4947398660810796,
        "equationResidual": -8.326672684688674e-17
      },
      "fanno": {
        "status": "ok",
        "outletPressurePa": 463277.2170334371,
        "outletTemperatureK": 296.9490702563806,
        "outletMach": 0.6442592596864903,
        "criticalLengthM": 2.45411026326362,
        "equationResidual": 2.498001805406602e-16
      },
      "pressureDifferencePa": 7413.797662332596,
      "meaning": "Same inlet STATIC state, mass flow, Darcy factor, bore and length. Different thermal models; difference is not an implementation error."
    },
    {
      "name": "Near isothermal limit",
      "inletMach": 0.3,
      "inputs": {
        "inletPressure": 500000,
        "inletTemperature": 300,
        "diameter": 0.1,
        "gasConstant": 287,
        "gamma": 1.4,
        "z": 1,
        "darcyFrictionFactor": 0.02,
        "massFlow": 4.750546599107917,
        "length": 23.108914181267064
      },
      "resistance": 4.621782836253413,
      "isothermal": {
        "status": "ok",
        "outletPressurePa": 242590.47549753304,
        "outletTemperatureK": 300,
        "outletMach": 0.6183260067913317,
        "criticalLengthM": 24.325172822386396,
        "equationResidual": 0
      },
      "fanno": {
        "status": "ok",
        "outletPressurePa": 262528.2200356187,
        "outletTemperatureK": 287.42060516018523,
        "outletMach": 0.5592597798560193,
        "criticalLengthM": 26.49626552545577,
        "equationResidual": 0
      },
      "pressureDifferencePa": 19937.74453808565,
      "meaning": "Same inlet STATIC state, mass flow, Darcy factor, bore and length. Different thermal models; difference is not an implementation error."
    },
    {
      "name": "Different model limits",
      "inletMach": 0.3,
      "inputs": {
        "inletPressure": 500000,
        "inletTemperature": 300,
        "diameter": 0.1,
        "gasConstant": 287,
        "gamma": 1.4,
        "z": 1,
        "darcyFrictionFactor": 0.02,
        "massFlow": 4.750546599107917,
        "length": 25.410719173921077
      },
      "resistance": 5.0821438347842145,
      "isothermal": {
        "status": "capacity_exceeded",
        "outletPressurePa": null,
        "outletTemperatureK": null,
        "outletMach": null,
        "criticalLengthM": 24.325172822386396,
        "equationResidual": null
      },
      "fanno": {
        "status": "ok",
        "outletPressurePa": 207805.2821723434,
        "outletTemperatureK": 278.4648779982188,
        "outletMach": 0.6954393526743733,
        "criticalLengthM": 26.49626552545577,
        "equationResidual": 0
      },
      "pressureDifferencePa": null,
      "meaning": "Same inlet STATIC state, mass flow, Darcy factor, bore and length. Different thermal models; difference is not an implementation error."
    },
    {
      "name": "Gamma 1.3",
      "inletMach": 0.35,
      "inputs": {
        "inletPressure": 500000,
        "inletTemperature": 300,
        "diameter": 0.1,
        "gasConstant": 287,
        "gamma": 1.3,
        "z": 1,
        "darcyFrictionFactor": 0.02,
        "massFlow": 5.34069812087245,
        "length": 2.5
      },
      "resistance": 0.5,
      "isothermal": {
        "status": "ok",
        "outletPressurePa": 475491.1211809851,
        "outletTemperatureK": 300,
        "outletMach": 0.36804052106241153,
        "criticalLengthM": 17.21077433166779,
        "equationResidual": 0
      },
      "fanno": {
        "status": "ok",
        "outletPressurePa": 475706.3138423863,
        "outletTemperatureK": 299.4450991289377,
        "outletMach": 0.3675336524139436,
        "criticalLengthM": 18.80177384965751,
        "equationResidual": 0
      },
      "pressureDifferencePa": 215.19266140117543,
      "meaning": "Same inlet STATIC state, mass flow, Darcy factor, bore and length. Different thermal models; difference is not an implementation error."
    },
    {
      "name": "Gamma 1.67",
      "inletMach": 0.35,
      "inputs": {
        "inletPressure": 500000,
        "inletTemperature": 300,
        "diameter": 0.1,
        "gasConstant": 287,
        "gamma": 1.67,
        "z": 1,
        "darcyFrictionFactor": 0.02,
        "massFlow": 6.053193957836522,
        "length": 2.5
      },
      "resistance": 0.5,
      "isothermal": {
        "status": "ok",
        "outletPressurePa": 466096.5274037463,
        "outletTemperatureK": 300,
        "outletMach": 0.37545870803798104,
        "criticalLengthM": 11.506810977343513,
        "equationResidual": -6.661338147750939e-16
      },
      "fanno": {
        "status": "ok",
        "outletPressurePa": 467003.1621763696,
        "outletTemperatureK": 298.3532982220151,
        "outletMach": 0.37369993444391586,
        "criticalLengthM": 14.048720746293178,
        "equationResidual": -4.440892098500626e-16
      },
      "pressureDifferencePa": 906.6347726232489,
      "meaning": "Same inlet STATIC state, mass flow, Darcy factor, bore and length. Different thermal models; difference is not an implementation error."
    }
  ],
  "friction": {
    "convention": "Darcy f_D; equivalent Fanning f_F = f_D/4. Pipe resistance is f_D L/D, not 4 f_D L/D.",
    "points": [
      {
        "re": 4000,
        "relativeRoughness": 0,
        "colebrookDarcy": 0.0399070140556349,
        "serghidesDarcy": 0.03990694940229793,
        "errorPercent": -0.00016200995864856793
      },
      {
        "re": 4000,
        "relativeRoughness": 0.000001,
        "colebrookDarcy": 0.03990802944617067,
        "serghidesDarcy": 0.03990796485081199,
        "errorPercent": -0.00016186055682432254
      },
      {
        "re": 4000,
        "relativeRoughness": 0.0001,
        "colebrookDarcy": 0.0400084312335555,
        "serghidesDarcy": 0.040008372158814705,
        "errorPercent": -0.0001476557289881164
      },
      {
        "re": 4000,
        "relativeRoughness": 0.001,
        "colebrookDarcy": 0.040910389862846126,
        "serghidesDarcy": 0.040910365164601815,
        "errorPercent": -0.00006037156916605113
      },
      {
        "re": 4000,
        "relativeRoughness": 0.01,
        "colebrookDarcy": 0.049082269447899736,
        "serghidesDarcy": 0.049082262118000805,
        "errorPercent": -0.00001493390385798321
      },
      {
        "re": 10000,
        "relativeRoughness": 0,
        "colebrookDarcy": 0.030882950353487697,
        "serghidesDarcy": 0.03088252077292971,
        "errorPercent": -0.0013909958506919118
      },
      {
        "re": 10000,
        "relativeRoughness": 0.000001,
        "colebrookDarcy": 0.030884498091421114,
        "serghidesDarcy": 0.03088406897618865,
        "errorPercent": -0.0013894194789587644
      },
      {
        "re": 10000,
        "relativeRoughness": 0.0001,
        "colebrookDarcy": 0.031037212200998626,
        "serghidesDarcy": 0.031036826525735958,
        "errorPercent": -0.0012426221149275385
      },
      {
        "re": 10000,
        "relativeRoughness": 0.001,
        "colebrookDarcy": 0.03238180636309272,
        "serghidesDarcy": 0.03238165337050508,
        "errorPercent": -0.00047246464859318493
      },
      {
        "re": 10000,
        "relativeRoughness": 0.01,
        "colebrookDarcy": 0.04312658470681169,
        "serghidesDarcy": 0.04312658470055544,
        "errorPercent": -1.4506706946804115e-8
      },
      {
        "re": 100000,
        "relativeRoughness": 0,
        "colebrookDarcy": 0.01798977308427384,
        "serghidesDarcy": 0.017989217250918683,
        "errorPercent": -0.0030897185448131026
      },
      {
        "re": 100000,
        "relativeRoughness": 0.000001,
        "colebrookDarcy": 0.01799519319334717,
        "serghidesDarcy": 0.017994641475671543,
        "errorPercent": -0.0030659169351521243
      },
      {
        "re": 100000,
        "relativeRoughness": 0.0001,
        "colebrookDarcy": 0.01851386607747164,
        "serghidesDarcy": 0.01851358983180063,
        "errorPercent": -0.0014921014868329863
      },
      {
        "re": 100000,
        "relativeRoughness": 0.001,
        "colebrookDarcy": 0.022174535944515076,
        "serghidesDarcy": 0.022174531366656085,
        "errorPercent": -0.000020644666487434904
      },
      {
        "re": 100000,
        "relativeRoughness": 0.01,
        "colebrookDarcy": 0.03850354352733509,
        "serghidesDarcy": 0.03850354352731175,
        "errorPercent": -6.06292793747798e-11
      },
      {
        "re": 1000000,
        "relativeRoughness": 0,
        "colebrookDarcy": 0.011645040997991622,
        "serghidesDarcy": 0.011644703538117107,
        "errorPercent": -0.0028978848127136914
      },
      {
        "re": 1000000,
        "relativeRoughness": 0.000001,
        "colebrookDarcy": 0.011668155513485805,
        "serghidesDarcy": 0.01166783827962972,
        "errorPercent": -0.002718800376966257
      },
      {
        "re": 1000000,
        "relativeRoughness": 0.0001,
        "colebrookDarcy": 0.013441437692508494,
        "serghidesDarcy": 0.013441432072358156,
        "errorPercent": -0.000041812122086870573
      },
      {
        "re": 1000000,
        "relativeRoughness": 0.001,
        "colebrookDarcy": 0.019943465840476866,
        "serghidesDarcy": 0.019943465840045353,
        "errorPercent": -2.163680346001229e-9
      },
      {
        "re": 1000000,
        "relativeRoughness": 0.01,
        "colebrookDarcy": 0.037964741876160064,
        "serghidesDarcy": 0.037964741876160064,
        "errorPercent": 0
      },
      {
        "re": 100000000,
        "relativeRoughness": 0,
        "colebrookDarcy": 0.0059404663516367615,
        "serghidesDarcy": 0.005940362538255331,
        "errorPercent": -0.0017475628222629602
      },
      {
        "re": 100000000,
        "relativeRoughness": 0.000001,
        "colebrookDarcy": 0.00643255651969228,
        "serghidesDarcy": 0.006432552938768912,
        "errorPercent": -0.000055668743170755874
      },
      {
        "re": 100000000,
        "relativeRoughness": 0.0001,
        "colebrookDarcy": 0.011999050555369487,
        "serghidesDarcy": 0.011999050555369477,
        "errorPercent": -8.881784197001252e-14
      },
      {
        "re": 100000000,
        "relativeRoughness": 0.001,
        "colebrookDarcy": 0.019638632837385293,
        "serghidesDarcy": 0.019638632837385286,
        "errorPercent": -3.3306690738754696e-14
      },
      {
        "re": 100000000,
        "relativeRoughness": 0.01,
        "colebrookDarcy": 0.03790432338735433,
        "serghidesDarcy": 0.03790432338735432,
        "errorPercent": -3.3306690738754696e-14
      }
    ],
    "maxAbsoluteErrorPercent": 0.0030897185448131026
  },
  "application": {
    "name": "Built-in 90 ft air-transfer example",
    "inletPsig": 100,
    "inletF": 80,
    "massLbHr": 60000,
    "boreIn": 4.026,
    "lengthFt": 90,
    "darcyF": 0.016398385796310255,
    "isothermalDarcyF": 0.016398385796310255,
    "isothermal": {
      "outletPsig": 55.24307282168375,
      "outletF": 80,
      "mach": 0.47323637035841715
    },
    "fanno": {
      "outletPsig": 56.726768654976674,
      "outletF": 66.91958161505426,
      "mach": 0.45775519748840837,
      "energyResidualJkg": -5.820766091346741e-11
    },
    "interpretation": "Controlled thermal-model sensitivity, not Crane-Y discharge validation."
  },
  "craneExample722": {
    "source": "Crane 2010, Example 7-22 p. 7-14; modified Darcy equation 1-43; Y read from A-23. Public transcription, original page images not inspected.",
    "printedOperands": {
      "dIn": 0.546,
      "dSquaredIn2": 0.2981,
      "lengthFt": 10,
      "darcyF": 0.0275,
      "pipeK": 6.04,
      "totalK": 7.04,
      "exitK": 1,
      "Y": 0.76,
      "inletPsia": 34,
      "outletPsia": 14.7,
      "inletRankine": 560,
      "gasSpecificGravity": 1,
      "coefficientScfh": 40700
    },
    "publishedScfh": 3762,
    "reproducedScfh": 3761.90433688105,
    "commonSI": {
      "Pin": 234421.747962,
      "Tin": 311.1111111111111,
      "Pout": 101352.93220709999,
      "R": 287.05,
      "gamma": 1.4,
      "d": 0.013868400000000001,
      "L": 3.048,
      "f": 0.0275,
      "pipeResistance": 6.043956043956044,
      "totalResistance": 7.043956043956044,
      "standardRankine": 520
    },
    "modifiedDarcyY": {
      "massKgS": 0.0361545891653744,
      "scfhBookStandard": 3760.7383234035115
    },
    "literalStaticFanno": {
      "massKgS": 0.03905474623005926,
      "inletPressurePa": 234421.747962,
      "inletTemperatureK": 311.1111111111111,
      "outletPressurePa": 101352.93220710014,
      "outletTemperatureK": 293.0269266278927,
      "outletMach": 0.6252640010665133,
      "scfhBookStandard": 4062.4076845781437
    },
    "literalMassDifferencePercent": 8.021546176114104,
    "sensitivities": {
      "totalResistanceAsDistributedDuct": {
        "massKgS": 0.03665510862788036,
        "inletPressurePa": 234421.747962,
        "inletTemperatureK": 311.1111111111111,
        "outletPressurePa": 101352.93220709999,
        "outletTemperatureK": 294.9194041865106,
        "outletMach": 0.5887379413421329,
        "scfhBookStandard": 3812.8014989977787,
        "note": "Diagnostic only: substitutes total K as duct friction. This is not a modeled physical exit fitting."
      },
      "stagnationSource": {
        "massKgS": 0.03703214608245305,
        "inletPressurePa": 222302.8222383071,
        "inletTemperatureK": 306.428370895883,
        "outletPressurePa": 101352.9322071,
        "outletTemperatureK": 290.81991188896325,
        "outletMach": 0.590645351510537,
        "scfhBookStandard": 3852.020288022991,
        "note": "Diagnostic only: reinterprets stated source P/T as stagnation values with ideal entry. Not asserted to be the book's intended state."
      }
    },
    "comparisonStatus": "OPEN: arithmetic reproduced; same-system equivalence of source energy, exit loss and Y approximation not established. Do not treat the flow difference as a solver failure or a validation pass.",
    "standardVolume": {
      "craneFahrenheit": 60,
      "craneRoundedRankine": 520,
      "appFahrenheit": 68,
      "appToCraneExactTemperatureRatio": 1.0153943848981084,
      "note": "Compare mass first. The book also rounds Fahrenheit-to-Rankine by adding 460; the app uses 459.67."
    }
  },
  "sources": {
    "crane2010": "https://www.scribd.com/document/733867654/CRANE-Technical-Paper-410-1705972152",
    "craneTranscription": "https://studylib.net/doc/28223057/crane-flow-of-fluids",
    "craneErrata": "https://tp410.com/wp-content/uploads/2022/04/us-errata-document-11-14-13.pdf",
    "fanno": "https://kyleniemeyer.github.io/gas-dynamics-notes/compressible-flows/friction/",
    "fannoBenchmark": "https://www.mathworks.com/help/simscape/ug/fanno-flow-gas-pipe-validation.html"
  }
}
