formulab 0.37.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/dist/automotive/evCharging.d.ts.map +1 -1
  3. package/dist/automotive/evCharging.js +3 -0
  4. package/dist/automotive/evCharging.js.map +1 -1
  5. package/dist/automotive/gearRatio.d.ts.map +1 -1
  6. package/dist/automotive/gearRatio.js +5 -0
  7. package/dist/automotive/gearRatio.js.map +1 -1
  8. package/dist/battery/batteryPackConfig.d.ts.map +1 -1
  9. package/dist/battery/batteryPackConfig.js +12 -0
  10. package/dist/battery/batteryPackConfig.js.map +1 -1
  11. package/dist/battery/bmsBalancing.d.ts.map +1 -1
  12. package/dist/battery/bmsBalancing.js +14 -0
  13. package/dist/battery/bmsBalancing.js.map +1 -1
  14. package/dist/battery/chargingProfile.d.ts.map +1 -1
  15. package/dist/battery/chargingProfile.js +14 -0
  16. package/dist/battery/chargingProfile.js.map +1 -1
  17. package/dist/battery/internalResistance.d.ts.map +1 -1
  18. package/dist/battery/internalResistance.js +3 -0
  19. package/dist/battery/internalResistance.js.map +1 -1
  20. package/dist/battery/selfDischarge.d.ts.map +1 -1
  21. package/dist/battery/selfDischarge.js +6 -0
  22. package/dist/battery/selfDischarge.js.map +1 -1
  23. package/dist/battery/stateOfHealth.d.ts.map +1 -1
  24. package/dist/battery/stateOfHealth.js +6 -0
  25. package/dist/battery/stateOfHealth.js.map +1 -1
  26. package/dist/battery/thermalRunaway.d.ts.map +1 -1
  27. package/dist/battery/thermalRunaway.js +8 -0
  28. package/dist/battery/thermalRunaway.js.map +1 -1
  29. package/dist/chemical/concentration.d.ts.map +1 -1
  30. package/dist/chemical/concentration.js +8 -0
  31. package/dist/chemical/concentration.js.map +1 -1
  32. package/dist/chemical/flowControl.d.ts.map +1 -1
  33. package/dist/chemical/flowControl.js +8 -0
  34. package/dist/chemical/flowControl.js.map +1 -1
  35. package/dist/chemical/reactor.d.ts.map +1 -1
  36. package/dist/chemical/reactor.js +4 -0
  37. package/dist/chemical/reactor.js.map +1 -1
  38. package/dist/chemical/reliefValve.d.ts.map +1 -1
  39. package/dist/chemical/reliefValve.js +8 -0
  40. package/dist/chemical/reliefValve.js.map +1 -1
  41. package/dist/construction/formwork.d.ts.map +1 -1
  42. package/dist/construction/formwork.js +22 -16
  43. package/dist/construction/formwork.js.map +1 -1
  44. package/dist/energy/pfCorrection.d.ts.map +1 -1
  45. package/dist/energy/pfCorrection.js +8 -0
  46. package/dist/energy/pfCorrection.js.map +1 -1
  47. package/dist/energy/vfdSavings.d.ts.map +1 -1
  48. package/dist/energy/vfdSavings.js +15 -0
  49. package/dist/energy/vfdSavings.js.map +1 -1
  50. package/dist/energy/windOutput.d.ts.map +1 -1
  51. package/dist/energy/windOutput.js +8 -0
  52. package/dist/energy/windOutput.js.map +1 -1
  53. package/dist/environmental/esgSummary.d.ts.map +1 -1
  54. package/dist/environmental/esgSummary.js +5 -0
  55. package/dist/environmental/esgSummary.js.map +1 -1
  56. package/dist/logistics/safetyStock.d.ts.map +1 -1
  57. package/dist/logistics/safetyStock.js +5 -0
  58. package/dist/logistics/safetyStock.js.map +1 -1
  59. package/dist/machining/boltCircle.d.ts.map +1 -1
  60. package/dist/machining/boltCircle.js +6 -0
  61. package/dist/machining/boltCircle.js.map +1 -1
  62. package/dist/machining/cuspHeight.d.ts +3 -0
  63. package/dist/machining/cuspHeight.d.ts.map +1 -1
  64. package/dist/machining/cuspHeight.js +12 -0
  65. package/dist/machining/cuspHeight.js.map +1 -1
  66. package/dist/machining/radialChipThinning.d.ts.map +1 -1
  67. package/dist/machining/radialChipThinning.js +9 -0
  68. package/dist/machining/radialChipThinning.js.map +1 -1
  69. package/dist/machining/triangleSolver.d.ts.map +1 -1
  70. package/dist/machining/triangleSolver.js +12 -0
  71. package/dist/machining/triangleSolver.js.map +1 -1
  72. package/dist/metal/kFactorReverse.d.ts.map +1 -1
  73. package/dist/metal/kFactorReverse.js +8 -0
  74. package/dist/metal/kFactorReverse.js.map +1 -1
  75. package/dist/quality/mtbf.d.ts +20 -0
  76. package/dist/quality/mtbf.d.ts.map +1 -1
  77. package/dist/quality/mtbf.js +38 -9
  78. package/dist/quality/mtbf.js.map +1 -1
  79. package/dist/safety/illuminance.d.ts.map +1 -1
  80. package/dist/safety/illuminance.js +8 -0
  81. package/dist/safety/illuminance.js.map +1 -1
  82. package/package.json +1 -1
@@ -12,6 +12,14 @@
12
12
  */
13
13
  export function pfCorrection(input) {
14
14
  const { kW, currentPf, targetPf, electricityRate, monthlyUsageHours, pfPenaltyRate, pfPenaltyThreshold, capacitorCostPerKvar, } = input;
15
+ // Apparent power divides real power by the power factor; a factor at or below zero has
16
+ // no apparent power to report, and one above 1 is not a power factor.
17
+ if (!(currentPf > 0) || currentPf > 1) {
18
+ throw new RangeError('currentPf must be greater than 0 and at most 1');
19
+ }
20
+ if (!(targetPf > 0) || targetPf > 1) {
21
+ throw new RangeError('targetPf must be greater than 0 and at most 1');
22
+ }
15
23
  // Calculate current and target apparent power (kVA)
16
24
  const currentKva = kW / currentPf;
17
25
  const targetKva = kW / targetPf;
@@ -1 +1 @@
1
- {"version":3,"file":"pfCorrection.js","sourceRoot":"","sources":["../../src/energy/pfCorrection.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,EACJ,EAAE,EACF,SAAS,EACT,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,GACrB,GAAG,KAAK,CAAC;IAEV,oDAAoD;IACpD,MAAM,UAAU,GAAG,EAAE,GAAG,SAAS,CAAC;IAClC,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC;IAEhC,6CAA6C;IAC7C,iEAAiE;IACjE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAE3E,2BAA2B;IAC3B,MAAM,aAAa,GAAG,YAAY,GAAG,oBAAoB,CAAC;IAE1D,6CAA6C;IAC7C,MAAM,UAAU,GAAG,EAAE,GAAG,iBAAiB,CAAC;IAE1C,uBAAuB;IACvB,0DAA0D;IAC1D,wEAAwE;IACxE,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAU,EAAE;QAC9C,IAAI,EAAE,IAAI,kBAAkB;YAAE,OAAO,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QACjE,OAAO,YAAY,GAAG,aAAa,GAAG,UAAU,GAAG,eAAe,CAAC;IACrE,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAErD,yCAAyC;IACzC,MAAM,cAAc,GAAG,qBAAqB,GAAG,iBAAiB,CAAC;IAEjE,iBAAiB;IACjB,MAAM,aAAa,GAAG,cAAc,GAAG,EAAE,CAAC;IAE1C,oDAAoD;IACpD,MAAM,aAAa,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9E,OAAO;QACL,UAAU;QACV,SAAS;QACT,YAAY;QACZ,aAAa;QACb,qBAAqB;QACrB,iBAAiB;QACjB,cAAc;QACd,aAAa;QACb,aAAa;KACd,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"pfCorrection.js","sourceRoot":"","sources":["../../src/energy/pfCorrection.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,EACJ,EAAE,EACF,SAAS,EACT,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,GACrB,GAAG,KAAK,CAAC;IAEV,uFAAuF;IACvF,sEAAsE;IACtE,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,UAAU,CAAC,gDAAgD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,UAAU,CAAC,+CAA+C,CAAC,CAAC;IACxE,CAAC;IAED,oDAAoD;IACpD,MAAM,UAAU,GAAG,EAAE,GAAG,SAAS,CAAC;IAClC,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC;IAEhC,6CAA6C;IAC7C,iEAAiE;IACjE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAE3E,2BAA2B;IAC3B,MAAM,aAAa,GAAG,YAAY,GAAG,oBAAoB,CAAC;IAE1D,6CAA6C;IAC7C,MAAM,UAAU,GAAG,EAAE,GAAG,iBAAiB,CAAC;IAE1C,uBAAuB;IACvB,0DAA0D;IAC1D,wEAAwE;IACxE,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAU,EAAE;QAC9C,IAAI,EAAE,IAAI,kBAAkB;YAAE,OAAO,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QACjE,OAAO,YAAY,GAAG,aAAa,GAAG,UAAU,GAAG,eAAe,CAAC;IACrE,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAErD,yCAAyC;IACzC,MAAM,cAAc,GAAG,qBAAqB,GAAG,iBAAiB,CAAC;IAEjE,iBAAiB;IACjB,MAAM,aAAa,GAAG,cAAc,GAAG,EAAE,CAAC;IAE1C,oDAAoD;IACpD,MAAM,aAAa,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9E,OAAO;QACL,UAAU;QACV,SAAS;QACT,YAAY;QACZ,aAAa;QACb,qBAAqB;QACrB,iBAAiB;QACjB,cAAc;QACd,aAAa;QACb,aAAa;KACd,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"vfdSavings.d.ts","sourceRoot":"","sources":["../../src/energy/vfdSavings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKpE;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA4DnE"}
1
+ {"version":3,"file":"vfdSavings.d.ts","sourceRoot":"","sources":["../../src/energy/vfdSavings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKpE;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA4EnE"}
@@ -15,6 +15,21 @@ const CO2_FACTOR = 0.5;
15
15
  */
16
16
  export function vfdSavings(input) {
17
17
  const { motorKw, fullSpeedRpm, newSpeedRpm, runningHoursPerYear, electricityRate, loadFactor, vfdCost, vfdEfficiency, } = input;
18
+ // The affinity law works on the speed ratio, and the saving is expressed as a share of
19
+ // the motor's rated load; none of these three may be zero.
20
+ if (!(motorKw > 0)) {
21
+ throw new RangeError('motorKw must be greater than 0');
22
+ }
23
+ if (!(fullSpeedRpm > 0)) {
24
+ throw new RangeError('fullSpeedRpm must be greater than 0');
25
+ }
26
+ if (!(loadFactor > 0)) {
27
+ throw new RangeError('loadFactor must be greater than 0');
28
+ }
29
+ // The drive's own losses divide the shaft power by its efficiency.
30
+ if (!(vfdEfficiency > 0)) {
31
+ throw new RangeError('vfdEfficiency must be greater than 0');
32
+ }
18
33
  // Calculate speed ratio
19
34
  const speedRatio = newSpeedRpm / fullSpeedRpm;
20
35
  // Apply affinity law: Power is proportional to Speed cubed
@@ -1 +1 @@
1
- {"version":3,"file":"vfdSavings.js","sourceRoot":"","sources":["../../src/energy/vfdSavings.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAC/C,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EACJ,OAAO,EACP,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,UAAU,EACV,OAAO,EACP,aAAa,GACd,GAAG,KAAK,CAAC;IAEV,wBAAwB;IACxB,MAAM,UAAU,GAAG,WAAW,GAAG,YAAY,CAAC;IAE9C,2DAA2D;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAE3C,oEAAoE;IACpE,MAAM,eAAe,GAAG,OAAO,GAAG,UAAU,CAAC;IAE7C,2CAA2C;IAC3C,kCAAkC;IAClC,MAAM,UAAU,GAAG,eAAe,GAAG,UAAU,GAAG,aAAa,CAAC;IAEhE,kBAAkB;IAClB,MAAM,cAAc,GAAG,eAAe,GAAG,UAAU,CAAC;IACpD,MAAM,qBAAqB,GAAG,CAAC,cAAc,GAAG,eAAe,CAAC,GAAG,GAAG,CAAC;IAEvE,4CAA4C;IAC5C,MAAM,iBAAiB,GAAG,eAAe,GAAG,mBAAmB,CAAC;IAChE,MAAM,YAAY,GAAG,UAAU,GAAG,mBAAmB,CAAC;IAEtD,yBAAyB;IACzB,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,eAAe,CAAC;IAC/D,MAAM,aAAa,GAAG,YAAY,GAAG,eAAe,CAAC;IAErD,iBAAiB;IACjB,MAAM,aAAa,GAAG,kBAAkB,GAAG,aAAa,CAAC;IAEzD,iDAAiD;IACjD,MAAM,YAAY,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,gBAAgB;IAChB,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,YAAY,CAAC;IAC1D,MAAM,cAAc,GAAG,gBAAgB,GAAG,UAAU,CAAC;IAErD,OAAO;QACL,UAAU;QACV,UAAU;QACV,eAAe;QACf,UAAU;QACV,cAAc;QACd,qBAAqB;QACrB,kBAAkB;QAClB,aAAa;QACb,aAAa;QACb,YAAY;QACZ,cAAc;KACf,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"vfdSavings.js","sourceRoot":"","sources":["../../src/energy/vfdSavings.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAC/C,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EACJ,OAAO,EACP,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,UAAU,EACV,OAAO,EACP,aAAa,GACd,GAAG,KAAK,CAAC;IAEV,uFAAuF;IACvF,2DAA2D;IAC3D,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAAC,gCAAgC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAC5D,CAAC;IACD,mEAAmE;IACnE,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,UAAU,CAAC,sCAAsC,CAAC,CAAC;IAC/D,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,WAAW,GAAG,YAAY,CAAC;IAE9C,2DAA2D;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAE3C,oEAAoE;IACpE,MAAM,eAAe,GAAG,OAAO,GAAG,UAAU,CAAC;IAE7C,2CAA2C;IAC3C,kCAAkC;IAClC,MAAM,UAAU,GAAG,eAAe,GAAG,UAAU,GAAG,aAAa,CAAC;IAEhE,kBAAkB;IAClB,MAAM,cAAc,GAAG,eAAe,GAAG,UAAU,CAAC;IACpD,MAAM,qBAAqB,GAAG,CAAC,cAAc,GAAG,eAAe,CAAC,GAAG,GAAG,CAAC;IAEvE,4CAA4C;IAC5C,MAAM,iBAAiB,GAAG,eAAe,GAAG,mBAAmB,CAAC;IAChE,MAAM,YAAY,GAAG,UAAU,GAAG,mBAAmB,CAAC;IAEtD,yBAAyB;IACzB,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,eAAe,CAAC;IAC/D,MAAM,aAAa,GAAG,YAAY,GAAG,eAAe,CAAC;IAErD,iBAAiB;IACjB,MAAM,aAAa,GAAG,kBAAkB,GAAG,aAAa,CAAC;IAEzD,iDAAiD;IACjD,MAAM,YAAY,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,gBAAgB;IAChB,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,YAAY,CAAC;IAC1D,MAAM,cAAc,GAAG,gBAAgB,GAAG,UAAU,CAAC;IAErD,OAAO;QACL,UAAU;QACV,UAAU;QACV,eAAe;QACf,UAAU;QACV,cAAc;QACd,qBAAqB;QACrB,kBAAkB;QAClB,aAAa;QACb,aAAa;QACb,YAAY;QACZ,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"windOutput.d.ts","sourceRoot":"","sources":["../../src/energy/windOutput.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA8DnE"}
1
+ {"version":3,"file":"windOutput.d.ts","sourceRoot":"","sources":["../../src/energy/windOutput.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAuEnE"}
@@ -18,6 +18,14 @@ import { roundTo } from '../utils.js';
18
18
  */
19
19
  export function windOutput(input) {
20
20
  const { ratedPower, hubHeight, averageWindSpeed, referenceHeight = 10, cutInSpeed = 3, cutOutSpeed = 25, ratedSpeed = 12, rotorDiameter, terrainRoughness = 0.143, } = input;
21
+ // The Hellmann power law raises the height ratio to a fractional exponent, so a negative
22
+ // hub height gives a complex wind speed and every downstream figure becomes NaN.
23
+ if (!(hubHeight > 0)) {
24
+ throw new RangeError('hubHeight must be greater than 0');
25
+ }
26
+ if (!(referenceHeight > 0)) {
27
+ throw new RangeError('referenceHeight must be greater than 0');
28
+ }
21
29
  // Wind speed at hub height (Hellmann power law)
22
30
  const adjustedWindSpeed = averageWindSpeed * Math.pow(hubHeight / referenceHeight, terrainRoughness);
23
31
  // Simplified capacity factor estimate using Rayleigh distribution approximation
@@ -1 +1 @@
1
- {"version":3,"file":"windOutput.js","sourceRoot":"","sources":["../../src/energy/windOutput.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"windOutput.js","sourceRoot":"","sources":["../../src/energy/windOutput.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"esgSummary.d.ts","sourceRoot":"","sources":["../../src/environmental/esgSummary.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA6CnE"}
1
+ {"version":3,"file":"esgSummary.d.ts","sourceRoot":"","sources":["../../src/environmental/esgSummary.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAmDnE"}
@@ -9,6 +9,11 @@ import { roundTo } from '../utils.js';
9
9
  */
10
10
  export function esgSummary(input) {
11
11
  const { baselineYear, baselineCo2Tonnes, currentYear, currentCo2Tonnes, targetYear, targetCo2Tonnes, } = input;
12
+ // The reduction is expressed as a share of the baseline, so a zero baseline has no
13
+ // percentage to report rather than an infinite one.
14
+ if (!(baselineCo2Tonnes > 0)) {
15
+ throw new RangeError('baselineCo2Tonnes must be greater than 0');
16
+ }
12
17
  const reductionTonnes = roundTo(baselineCo2Tonnes - currentCo2Tonnes, 2);
13
18
  const reductionPercent = roundTo((reductionTonnes / baselineCo2Tonnes) * 100, 2);
14
19
  const yearsElapsed = currentYear - baselineYear;
@@ -1 +1 @@
1
- {"version":3,"file":"esgSummary.js","sourceRoot":"","sources":["../../src/environmental/esgSummary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EACJ,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,eAAe,GAChB,GAAG,KAAK,CAAC;IAEV,MAAM,eAAe,GAAG,OAAO,CAAC,iBAAiB,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,eAAe,GAAG,iBAAiB,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAEjF,MAAM,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;IAChD,MAAM,iBAAiB,GAAG,YAAY,GAAG,CAAC;QACxC,CAAC,CAAC,OAAO,CAAC,gBAAgB,GAAG,YAAY,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;IAEhD,iDAAiD;IACjD,MAAM,wBAAwB,GAAG,gBAAgB,GAAG,eAAe,CAAC;IACpE,MAAM,yBAAyB,GAAG,CAAC,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,GAAG,CAAC;IACvF,MAAM,kBAAkB,GAAG,cAAc,GAAG,CAAC;QAC3C,CAAC,CAAC,OAAO,CAAC,yBAAyB,GAAG,cAAc,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC,CAAC;IAEN,uCAAuC;IACvC,MAAM,eAAe,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,kBAAkB,GAAG,OAAO,CAChC,gBAAgB,GAAG,CAAC,eAAe,GAAG,cAAc,CAAC,EACrD,CAAC,CACF,CAAC;IAEF,MAAM,OAAO,GAAG,iBAAiB,IAAI,kBAAkB,IAAI,gBAAgB,IAAI,eAAe,CAAC;IAE/F,OAAO;QACL,gBAAgB;QAChB,eAAe;QACf,iBAAiB;QACjB,kBAAkB;QAClB,OAAO;QACP,cAAc;QACd,kBAAkB;KACnB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"esgSummary.js","sourceRoot":"","sources":["../../src/environmental/esgSummary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EACJ,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,eAAe,GAChB,GAAG,KAAK,CAAC;IAEV,mFAAmF;IACnF,oDAAoD;IACpD,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC,0CAA0C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,iBAAiB,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,eAAe,GAAG,iBAAiB,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAEjF,MAAM,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;IAChD,MAAM,iBAAiB,GAAG,YAAY,GAAG,CAAC;QACxC,CAAC,CAAC,OAAO,CAAC,gBAAgB,GAAG,YAAY,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;IAEhD,iDAAiD;IACjD,MAAM,wBAAwB,GAAG,gBAAgB,GAAG,eAAe,CAAC;IACpE,MAAM,yBAAyB,GAAG,CAAC,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,GAAG,CAAC;IACvF,MAAM,kBAAkB,GAAG,cAAc,GAAG,CAAC;QAC3C,CAAC,CAAC,OAAO,CAAC,yBAAyB,GAAG,cAAc,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC,CAAC;IAEN,uCAAuC;IACvC,MAAM,eAAe,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,kBAAkB,GAAG,OAAO,CAChC,gBAAgB,GAAG,CAAC,eAAe,GAAG,cAAc,CAAC,EACrD,CAAC,CACF,CAAC;IAEF,MAAM,OAAO,GAAG,iBAAiB,IAAI,kBAAkB,IAAI,gBAAgB,IAAI,eAAe,CAAC;IAE/F,OAAO;QACL,gBAAgB;QAChB,eAAe;QACf,iBAAiB;QACjB,kBAAkB;QAClB,OAAO;QACP,cAAc;QACd,kBAAkB;KACnB,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"safetyStock.d.ts","sourceRoot":"","sources":["../../src/logistics/safetyStock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CA2BtE"}
1
+ {"version":3,"file":"safetyStock.d.ts","sourceRoot":"","sources":["../../src/logistics/safetyStock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAiCtE"}
@@ -23,6 +23,11 @@ import { normalInvCDF } from '../math.js';
23
23
  */
24
24
  export function safetyStock(input) {
25
25
  const { avgDemand, demandStdDev, avgLeadTime, leadTimeStdDev, serviceLevel } = input;
26
+ // The z-score is the inverse normal CDF of the service level, which diverges at both
27
+ // ends: a level of 0 or 1 has no finite z and the whole result follows it to infinity.
28
+ if (!(serviceLevel > 0) || serviceLevel >= 1) {
29
+ throw new RangeError('serviceLevel must be greater than 0 and less than 1');
30
+ }
26
31
  // Calculate z-score for the desired service level
27
32
  const zScore = normalInvCDF(serviceLevel);
28
33
  // Average demand during lead time
@@ -1 +1 @@
1
- {"version":3,"file":"safetyStock.js","sourceRoot":"","sources":["../../src/logistics/safetyStock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAErF,kDAAkD;IAClD,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE1C,kCAAkC;IAClC,MAAM,oBAAoB,GAAG,SAAS,GAAG,WAAW,CAAC;IAErD,uDAAuD;IACvD,sCAAsC;IACtC,MAAM,cAAc,GAAG,WAAW,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC,CAAC;IAEhE,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,CAAC;IAE7C,8CAA8C;IAC9C,MAAM,YAAY,GAAG,oBAAoB,GAAG,gBAAgB,CAAC;IAE7D,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1B,WAAW,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"safetyStock.js","sourceRoot":"","sources":["../../src/logistics/safetyStock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAErF,qFAAqF;IACrF,uFAAuF;IACvF,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,qDAAqD,CAAC,CAAC;IAC9E,CAAC;IAED,kDAAkD;IAClD,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE1C,kCAAkC;IAClC,MAAM,oBAAoB,GAAG,SAAS,GAAG,WAAW,CAAC;IAErD,uDAAuD;IACvD,sCAAsC;IACtC,MAAM,cAAc,GAAG,WAAW,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC,CAAC;IAEhE,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,CAAC;IAE7C,8CAA8C;IAC9C,MAAM,YAAY,GAAG,oBAAoB,GAAG,gBAAgB,CAAC;IAE7D,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1B,WAAW,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"boltCircle.d.ts","sourceRoot":"","sources":["../../src/machining/boltCircle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAY,MAAM,YAAY,CAAC;AAE9E;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAuBnE"}
1
+ {"version":3,"file":"boltCircle.d.ts","sourceRoot":"","sources":["../../src/machining/boltCircle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAY,MAAM,YAAY,CAAC;AAE9E;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA8BnE"}
@@ -14,6 +14,12 @@ import { roundTo } from '../utils.js';
14
14
  */
15
15
  export function boltCircle(input) {
16
16
  const { boltCircleDiameter, numberOfHoles, startAngle = 0 } = input;
17
+ if (!(boltCircleDiameter > 0)) {
18
+ throw new RangeError('boltCircleDiameter must be greater than 0');
19
+ }
20
+ if (!Number.isInteger(numberOfHoles) || numberOfHoles < 1) {
21
+ throw new RangeError('numberOfHoles must be an integer of at least 1');
22
+ }
17
23
  const radius = boltCircleDiameter / 2;
18
24
  const angularSpacing = 360 / numberOfHoles;
19
25
  const holes = [];
@@ -1 +1 @@
1
- {"version":3,"file":"boltCircle.js","sourceRoot":"","sources":["../../src/machining/boltCircle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;IAEpE,MAAM,MAAM,GAAG,kBAAkB,GAAG,CAAC,CAAC;IACtC,MAAM,cAAc,GAAG,GAAG,GAAG,aAAa,CAAC;IAE3C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAC,GAAG,cAAc,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,CAAC,GAAG,CAAC;YACjB,KAAK,EAAE,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;YACjC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1C,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1B,KAAK;QACL,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"boltCircle.js","sourceRoot":"","sources":["../../src/machining/boltCircle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;IAEpE,IAAI,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,UAAU,CAAC,gDAAgD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,GAAG,CAAC,CAAC;IACtC,MAAM,cAAc,GAAG,GAAG,GAAG,aAAa,CAAC;IAE3C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAC,GAAG,cAAc,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,CAAC,GAAG,CAAC;YACjB,KAAK,EAAE,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;YACjC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1C,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1B,KAAK;QACL,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC"}
@@ -10,6 +10,9 @@ import type { CuspHeightInput, CuspHeightResult } from './types.js';
10
10
  *
11
11
  * @param input - Cusp height parameters
12
12
  * @returns CuspHeightResult with scallop height and approximate Ra
13
+ * @throws RangeError if toolRadius or stepover is not positive, or if stepover exceeds the
14
+ * tool diameter (adjacent passes never meet, so the formula has no scallop to describe —
15
+ * without the guard the square root goes negative and the result is silently NaN)
13
16
  */
14
17
  export declare function cuspHeight(input: CuspHeightInput): CuspHeightResult;
15
18
  //# sourceMappingURL=cuspHeight.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cuspHeight.d.ts","sourceRoot":"","sources":["../../src/machining/cuspHeight.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAUnE"}
1
+ {"version":3,"file":"cuspHeight.d.ts","sourceRoot":"","sources":["../../src/machining/cuspHeight.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAoBnE"}
@@ -10,9 +10,21 @@ import { roundTo } from '../utils.js';
10
10
  *
11
11
  * @param input - Cusp height parameters
12
12
  * @returns CuspHeightResult with scallop height and approximate Ra
13
+ * @throws RangeError if toolRadius or stepover is not positive, or if stepover exceeds the
14
+ * tool diameter (adjacent passes never meet, so the formula has no scallop to describe —
15
+ * without the guard the square root goes negative and the result is silently NaN)
13
16
  */
14
17
  export function cuspHeight(input) {
15
18
  const { toolRadius, stepover } = input;
19
+ if (!(toolRadius > 0)) {
20
+ throw new RangeError('toolRadius must be greater than 0');
21
+ }
22
+ if (!(stepover > 0)) {
23
+ throw new RangeError('stepover must be greater than 0');
24
+ }
25
+ if (stepover > 2 * toolRadius) {
26
+ throw new RangeError('stepover must not exceed the tool diameter (2 x toolRadius)');
27
+ }
16
28
  const halfStep = stepover / 2;
17
29
  const h = toolRadius - Math.sqrt(toolRadius * toolRadius - halfStep * halfStep);
18
30
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"cuspHeight.js","sourceRoot":"","sources":["../../src/machining/cuspHeight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEvC,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;IAEhF,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QACzB,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,iCAAiC;KAChF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cuspHeight.js","sourceRoot":"","sources":["../../src/machining/cuspHeight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEvC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,QAAQ,GAAG,CAAC,GAAG,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,UAAU,CAAC,6DAA6D,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;IAEhF,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QACzB,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,iCAAiC;KAChF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"radialChipThinning.d.ts","sourceRoot":"","sources":["../../src/machining/radialChipThinning.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEpF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAe3F"}
1
+ {"version":3,"file":"radialChipThinning.d.ts","sourceRoot":"","sources":["../../src/machining/radialChipThinning.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEpF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAyB3F"}
@@ -16,6 +16,15 @@ import { roundTo } from '../utils.js';
16
16
  */
17
17
  export function radialChipThinning(input) {
18
18
  const { toolDiameter, radialDepthOfCut, chipLoadTarget } = input;
19
+ // The thinning factor divides by sqrt(ae x (D - ae)); outside 0 < ae < D that radicand
20
+ // is zero or negative, which is a cut the geometry does not describe rather than an
21
+ // infinitely thinned chip.
22
+ if (!(toolDiameter > 0)) {
23
+ throw new RangeError('toolDiameter must be greater than 0');
24
+ }
25
+ if (!(radialDepthOfCut > 0) || radialDepthOfCut >= toolDiameter) {
26
+ throw new RangeError('radialDepthOfCut must be greater than 0 and less than toolDiameter');
27
+ }
19
28
  const D = toolDiameter;
20
29
  const ae = radialDepthOfCut;
21
30
  // Factor = D / (2 × √(ae × (D - ae)))
@@ -1 +1 @@
1
- {"version":3,"file":"radialChipThinning.js","sourceRoot":"","sources":["../../src/machining/radialChipThinning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAEjE,MAAM,CAAC,GAAG,YAAY,CAAC;IACvB,MAAM,EAAE,GAAG,gBAAgB,CAAC;IAE5B,sCAAsC;IACtC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,cAAc,GAAG,MAAM,CAAC;IAE3C,OAAO;QACL,oBAAoB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5C,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtC,iBAAiB,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"radialChipThinning.js","sourceRoot":"","sources":["../../src/machining/radialChipThinning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAEjE,uFAAuF;IACvF,oFAAoF;IACpF,2BAA2B;IAC3B,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,IAAI,gBAAgB,IAAI,YAAY,EAAE,CAAC;QAChE,MAAM,IAAI,UAAU,CAAC,oEAAoE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,CAAC,GAAG,YAAY,CAAC;IACvB,MAAM,EAAE,GAAG,gBAAgB,CAAC;IAE5B,sCAAsC;IACtC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,cAAc,GAAG,MAAM,CAAC;IAE3C,OAAO;QACL,oBAAoB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5C,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtC,iBAAiB,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"triangleSolver.d.ts","sourceRoot":"","sources":["../../src/machining/triangleSolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAK5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CA2F/E"}
1
+ {"version":3,"file":"triangleSolver.d.ts","sourceRoot":"","sources":["../../src/machining/triangleSolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAK5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAwG/E"}
@@ -22,6 +22,18 @@ const RAD = 180 / Math.PI;
22
22
  */
23
23
  export function triangleSolver(input) {
24
24
  let { a, b, c, A, B, C } = input;
25
+ // A side of zero collapses the law of cosines onto a zero denominator and every angle
26
+ // comes back NaN; an angle outside (0, 180) is not an angle of a triangle at all.
27
+ for (const [name, side] of [['a', a], ['b', b], ['c', c]]) {
28
+ if (side !== undefined && !(side > 0)) {
29
+ throw new RangeError(`side ${name} must be greater than 0`);
30
+ }
31
+ }
32
+ for (const [name, angle] of [['A', A], ['B', B], ['C', C]]) {
33
+ if (angle !== undefined && (!(angle > 0) || angle >= 180)) {
34
+ throw new RangeError(`angle ${name} must be greater than 0 and less than 180`);
35
+ }
36
+ }
25
37
  // Count known values
26
38
  const knownSides = [a, b, c].filter(v => v !== undefined).length;
27
39
  const knownAngles = [A, B, C].filter(v => v !== undefined).length;
@@ -1 +1 @@
1
- {"version":3,"file":"triangleSolver.js","sourceRoot":"","sources":["../../src/machining/triangleSolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"triangleSolver.js","sourceRoot":"","sources":["../../src/machining/triangleSolver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"kFactorReverse.d.ts","sourceRoot":"","sources":["../../src/metal/kFactorReverse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvG;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAkC/E;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,EAC1B,wBAAwB,SAAO,GAC9B,yBAAyB,CAa3B"}
1
+ {"version":3,"file":"kFactorReverse.d.ts","sourceRoot":"","sources":["../../src/metal/kFactorReverse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvG;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CA2C/E;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,EAC1B,wBAAwB,SAAO,GAC9B,yBAAyB,CAa3B"}
@@ -17,6 +17,14 @@ import { propagate } from '../math.js';
17
17
  */
18
18
  export function kFactorReverse(input) {
19
19
  const { thickness, bendAngle, insideRadius, measuredFlatLength, legA, legB, } = input;
20
+ // The K-factor divides by the bend angle in radians and again by the thickness, so a
21
+ // zero in either place yields an infinite K rather than a sheet that cannot be bent.
22
+ if (!(thickness > 0)) {
23
+ throw new RangeError('thickness must be greater than 0');
24
+ }
25
+ if (!(bendAngle > 0) || bendAngle >= 180) {
26
+ throw new RangeError('bendAngle must be greater than 0 and less than 180');
27
+ }
20
28
  // Convert bend angle to radians
21
29
  const bendAngleRad = (bendAngle * Math.PI) / 180;
22
30
  // Calculate bend deduction from measured data
@@ -1 +1 @@
1
- {"version":3,"file":"kFactorReverse.js","sourceRoot":"","sources":["../../src/metal/kFactorReverse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,EACJ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,IAAI,EACJ,IAAI,GACL,GAAG,KAAK,CAAC;IAEV,gCAAgC;IAChC,MAAM,YAAY,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAEjD,8CAA8C;IAC9C,qDAAqD;IACrD,2CAA2C;IAC3C,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,kBAAkB,CAAC;IAE5C,mCAAmC;IACnC,MAAM,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEjE,4CAA4C;IAC5C,2CAA2C;IAC3C,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;IAEzB,qCAAqC;IACrC,iDAAiD;IACjD,oDAAoD;IACpD,MAAM,OAAO,GAAG,CAAC,EAAE,GAAG,YAAY,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC;IAE/D,OAAO;QACL,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAA0B,EAC1B,wBAAwB,GAAG,IAAI;IAE/B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CACnC,KAAK,EACL;QACE,kBAAkB,EAAE,wBAAwB;QAC5C,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,wBAAwB;QAC9B,YAAY,EAAE,wBAAwB;KACvC,EACD,cAAc,EACd,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAC3B,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"kFactorReverse.js","sourceRoot":"","sources":["../../src/metal/kFactorReverse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,EACJ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,IAAI,EACJ,IAAI,GACL,GAAG,KAAK,CAAC;IAEV,qFAAqF;IACrF,qFAAqF;IACrF,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;QACzC,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAC;IAC7E,CAAC;IAED,gCAAgC;IAChC,MAAM,YAAY,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAEjD,8CAA8C;IAC9C,qDAAqD;IACrD,2CAA2C;IAC3C,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,kBAAkB,CAAC;IAE5C,mCAAmC;IACnC,MAAM,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEjE,4CAA4C;IAC5C,2CAA2C;IAC3C,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;IAEzB,qCAAqC;IACrC,iDAAiD;IACjD,oDAAoD;IACpD,MAAM,OAAO,GAAG,CAAC,EAAE,GAAG,YAAY,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC;IAE/D,OAAO;QACL,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAA0B,EAC1B,wBAAwB,GAAG,IAAI;IAE/B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CACnC,KAAK,EACL;QACE,kBAAkB,EAAE,wBAAwB;QAC5C,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,wBAAwB;QAC9B,YAAY,EAAE,wBAAwB;KACvC,EACD,cAAc,EACd,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAC3B,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAC9D,CAAC"}
@@ -6,6 +6,26 @@ import type { MtbfInput, MtbfResult } from './types.js';
6
6
  * MTTR = Total Repair Time / Number of Failures
7
7
  * Availability = MTBF / (MTBF + MTTR)
8
8
  *
9
+ * Each output maps to a defined term:
10
+ * - `mtbf` — "average of the times between failures" (EN 13306:2017, 11.3). Note that a
11
+ * time between failures (9.18) is the duration between consecutive failures and "may
12
+ * include non-operating time after restoration"; when the input is operating time, as
13
+ * here, the quantity computed is strictly the mean operating time between failures
14
+ * (MOTBF, 11.2 — "average of the operating times between failures", applied to
15
+ * repairable items). Industry practice calls this figure MTBF, and the name is kept for
16
+ * that reason.
17
+ * - `mttr` — mean repair time (MRT, 11.4: "average of the repair times"). MTTR is the
18
+ * common industry spelling of the same average.
19
+ * - `availability` — the time-based availability ratio of 4.9: up time over total time
20
+ * (UT / (UT + DT)), expressed as a percentage.
21
+ * - `failureRate`, `reliabilityAtMtbf` — the constant-failure-rate (exponential) model,
22
+ * lambda = 1 / MTBF and R(t) = exp(-lambda·t). Not part of the terminology standard;
23
+ * it holds only during a constant failure period, and R(MTBF) = e^-1 always.
24
+ *
25
+ * @reference EN 13306:2017 — Maintenance terminology. 11.3 (mean time between failures),
26
+ * 11.2 (mean operating time between failures), 11.4 (mean repair time), 9.18 (time
27
+ * between failures), 4.9 (time based availability).
28
+ *
9
29
  * @param input - MTBF input parameters
10
30
  * @returns MTBF analysis result
11
31
  * @throws RangeError if totalOperatingTime is not positive, or if
@@ -1 +1 @@
1
- {"version":3,"file":"mtbf.d.ts","sourceRoot":"","sources":["../../src/quality/mtbf.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAoCjD"}
1
+ {"version":3,"file":"mtbf.d.ts","sourceRoot":"","sources":["../../src/quality/mtbf.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CA8CjD"}
@@ -6,6 +6,26 @@ import { roundTo } from '../utils.js';
6
6
  * MTTR = Total Repair Time / Number of Failures
7
7
  * Availability = MTBF / (MTBF + MTTR)
8
8
  *
9
+ * Each output maps to a defined term:
10
+ * - `mtbf` — "average of the times between failures" (EN 13306:2017, 11.3). Note that a
11
+ * time between failures (9.18) is the duration between consecutive failures and "may
12
+ * include non-operating time after restoration"; when the input is operating time, as
13
+ * here, the quantity computed is strictly the mean operating time between failures
14
+ * (MOTBF, 11.2 — "average of the operating times between failures", applied to
15
+ * repairable items). Industry practice calls this figure MTBF, and the name is kept for
16
+ * that reason.
17
+ * - `mttr` — mean repair time (MRT, 11.4: "average of the repair times"). MTTR is the
18
+ * common industry spelling of the same average.
19
+ * - `availability` — the time-based availability ratio of 4.9: up time over total time
20
+ * (UT / (UT + DT)), expressed as a percentage.
21
+ * - `failureRate`, `reliabilityAtMtbf` — the constant-failure-rate (exponential) model,
22
+ * lambda = 1 / MTBF and R(t) = exp(-lambda·t). Not part of the terminology standard;
23
+ * it holds only during a constant failure period, and R(MTBF) = e^-1 always.
24
+ *
25
+ * @reference EN 13306:2017 — Maintenance terminology. 11.3 (mean time between failures),
26
+ * 11.2 (mean operating time between failures), 11.4 (mean repair time), 9.18 (time
27
+ * between failures), 4.9 (time based availability).
28
+ *
9
29
  * @param input - MTBF input parameters
10
30
  * @returns MTBF analysis result
11
31
  * @throws RangeError if totalOperatingTime is not positive, or if
@@ -20,19 +40,28 @@ export function mtbf(input) {
20
40
  if (numberOfFailures <= 0) {
21
41
  throw new RangeError('numberOfFailures must be greater than 0');
22
42
  }
43
+ if (totalRepairTime < 0) {
44
+ throw new RangeError('totalRepairTime must not be negative');
45
+ }
46
+ // Every derived figure below is computed from the raw times, never from the rounded
47
+ // values reported back. Rounding an intermediate to 2 decimals and then dividing by it
48
+ // is not a rounding whisker: with short times spread over many failures the rounded
49
+ // mean is a large fraction of its own value, and availability drifts by whole points
50
+ // (1 h operating / 0.5 h repair / 34 failures reads 75% that way, against a true 66.67%).
51
+ const mtbfExact = totalOperatingTime / numberOfFailures;
52
+ const mttrExact = totalRepairTime / numberOfFailures;
23
53
  // MTBF = Total Operating Time / Number of Failures
24
- const mtbfValue = roundTo(totalOperatingTime / numberOfFailures, 2);
54
+ const mtbfValue = roundTo(mtbfExact, 2);
25
55
  // MTTR = Total Repair Time / Number of Failures
26
- const mttr = numberOfFailures > 0 ? roundTo(totalRepairTime / numberOfFailures, 2) : 0;
27
- // Availability = MTBF / (MTBF + MTTR)
28
- const availability = mtbfValue + mttr > 0
29
- ? roundTo((mtbfValue / (mtbfValue + mttr)) * 100, 2)
30
- : 0;
56
+ const mttr = roundTo(mttrExact, 2);
57
+ // Availability = MTBF / (MTBF + MTTR). The failure count cancels, leaving the 4.9
58
+ // time-based ratio of up time to total time.
59
+ const availability = roundTo((totalOperatingTime / (totalOperatingTime + totalRepairTime)) * 100, 2);
31
60
  // Failure rate (lambda) = 1 / MTBF
32
- const failureRate = mtbfValue > 0 ? roundTo(1 / mtbfValue, 6) : 0;
61
+ const failureRate = roundTo(1 / mtbfExact, 6);
33
62
  // Reliability at time T = e^(-lambda * T), where T = MTBF
34
- // R(MTBF) = e^(-1) = 0.3679 = 36.79%
35
- const reliabilityAtMtbf = mtbfValue > 0 ? roundTo(Math.exp(-1) * 100, 2) : 0;
63
+ // R(MTBF) = e^(-1) = 0.3679 = 36.79%, whatever the MTBF is
64
+ const reliabilityAtMtbf = roundTo(Math.exp(-1) * 100, 2);
36
65
  return {
37
66
  mtbf: mtbfValue,
38
67
  mttr,
@@ -1 +1 @@
1
- {"version":3,"file":"mtbf.js","sourceRoot":"","sources":["../../src/quality/mtbf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAExE,kBAAkB;IAClB,IAAI,kBAAkB,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,yCAAyC,CAAC,CAAC;IAClE,CAAC;IAED,mDAAmD;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAEpE,gDAAgD;IAChD,MAAM,IAAI,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvF,sCAAsC;IACtC,MAAM,YAAY,GAAG,SAAS,GAAG,IAAI,GAAG,CAAC;QACvC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC,CAAC;IAEN,mCAAmC;IACnC,MAAM,WAAW,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,0DAA0D;IAC1D,qCAAqC;IACrC,MAAM,iBAAiB,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI;QACJ,YAAY;QACZ,WAAW;QACX,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mtbf.js","sourceRoot":"","sources":["../../src/quality/mtbf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAExE,kBAAkB;IAClB,IAAI,kBAAkB,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,yCAAyC,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,sCAAsC,CAAC,CAAC;IAC/D,CAAC;IAED,oFAAoF;IACpF,uFAAuF;IACvF,oFAAoF;IACpF,qFAAqF;IACrF,0FAA0F;IAC1F,MAAM,SAAS,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;IACxD,MAAM,SAAS,GAAG,eAAe,GAAG,gBAAgB,CAAC;IAErD,mDAAmD;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAExC,gDAAgD;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAEnC,kFAAkF;IAClF,6CAA6C;IAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,kBAAkB,GAAG,CAAC,kBAAkB,GAAG,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAErG,mCAAmC;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;IAE9C,0DAA0D;IAC1D,2DAA2D;IAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAEzD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI;QACJ,YAAY;QACZ,WAAW;QACX,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"illuminance.d.ts","sourceRoot":"","sources":["../../src/safety/illuminance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAStC,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAsD,CAAC;AAiB5G;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CA8DtE"}
1
+ {"version":3,"file":"illuminance.d.ts","sourceRoot":"","sources":["../../src/safety/illuminance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAStC,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAsD,CAAC;AAiB5G;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAwEtE"}
@@ -47,6 +47,9 @@ export function illuminance(input) {
47
47
  if (roomLength <= 0 || roomWidth <= 0 || lumensPerLuminaire <= 0 || targetLux <= 0) {
48
48
  throw new RangeError('roomLength, roomWidth, lumensPerLuminaire, and targetLux must all be greater than 0');
49
49
  }
50
+ if (!(mf > 0)) {
51
+ throw new RangeError('mf (maintenance factor) must be greater than 0');
52
+ }
50
53
  const area = roomLength * roomWidth;
51
54
  const hm = luminaireHeight - workplaneHeight;
52
55
  if (hm <= 0) {
@@ -60,6 +63,11 @@ export function illuminance(input) {
60
63
  // the caller can tell the user the CU is a boundary approximation rather than a table value.
61
64
  const cu = cuOverride ?? lookupCU(roomIndex);
62
65
  const roomIndexClamped = cuOverride === undefined && (roomIndex < CU_TABLE_RANGE[0] || roomIndex > CU_TABLE_RANGE[1]);
66
+ // The luminaire count divides by CU x MF; a zero coefficient of utilization means no
67
+ // light reaches the workplane, which is not a fixture count.
68
+ if (!(cu > 0)) {
69
+ throw new RangeError('cu (coefficient of utilization) must be greater than 0');
70
+ }
63
71
  // Number of luminaires: N = (E × A) / (Φ × CU × MF)
64
72
  const nExact = (targetLux * area) / (lumensPerLuminaire * cu * mf);
65
73
  const fixturesNeeded = Math.ceil(nExact);
@@ -1 +1 @@
1
- {"version":3,"file":"illuminance.js","sourceRoot":"","sources":["../../src/safety/illuminance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"illuminance.js","sourceRoot":"","sources":["../../src/safety/illuminance.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "formulab",
3
- "version": "0.37.0",
3
+ "version": "0.38.0",
4
4
  "description": "Manufacturing & Engineering calculation formulas library - 203 industrial calculations across 15 domains for OEE, Cpk, SPC, FMEA, Nelson Rules, metal weight, CNC machining, GD&T, battery, environmental, pipe flow, logistics, IE time study, and more",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",