universal-physics-tensor 3.0.0 → 4.0.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 (162) hide show
  1. package/README.md +6 -6
  2. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  3. package/dist/atlas/catalog-formal-ref.js +2 -1
  4. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  5. package/dist/atlas/physjs-ref.d.ts +28 -2
  6. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  7. package/dist/atlas/physjs-ref.js +176 -7
  8. package/dist/atlas/physjs-ref.js.map +1 -1
  9. package/dist/bridges/be70-einstein-relation.d.ts +1 -1
  10. package/dist/bridges/be70-einstein-relation.d.ts.map +1 -1
  11. package/dist/bridges/be70-einstein-relation.js +5 -1
  12. package/dist/bridges/be70-einstein-relation.js.map +1 -1
  13. package/dist/bridges/be74-magnetic-pressure.d.ts +27 -0
  14. package/dist/bridges/be74-magnetic-pressure.d.ts.map +1 -0
  15. package/dist/bridges/be74-magnetic-pressure.js +29 -0
  16. package/dist/bridges/be74-magnetic-pressure.js.map +1 -0
  17. package/dist/bridges/be75-london-penetration.d.ts +27 -0
  18. package/dist/bridges/be75-london-penetration.d.ts.map +1 -0
  19. package/dist/bridges/be75-london-penetration.js +31 -0
  20. package/dist/bridges/be75-london-penetration.js.map +1 -0
  21. package/dist/bridges/be76-plasma-beta.d.ts +32 -0
  22. package/dist/bridges/be76-plasma-beta.d.ts.map +1 -0
  23. package/dist/bridges/be76-plasma-beta.js +34 -0
  24. package/dist/bridges/be76-plasma-beta.js.map +1 -0
  25. package/dist/bridges/be77-hagen-poiseuille.d.ts +50 -0
  26. package/dist/bridges/be77-hagen-poiseuille.d.ts.map +1 -0
  27. package/dist/bridges/be77-hagen-poiseuille.js +39 -0
  28. package/dist/bridges/be77-hagen-poiseuille.js.map +1 -0
  29. package/dist/bridges/be78-euler-buckling.d.ts +44 -0
  30. package/dist/bridges/be78-euler-buckling.d.ts.map +1 -0
  31. package/dist/bridges/be78-euler-buckling.js +33 -0
  32. package/dist/bridges/be78-euler-buckling.js.map +1 -0
  33. package/dist/bridges/be79-pull-in.d.ts +33 -0
  34. package/dist/bridges/be79-pull-in.d.ts.map +1 -0
  35. package/dist/bridges/be79-pull-in.js +35 -0
  36. package/dist/bridges/be79-pull-in.js.map +1 -0
  37. package/dist/bridges/be80-mott-gurney.d.ts +52 -0
  38. package/dist/bridges/be80-mott-gurney.d.ts.map +1 -0
  39. package/dist/bridges/be80-mott-gurney.js +38 -0
  40. package/dist/bridges/be80-mott-gurney.js.map +1 -0
  41. package/dist/bridges/be81-child-langmuir.d.ts +33 -0
  42. package/dist/bridges/be81-child-langmuir.d.ts.map +1 -0
  43. package/dist/bridges/be81-child-langmuir.js +38 -0
  44. package/dist/bridges/be81-child-langmuir.js.map +1 -0
  45. package/dist/bridges/be82-shockley-diode.d.ts +32 -0
  46. package/dist/bridges/be82-shockley-diode.d.ts.map +1 -0
  47. package/dist/bridges/be82-shockley-diode.js +37 -0
  48. package/dist/bridges/be82-shockley-diode.js.map +1 -0
  49. package/dist/bridges/be83-thomson.d.ts +46 -0
  50. package/dist/bridges/be83-thomson.d.ts.map +1 -0
  51. package/dist/bridges/be83-thomson.js +32 -0
  52. package/dist/bridges/be83-thomson.js.map +1 -0
  53. package/dist/bridges/be84-four-point.d.ts +45 -0
  54. package/dist/bridges/be84-four-point.d.ts.map +1 -0
  55. package/dist/bridges/be84-four-point.js +34 -0
  56. package/dist/bridges/be84-four-point.js.map +1 -0
  57. package/dist/bridges/be85-shot-noise.d.ts +30 -0
  58. package/dist/bridges/be85-shot-noise.d.ts.map +1 -0
  59. package/dist/bridges/be85-shot-noise.js +32 -0
  60. package/dist/bridges/be85-shot-noise.js.map +1 -0
  61. package/dist/bridges/be86-reynolds-analogy.d.ts +45 -0
  62. package/dist/bridges/be86-reynolds-analogy.d.ts.map +1 -0
  63. package/dist/bridges/be86-reynolds-analogy.js +30 -0
  64. package/dist/bridges/be86-reynolds-analogy.js.map +1 -0
  65. package/dist/bridges/be87-capacitor-noise.d.ts +27 -0
  66. package/dist/bridges/be87-capacitor-noise.d.ts.map +1 -0
  67. package/dist/bridges/be87-capacitor-noise.js +32 -0
  68. package/dist/bridges/be87-capacitor-noise.js.map +1 -0
  69. package/dist/bridges/bridge-equations.d.ts +28 -0
  70. package/dist/bridges/bridge-equations.d.ts.map +1 -1
  71. package/dist/bridges/bridge-equations.js +28 -0
  72. package/dist/bridges/bridge-equations.js.map +1 -1
  73. package/dist/bridges/evaluators.d.ts.map +1 -1
  74. package/dist/bridges/evaluators.js +72 -2
  75. package/dist/bridges/evaluators.js.map +1 -1
  76. package/dist/bridges/index.d.ts +31 -3
  77. package/dist/bridges/index.d.ts.map +1 -1
  78. package/dist/bridges/index.js +311 -3
  79. package/dist/bridges/index.js.map +1 -1
  80. package/dist/cases/brownian-sphere.d.ts.map +1 -1
  81. package/dist/cases/brownian-sphere.js +4 -4
  82. package/dist/cases/brownian-sphere.js.map +1 -1
  83. package/dist/cases/lumped-cooling.d.ts.map +1 -1
  84. package/dist/cases/lumped-cooling.js +2 -2
  85. package/dist/cases/lumped-cooling.js.map +1 -1
  86. package/dist/cases/resistor-noise.d.ts.map +1 -1
  87. package/dist/cases/resistor-noise.js +2 -2
  88. package/dist/cases/resistor-noise.js.map +1 -1
  89. package/dist/cases/skin-depth.d.ts.map +1 -1
  90. package/dist/cases/skin-depth.js +2 -2
  91. package/dist/cases/skin-depth.js.map +1 -1
  92. package/dist/cases/types.d.ts +11 -1
  93. package/dist/cases/types.d.ts.map +1 -1
  94. package/dist/cases/types.js +9 -0
  95. package/dist/cases/types.js.map +1 -1
  96. package/dist/cli/closed-form-range.d.ts +1 -1
  97. package/dist/cli/closed-form-range.js +1 -1
  98. package/dist/cli/commands/audit.d.ts.map +1 -1
  99. package/dist/cli/commands/audit.js +22 -4
  100. package/dist/cli/commands/audit.js.map +1 -1
  101. package/dist/cli/commands/search.js +2 -2
  102. package/dist/cli/commands/search.js.map +1 -1
  103. package/dist/cli/search-index.d.ts +4 -2
  104. package/dist/cli/search-index.d.ts.map +1 -1
  105. package/dist/cli/search-index.js +38 -3
  106. package/dist/cli/search-index.js.map +1 -1
  107. package/dist/cli/statuses.d.ts.map +1 -1
  108. package/dist/cli/statuses.js +7 -0
  109. package/dist/cli/statuses.js.map +1 -1
  110. package/dist/composition/bridge-analysis.d.ts +14 -2
  111. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  112. package/dist/composition/bridge-analysis.js +43 -6
  113. package/dist/composition/bridge-analysis.js.map +1 -1
  114. package/dist/composition/canonical-graph.d.ts +7 -6
  115. package/dist/composition/canonical-graph.d.ts.map +1 -1
  116. package/dist/composition/canonical-graph.js +13 -9
  117. package/dist/composition/canonical-graph.js.map +1 -1
  118. package/dist/composition/canonical-prefactors.d.ts +4 -2
  119. package/dist/composition/canonical-prefactors.d.ts.map +1 -1
  120. package/dist/composition/canonical-prefactors.js +46 -2
  121. package/dist/composition/canonical-prefactors.js.map +1 -1
  122. package/dist/composition/catalog-graph.d.ts +3 -3
  123. package/dist/composition/catalog-graph.js +3 -3
  124. package/dist/composition/edge.d.ts +10 -2
  125. package/dist/composition/edge.d.ts.map +1 -1
  126. package/dist/composition/edge.js +62 -2
  127. package/dist/composition/edge.js.map +1 -1
  128. package/dist/composition/edges/applied-physicist.d.ts +100 -2
  129. package/dist/composition/edges/applied-physicist.d.ts.map +1 -1
  130. package/dist/composition/edges/applied-physicist.js +528 -20
  131. package/dist/composition/edges/applied-physicist.js.map +1 -1
  132. package/dist/composition/explain.d.ts.map +1 -1
  133. package/dist/composition/explain.js +70 -5
  134. package/dist/composition/explain.js.map +1 -1
  135. package/dist/composition/formula-shape.d.ts +22 -0
  136. package/dist/composition/formula-shape.d.ts.map +1 -0
  137. package/dist/composition/formula-shape.js +124 -0
  138. package/dist/composition/formula-shape.js.map +1 -0
  139. package/dist/composition/index.d.ts +2 -2
  140. package/dist/composition/index.d.ts.map +1 -1
  141. package/dist/composition/index.js +2 -2
  142. package/dist/composition/index.js.map +1 -1
  143. package/dist/composition/quantities/applied-physicist.d.ts +91 -1
  144. package/dist/composition/quantities/applied-physicist.d.ts.map +1 -1
  145. package/dist/composition/quantities/applied-physicist.js +331 -1
  146. package/dist/composition/quantities/applied-physicist.js.map +1 -1
  147. package/dist/dimensional/bridge-check.d.ts +1 -1
  148. package/dist/dimensional/bridge-check.d.ts.map +1 -1
  149. package/dist/dimensional/bridge-check.js +15 -1
  150. package/dist/dimensional/bridge-check.js.map +1 -1
  151. package/dist/dimensional/buckingham.d.ts +7 -0
  152. package/dist/dimensional/buckingham.d.ts.map +1 -1
  153. package/dist/dimensional/buckingham.js +4 -0
  154. package/dist/dimensional/buckingham.js.map +1 -1
  155. package/dist/dimensional/units.d.ts.map +1 -1
  156. package/dist/dimensional/units.js +3 -0
  157. package/dist/dimensional/units.js.map +1 -1
  158. package/dist/index.d.ts +2 -2
  159. package/dist/index.d.ts.map +1 -1
  160. package/dist/index.js +2 -2
  161. package/dist/index.js.map +1 -1
  162. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Composition edges for BE-66 through BE-73.
2
+ * Composition edges for BE-66 through BE-76.
3
3
  *
4
4
  * Each edge's endpoints state the same scale and force, so `kind` is
5
5
  * `law`. The overlay `formalRef` is kind `bridge`, so each id is a
@@ -18,9 +18,24 @@ import { evaluateEinsteinRelation } from '../../bridges/be70-einstein-relation.j
18
18
  import { evaluateClapeyron } from '../../bridges/be71-clapeyron.js';
19
19
  import { evaluateGravitationalRedshift } from '../../bridges/be72-gravitational-redshift.js';
20
20
  import { evaluateKelvinPeltier } from '../../bridges/be73-kelvin-peltier.js';
21
+ import { evaluateMagneticPressure } from '../../bridges/be74-magnetic-pressure.js';
22
+ import { evaluateLondonPenetration } from '../../bridges/be75-london-penetration.js';
23
+ import { evaluatePlasmaBeta } from '../../bridges/be76-plasma-beta.js';
24
+ import { evaluateHagenPoiseuille } from '../../bridges/be77-hagen-poiseuille.js';
25
+ import { evaluateEulerBuckling } from '../../bridges/be78-euler-buckling.js';
26
+ import { evaluatePullIn } from '../../bridges/be79-pull-in.js';
27
+ import { evaluateMottGurney } from '../../bridges/be80-mott-gurney.js';
28
+ import { evaluateChildLangmuir } from '../../bridges/be81-child-langmuir.js';
29
+ import { evaluateShockleyDiode } from '../../bridges/be82-shockley-diode.js';
30
+ import { evaluateThomsonCoefficient } from '../../bridges/be83-thomson.js';
31
+ import { evaluateFourPointSheet } from '../../bridges/be84-four-point.js';
32
+ import { evaluateShotNoise } from '../../bridges/be85-shot-noise.js';
33
+ import { evaluateReynoldsAnalogy } from '../../bridges/be86-reynolds-analogy.js';
34
+ import { evaluateCapacitorNoise } from '../../bridges/be87-capacitor-noise.js';
21
35
  import { DIMENSIONLESS } from '../../dimensional/types.js';
22
36
  import { CONSTANTS } from '../../dimensional/symbolic-constants.js';
23
- import { alfvenSpeedQ, incidenceAngleQ, magneticFluxDensityQ, metricG00Q, plasmaMassDensityQ, poyntingFluxQ, properTemperatureQ, radiationPressureQ, reflectanceQ, tolmanInvariantQ, soundSpeedQ, fastMagnetosonicSpeedQ, electricalMobilityQ, einsteinTemperatureQ, carrierChargeQ, diffusivityQ, latentHeatQ, clapeyronTemperatureQ, specificVolumeChangeQ, clapeyronSlopeQ, redshiftMetricG00OneQ, redshiftMetricG00TwoQ, gravitationalFrequencyRatioQ, seebeckCoefficientQ, peltierTemperatureQ, peltierCoefficientQ, } from '../quantities.js';
37
+ import { withBoundAliases } from '../edge.js';
38
+ import { alfvenSpeedQ, incidenceAngleQ, magneticFluxDensityQ, metricG00Q, plasmaMassDensityQ, poyntingFluxQ, properTemperatureQ, radiationPressureQ, reflectanceQ, tolmanInvariantQ, soundSpeedQ, fastMagnetosonicSpeedQ, electricalMobilityQ, einsteinTemperatureQ, carrierChargeQ, diffusivityQ, latentHeatQ, clapeyronTemperatureQ, specificVolumeChangeQ, clapeyronSlopeQ, redshiftMetricG00OneQ, redshiftMetricG00TwoQ, gravitationalFrequencyRatioQ, seebeckCoefficientQ, peltierTemperatureQ, peltierCoefficientQ, magneticPressureQ, londonPenetrationDepthQ, plasmaBetaQ, carrierDensityQ, effectiveMassQ, temperatureQ, pipeRadiusQ, pipePressureDropQ, dynamicViscosityQ, pipeLengthQ, poiseuilleFlowQ, youngsModulusQ, areaMomentQ, columnLengthQ, bucklingLoadQ, pullInStiffnessQ, pullInGapQ, pullInAreaQ, pullInVoltageQ, mottPermittivityQ, mottMobilityQ, mottVoltageQ, mottThicknessQ, mottGurneyCurrentQ, childCarrierMassQ, childVoltageQ, childGapQ, childLangmuirCurrentQ, shockleySaturationQ, shockleyVoltageQ, shockleyTemperatureQ, shockleyCurrentQ, thomsonTemperatureQ, seebeckSlopeQ, thomsonCoefficientQ, fourPointVoltageQ, fourPointCurrentQ, sheetResistanceQ, shotCurrentQ, shotNoiseQ, skinFrictionQ, stantonNumberQ, capacitorTemperatureQ, capacitanceQ, capacitorVoltageVarianceQ, } from '../quantities.js';
24
39
  const finite = Number.isFinite;
25
40
  const qsym = (q) => ({ kind: 'symbol', name: q.name, dim: q.dim });
26
41
  const csym = (name) => ({ kind: 'symbol', name, dim: CONSTANTS[name].dim });
@@ -29,6 +44,11 @@ const prod = (...args) => ({ kind: 'op', op: '*', args });
29
44
  const plus = (a, b) => ({ kind: 'op', op: '+', args: [a, b] });
30
45
  const ratio = (num, den) => ({ kind: 'op', op: '/', args: [num, den] });
31
46
  const pow = (base, exp) => ({ kind: 'op', op: '^', args: [base, exp] });
47
+ /** μ0 = 1/(ε0 c²). The same product the Alfvén and magnetosonic formulas use. */
48
+ const mu0 = ratio(lit(1), prod(csym('epsilon_0'), pow(csym('c'), lit(2))));
49
+ /** π as a dimensionless leaf. `piMultipleValue` resolves the name. */
50
+ const pi = { kind: 'symbol', name: 'pi', dim: DIMENSIONLESS };
51
+ const expOf = (arg) => ({ kind: 'transcendental', fn: 'exp', arg });
32
52
  /** P_n = (I/c) (1+R) cos²θ. */
33
53
  const BE66_SYMBOLIC = prod(ratio(qsym(poyntingFluxQ), csym('c')), plus(lit(1), qsym(reflectanceQ)), pow({ kind: 'transcendental', fn: 'cos', arg: qsym(incidenceAngleQ) }, lit(2)));
34
54
  /** μ0 = 1/(ε0 c²). v_A = B / √(μ0 ρ). */
@@ -43,7 +63,7 @@ const BE68_SYMBOLIC = prod(qsym(properTemperatureQ), pow(prod(lit(-1), qsym(metr
43
63
  *
44
64
  * @public
45
65
  */
46
- export const be66Edge = {
66
+ export const be66Edge = withBoundAliases({
47
67
  id: 'be-66',
48
68
  beId: 66,
49
69
  kind: 'law',
@@ -72,7 +92,7 @@ export const be66Edge = {
72
92
  }).P_Pa,
73
93
  symbolic: BE66_SYMBOLIC,
74
94
  citation: 'OpenStax University Physics Volume 2, https://openstax.org/books/university-physics-volume-2/pages/16-4-momentum-and-radiation-pressure (absorber I/c, reflector 2I/c). The (1+R) cos²θ factor is this catalog\'s assembly.',
75
- };
95
+ });
76
96
  /**
77
97
  * BE-67 Alfvén speed: (magnetic-flux-density, plasma-mass-density) →
78
98
  * alfven-speed, `v_A = B / √(μ0 ρ)`. `ρ` is the total mass density.
@@ -81,7 +101,7 @@ export const be66Edge = {
81
101
  *
82
102
  * @public
83
103
  */
84
- export const be67Edge = {
104
+ export const be67Edge = withBoundAliases({
85
105
  id: 'be-67',
86
106
  beId: 67,
87
107
  kind: 'law',
@@ -106,7 +126,7 @@ export const be67Edge = {
106
126
  }).v_m_per_s,
107
127
  symbolic: BE67_SYMBOLIC,
108
128
  citation: 'Alfvén 1942 Nature 150:405. SI form B/√(μ0 ρ); ρ is the total mass density.',
109
- };
129
+ });
110
130
  /**
111
131
  * BE-68 Tolman–Ehrenfest: (proper-temperature, metric-g00) →
112
132
  * tolman-invariant, `T √(−g_00)`. Endpoints share the classical
@@ -115,7 +135,7 @@ export const be67Edge = {
115
135
  *
116
136
  * @public
117
137
  */
118
- export const be68Edge = {
138
+ export const be68Edge = withBoundAliases({
119
139
  id: 'be-68',
120
140
  beId: 68,
121
141
  kind: 'law',
@@ -140,7 +160,7 @@ export const be68Edge = {
140
160
  }).invariant_K,
141
161
  symbolic: BE68_SYMBOLIC,
142
162
  citation: 'Tolman & Ehrenfest 1930 Phys. Rev. 36:1791 (T0 √g_44). Catalog form T √(−g_00).',
143
- };
163
+ });
144
164
  /** |ω/k| = √(c_s² + B²/(μ0 ρ)), with μ0 = 1/(ε0 c²). */
145
165
  const BE69_SYMBOLIC = pow(plus(pow(qsym(soundSpeedQ), lit(2)), ratio(pow(qsym(magneticFluxDensityQ), lit(2)), prod(ratio(lit(1), prod(csym('epsilon_0'), pow(csym('c'), lit(2)))), qsym(plasmaMassDensityQ)))), lit(0.5));
146
166
  /** D = μ k_B T / q. */
@@ -159,7 +179,7 @@ const BE73_SYMBOLIC = prod(qsym(seebeckCoefficientQ), qsym(peltierTemperatureQ))
159
179
  *
160
180
  * @public
161
181
  */
162
- export const be69Edge = {
182
+ export const be69Edge = withBoundAliases({
163
183
  id: 'be-69',
164
184
  beId: 69,
165
185
  kind: 'law',
@@ -187,14 +207,14 @@ export const be69Edge = {
187
207
  }).v_m_per_s,
188
208
  symbolic: BE69_SYMBOLIC,
189
209
  citation: 'PhysJS.FastMagnetosonic.speed_eq. Perpendicular compressional phase speed. c_s = 0 is the Alfvén number of a different polarization.',
190
- };
210
+ });
191
211
  /**
192
212
  * BE-70 Einstein relation: (electrical-mobility, einstein-temperature,
193
213
  * carrier-charge) → diffusivity, `D = μ k_B T / q`.
194
214
  *
195
215
  * @public
196
216
  */
197
- export const be70Edge = {
217
+ export const be70Edge = withBoundAliases({
198
218
  id: 'be-70',
199
219
  beId: 70,
200
220
  kind: 'law',
@@ -208,12 +228,13 @@ export const be70Edge = {
208
228
  target: diffusivityQ,
209
229
  confidence: 'established',
210
230
  domain: {
211
- description: 'μ finite, T ≠ 0, q ≠ 0',
231
+ description: 'μ finite, T ≠ 0, q ≠ 0, and μ and q have the same sign',
212
232
  predicate: (i) => finite(i['electrical-mobility']) &&
213
233
  finite(i['einstein-temperature']) &&
214
234
  i['einstein-temperature'] !== 0 &&
215
235
  finite(i['carrier-charge']) &&
216
- i['carrier-charge'] !== 0,
236
+ i['carrier-charge'] !== 0 &&
237
+ i['electrical-mobility'] * i['carrier-charge'] >= 0,
217
238
  },
218
239
  evaluate: (i) => evaluateEinsteinRelation({
219
240
  mu_m2_per_Vs: i['electrical-mobility'],
@@ -222,14 +243,14 @@ export const be70Edge = {
222
243
  }).D_m2_per_s,
223
244
  symbolic: BE70_SYMBOLIC,
224
245
  citation: 'PhysJS.EinsteinRelation.diffusion_eq. Drift cancels diffusion on a Boltzmann profile.',
225
- };
246
+ });
226
247
  /**
227
248
  * BE-71 Clapeyron slope: (specific-latent-heat, clapeyron-temperature,
228
249
  * specific-volume-change) → clapeyron-slope, `dP/dT = L/(T Δv)`.
229
250
  *
230
251
  * @public
231
252
  */
232
- export const be71Edge = {
253
+ export const be71Edge = withBoundAliases({
233
254
  id: 'be-71',
234
255
  beId: 71,
235
256
  kind: 'law',
@@ -257,7 +278,7 @@ export const be71Edge = {
257
278
  }).slope_Pa_per_K,
258
279
  symbolic: BE71_SYMBOLIC,
259
280
  citation: 'PhysJS.Clapeyron.slope_eq. L = T (s2−s1) is already substituted. The entropy slope is not a second edge.',
260
- };
281
+ });
261
282
  /**
262
283
  * BE-72 gravitational redshift: (redshift-metric-g00-1,
263
284
  * redshift-metric-g00-2) → gravitational-frequency-ratio,
@@ -266,7 +287,7 @@ export const be71Edge = {
266
287
  *
267
288
  * @public
268
289
  */
269
- export const be72Edge = {
290
+ export const be72Edge = withBoundAliases({
270
291
  id: 'be-72',
271
292
  beId: 72,
272
293
  kind: 'law',
@@ -291,7 +312,7 @@ export const be72Edge = {
291
312
  }).frequency_ratio,
292
313
  symbolic: BE72_SYMBOLIC,
293
314
  citation: 'PhysJS.GravitationalRedshift.frequency_ratio. Not PhysJS.TolmanEhrenfest.hydrostatic_constant. tolman_same_ratio is nested and is not this edge.',
294
- };
315
+ });
295
316
  /**
296
317
  * BE-73 Kelvin relation: (seebeck-coefficient, peltier-temperature) →
297
318
  * peltier-coefficient, `Π = S T`. Onsager reciprocity is the structure
@@ -299,7 +320,7 @@ export const be72Edge = {
299
320
  *
300
321
  * @public
301
322
  */
302
- export const be73Edge = {
323
+ export const be73Edge = withBoundAliases({
303
324
  id: 'be-73',
304
325
  beId: 73,
305
326
  kind: 'law',
@@ -321,7 +342,480 @@ export const be73Edge = {
321
342
  }).Pi_V,
322
343
  symbolic: BE73_SYMBOLIC,
323
344
  citation: 'PhysJS.KelvinRelation.peltier_eq. L12 = L21 is ThermoelectricOnsager.onsager, a structure field, not an axiom and not an input.',
324
- };
345
+ });
346
+ /** p_B = B² / (2 μ0). The 2 is the inductor integral, not a Buckingham constant. */
347
+ const BE74_SYMBOLIC = ratio(pow(qsym(magneticFluxDensityQ), lit(2)), prod(lit(2), mu0));
348
+ /** λ_L = √(m / (μ0 n e²)). `e` is the elementary charge. */
349
+ const BE75_SYMBOLIC = pow(ratio(qsym(effectiveMassQ), prod(mu0, qsym(carrierDensityQ), pow(csym('e'), lit(2)))), lit(0.5));
350
+ /** β = n k_B T / p_B. Substituting BE-74 yields 2 μ0 n k_B T / B². */
351
+ const BE76_SYMBOLIC = ratio(prod(qsym(carrierDensityQ), csym('k_B'), qsym(temperatureQ)), qsym(magneticPressureQ));
352
+ /**
353
+ * BE-74 magnetic pressure: magnetic-flux-density → magnetic-pressure,
354
+ * `p_B = B²/(2 μ0)`. `μ0` is a constant. The endpoints share the
355
+ * classical electromagnetic attributes: a law.
356
+ *
357
+ * @public
358
+ */
359
+ export const be74Edge = withBoundAliases({
360
+ id: 'be-74',
361
+ beId: 74,
362
+ kind: 'law',
363
+ label: 'Magnetic pressure p_B = B²/(2 μ0)',
364
+ sources: [magneticFluxDensityQ],
365
+ aliases: {
366
+ 'magnetic-flux-density': ['B_T', 'B'],
367
+ },
368
+ target: magneticPressureQ,
369
+ confidence: 'established',
370
+ domain: {
371
+ description: 'B finite; the factor 2 is the stored-energy half, not C = 1',
372
+ predicate: (i) => finite(i['magnetic-flux-density']),
373
+ },
374
+ evaluate: (i) => evaluateMagneticPressure({ B_T: i['magnetic-flux-density'] }).p_Pa,
375
+ symbolic: BE74_SYMBOLIC,
376
+ citation: 'PhysJS.MagneticPressure.pressure_eq. U = (L/2) I². C = 1 is the battery work per volume, not this pressure.',
377
+ });
378
+ /**
379
+ * BE-75 London penetration depth: (effective-mass, carrier-density) →
380
+ * london-penetration-depth, `λ_L = √(m/(μ0 n e²))`. `e` and `μ0` are
381
+ * constants. The endpoints share the carrier attributes: a law.
382
+ *
383
+ * @public
384
+ */
385
+ export const be75Edge = withBoundAliases({
386
+ id: 'be-75',
387
+ beId: 75,
388
+ kind: 'law',
389
+ label: 'London penetration depth λ_L = √(m/(μ0 n e²))',
390
+ sources: [effectiveMassQ, carrierDensityQ],
391
+ aliases: {
392
+ 'effective-mass': ['m_kg', 'm'],
393
+ 'carrier-density': ['n_per_m3', 'n'],
394
+ },
395
+ target: londonPenetrationDepthQ,
396
+ confidence: 'established',
397
+ domain: {
398
+ description: 'm > 0 and n > 0; e is the elementary charge',
399
+ predicate: (i) => finite(i['effective-mass']) && i['effective-mass'] > 0 && finite(i['carrier-density']) && i['carrier-density'] > 0,
400
+ },
401
+ evaluate: (i) => evaluateLondonPenetration({
402
+ m_kg: i['effective-mass'],
403
+ n_per_m3: i['carrier-density'],
404
+ }).lambda_m,
405
+ symbolic: BE75_SYMBOLIC,
406
+ citation: 'PhysJS.LondonPenetration.depth_eq. Units also admit μ0 e²/m. Not the classical skin depth.',
407
+ });
408
+ /**
409
+ * BE-76 plasma beta: (carrier-density, temperature, magnetic-pressure) →
410
+ * plasma-beta, `β = n k_B T / p_B`. The magnetic-pressure source is
411
+ * BE-74, so the edges compose. `carrier-density` is quantum and
412
+ * `magnetic-pressure` is classical, so the endpoints differ: a bridge.
413
+ * Not a plasma-β inequality.
414
+ *
415
+ * @public
416
+ */
417
+ export const be76Edge = withBoundAliases({
418
+ id: 'be-76',
419
+ beId: 76,
420
+ kind: 'bridge',
421
+ label: 'Plasma beta β = n k_B T / p_B',
422
+ sources: [carrierDensityQ, temperatureQ, magneticPressureQ],
423
+ aliases: {
424
+ 'carrier-density': ['n_per_m3', 'n'],
425
+ temperature: ['T_K', 'T'],
426
+ 'magnetic-pressure': ['p_B_Pa', 'p_B'],
427
+ },
428
+ target: plasmaBetaQ,
429
+ confidence: 'established',
430
+ domain: {
431
+ description: 'n and T finite, p_B ≠ 0; p_B is B²/(2 μ0)',
432
+ predicate: (i) => finite(i['carrier-density']) &&
433
+ finite(i['temperature']) &&
434
+ finite(i['magnetic-pressure']) &&
435
+ i['magnetic-pressure'] !== 0,
436
+ },
437
+ evaluate: (i) => evaluatePlasmaBeta({
438
+ n_per_m3: i['carrier-density'],
439
+ T_K: i['temperature'],
440
+ p_B_Pa: i['magnetic-pressure'],
441
+ }).beta,
442
+ symbolic: BE76_SYMBOLIC,
443
+ citation: 'PhysJS.PlasmaBeta.beta_eq. p_B is PhysJS.MagneticPressure.pressure_eq. Using B²/μ0 is half of this beta. Not a plasma-β inequality.',
444
+ });
445
+ /** Q = π R⁴ ΔP / (8 μ L). The 8 is the no-slip integral. */
446
+ const BE77_SYMBOLIC = ratio(prod(pi, pow(qsym(pipeRadiusQ), lit(4)), qsym(pipePressureDropQ)), prod(lit(8), qsym(dynamicViscosityQ), qsym(pipeLengthQ)));
447
+ /** P_cr = π² E I / L². Pinned ends. Not the cantilever load. */
448
+ const BE78_SYMBOLIC = ratio(prod(pow(pi, lit(2)), qsym(youngsModulusQ), qsym(areaMomentQ)), pow(qsym(columnLengthQ), lit(2)));
449
+ /** V_pi = √(8 k g0³ / (27 ε0 A)). The fold is g = 2 g0/3. */
450
+ const BE79_SYMBOLIC = pow(ratio(prod(lit(8), qsym(pullInStiffnessQ), pow(qsym(pullInGapQ), lit(3))), prod(lit(27), csym('epsilon_0'), qsym(pullInAreaQ))), lit(0.5));
451
+ /** J = (9/8) ε μ V² / d³. Not Child–Langmuir. */
452
+ const BE80_SYMBOLIC = ratio(prod(lit(9), qsym(mottPermittivityQ), qsym(mottMobilityQ), pow(qsym(mottVoltageQ), lit(2))), prod(lit(8), pow(qsym(mottThicknessQ), lit(3))));
453
+ /** J = (4 ε0 / 9) √(2 e / m) V^{3/2} / d². `e` is the elementary charge. */
454
+ const BE81_SYMBOLIC = ratio(prod(lit(4), csym('epsilon_0'), pow(ratio(prod(lit(2), csym('e')), qsym(childCarrierMassQ)), lit(0.5)), pow(qsym(childVoltageQ), lit(1.5))), prod(lit(9), pow(qsym(childGapQ), lit(2))));
455
+ /** I = I_s (exp(e V / (k_B T)) − 1). Ideality is 1. The minus is the literal −1. */
456
+ const BE82_SYMBOLIC = prod(qsym(shockleySaturationQ), plus(expOf(ratio(prod(csym('e'), qsym(shockleyVoltageQ)), prod(csym('k_B'), qsym(shockleyTemperatureQ)))), lit(-1)));
457
+ /** μ_T = T dS/dT. Not Π = S T. */
458
+ const BE83_SYMBOLIC = prod(qsym(thomsonTemperatureQ), qsym(seebeckSlopeQ));
459
+ /** R_s = (π / ln 2) (V / I). The radial 1/r field is a hypothesis. */
460
+ const BE84_SYMBOLIC = prod(ratio(pi, csym('ln2')), ratio(qsym(fourPointVoltageQ), qsym(fourPointCurrentQ)));
461
+ /** S_I = 2 e I. One-sided. `e` is the elementary charge. */
462
+ const BE85_SYMBOLIC = prod(lit(2), csym('e'), qsym(shotCurrentQ));
463
+ /** St = C_f / 2 at Pr = 1 with matched wall slopes. */
464
+ const BE86_SYMBOLIC = ratio(qsym(skinFrictionQ), lit(2));
465
+ /** ⟨v²⟩ = k_B T / C. One quadratic term. */
466
+ const BE87_SYMBOLIC = ratio(prod(csym('k_B'), qsym(capacitorTemperatureQ)), qsym(capacitanceQ));
467
+ /**
468
+ * BE-77 Hagen–Poiseuille: (radius, pressure drop, viscosity, length) →
469
+ * flux. The axial balance, centerline slope 0, and no-slip are hypotheses.
470
+ *
471
+ * @public
472
+ */
473
+ export const be77Edge = withBoundAliases({
474
+ id: 'be-77',
475
+ beId: 77,
476
+ kind: 'law',
477
+ label: 'Hagen–Poiseuille flux Q = π R⁴ ΔP / (8 μ L)',
478
+ sources: [pipeRadiusQ, pipePressureDropQ, dynamicViscosityQ, pipeLengthQ],
479
+ aliases: {
480
+ 'pipe-radius': ['R_m', 'R'],
481
+ 'pipe-pressure-drop': ['deltaP_Pa', 'deltaP'],
482
+ 'dynamic-viscosity': ['mu_Pa_s'],
483
+ 'pipe-length': ['L_m', 'L'],
484
+ },
485
+ target: poiseuilleFlowQ,
486
+ confidence: 'established',
487
+ domain: {
488
+ description: 'R > 0, ΔP finite, μ ≠ 0, L ≠ 0; circular pipe, not a square duct',
489
+ predicate: (i) => finite(i['pipe-radius']) &&
490
+ i['pipe-radius'] > 0 &&
491
+ finite(i['pipe-pressure-drop']) &&
492
+ finite(i['dynamic-viscosity']) &&
493
+ i['dynamic-viscosity'] !== 0 &&
494
+ finite(i['pipe-length']) &&
495
+ i['pipe-length'] !== 0,
496
+ },
497
+ evaluate: (i) => evaluateHagenPoiseuille({
498
+ R_m: i['pipe-radius'],
499
+ deltaP_Pa: i['pipe-pressure-drop'],
500
+ mu_Pa_s: i['dynamic-viscosity'],
501
+ L_m: i['pipe-length'],
502
+ }).Q_m3_per_s,
503
+ symbolic: BE77_SYMBOLIC,
504
+ citation: 'PhysJS.HagenPoiseuille.flow_eq. f_D Re = 64 follows from Darcy definitions. The Fanning factor is 16. Not a square duct.',
505
+ });
506
+ /**
507
+ * BE-78 Euler buckling: (modulus, area moment, length) → pinned load.
508
+ * The cantilever load is a different factor.
509
+ *
510
+ * @public
511
+ */
512
+ export const be78Edge = withBoundAliases({
513
+ id: 'be-78',
514
+ beId: 78,
515
+ kind: 'law',
516
+ label: 'Euler pinned load P_cr = π² E I / L²',
517
+ sources: [youngsModulusQ, areaMomentQ, columnLengthQ],
518
+ aliases: {
519
+ 'youngs-modulus': ['E_Pa', 'E'],
520
+ 'area-moment': ['I_m4'],
521
+ 'column-length': ['L_m', 'L'],
522
+ },
523
+ target: bucklingLoadQ,
524
+ confidence: 'established',
525
+ domain: {
526
+ description: 'E > 0, I > 0, L > 0; pinned ends y(0) = y(L) = 0',
527
+ predicate: (i) => finite(i['youngs-modulus']) &&
528
+ i['youngs-modulus'] > 0 &&
529
+ finite(i['area-moment']) &&
530
+ i['area-moment'] > 0 &&
531
+ finite(i['column-length']) &&
532
+ i['column-length'] > 0,
533
+ },
534
+ evaluate: (i) => evaluateEulerBuckling({
535
+ E_Pa: i['youngs-modulus'],
536
+ I_m4: i['area-moment'],
537
+ L_m: i['column-length'],
538
+ }).P_N,
539
+ symbolic: BE78_SYMBOLIC,
540
+ citation: 'PhysJS.EulerBuckling.critical_load. The beam equation is a hypothesis. The clamped-free load is π² E I / (4 L²), not this load.',
541
+ });
542
+ /**
543
+ * BE-79 pull-in: (stiffness, rest gap, area) → voltage. Parallel-plate
544
+ * and quasi-static balance are hypotheses. Not a fringing field.
545
+ *
546
+ * @public
547
+ */
548
+ export const be79Edge = withBoundAliases({
549
+ id: 'be-79',
550
+ beId: 79,
551
+ kind: 'law',
552
+ label: 'Pull-in voltage V_pi = √(8 k g0³ / (27 ε0 A))',
553
+ sources: [pullInStiffnessQ, pullInGapQ, pullInAreaQ],
554
+ aliases: {
555
+ 'pull-in-stiffness': ['k_N_per_m', 'k'],
556
+ 'pull-in-gap': ['g0_m', 'g0'],
557
+ 'pull-in-area': ['A_m2', 'A'],
558
+ },
559
+ target: pullInVoltageQ,
560
+ confidence: 'established',
561
+ domain: {
562
+ description: 'k > 0, g0 > 0, A > 0; the fold is g = 2 g0/3, not g0/2',
563
+ predicate: (i) => finite(i['pull-in-stiffness']) &&
564
+ i['pull-in-stiffness'] > 0 &&
565
+ finite(i['pull-in-gap']) &&
566
+ i['pull-in-gap'] > 0 &&
567
+ finite(i['pull-in-area']) &&
568
+ i['pull-in-area'] > 0,
569
+ },
570
+ evaluate: (i) => evaluatePullIn({
571
+ k_N_per_m: i['pull-in-stiffness'],
572
+ g0_m: i['pull-in-gap'],
573
+ A_m2: i['pull-in-area'],
574
+ }).V_pi_V,
575
+ symbolic: BE79_SYMBOLIC,
576
+ citation: 'PhysJS.PullIn.pull_in_eq. C = ε0 A/g and the linear spring are hypotheses. g = g0/2 is not the fold.',
577
+ });
578
+ /**
579
+ * BE-80 Mott–Gurney: drift, Poisson, and an injecting contact. Not
580
+ * Child–Langmuir.
581
+ *
582
+ * @public
583
+ */
584
+ export const be80Edge = withBoundAliases({
585
+ id: 'be-80',
586
+ beId: 80,
587
+ kind: 'law',
588
+ label: 'Mott–Gurney current J = (9/8) ε μ V² / d³',
589
+ sources: [mottPermittivityQ, mottMobilityQ, mottVoltageQ, mottThicknessQ],
590
+ aliases: {
591
+ 'mott-permittivity': ['eps'],
592
+ 'mott-mobility': ['mu_m2_per_Vs', 'mu'],
593
+ 'mott-voltage': ['V_volts', 'V'],
594
+ 'mott-thickness': ['d_m', 'd'],
595
+ },
596
+ target: mottGurneyCurrentQ,
597
+ confidence: 'established',
598
+ domain: {
599
+ description: 'ε > 0, μ > 0, V finite, d > 0; E(0) = 0',
600
+ predicate: (i) => finite(i['mott-permittivity']) &&
601
+ i['mott-permittivity'] > 0 &&
602
+ finite(i['mott-mobility']) &&
603
+ i['mott-mobility'] > 0 &&
604
+ finite(i['mott-voltage']) &&
605
+ finite(i['mott-thickness']) &&
606
+ i['mott-thickness'] > 0,
607
+ },
608
+ evaluate: (i) => evaluateMottGurney({
609
+ eps: i['mott-permittivity'],
610
+ mu_m2_per_Vs: i['mott-mobility'],
611
+ V_volts: i['mott-voltage'],
612
+ d_m: i['mott-thickness'],
613
+ }).J_A_per_m2,
614
+ symbolic: BE80_SYMBOLIC,
615
+ citation: 'PhysJS.MottGurney.current_eq. Drift, Poisson, and the injecting contact are hypotheses. Not Child–Langmuir.',
616
+ });
617
+ /**
618
+ * BE-81 Child–Langmuir. Collisionless energy, Poisson, and the 4/3
619
+ * profile. Poisson is not claimed at the cathode. `e` is elementary.
620
+ *
621
+ * @public
622
+ */
623
+ export const be81Edge = withBoundAliases({
624
+ id: 'be-81',
625
+ beId: 81,
626
+ kind: 'law',
627
+ label: 'Child–Langmuir current J = (4 ε0/9) √(2 e/m) V^{3/2}/d²',
628
+ sources: [childCarrierMassQ, childVoltageQ, childGapQ],
629
+ aliases: {
630
+ 'child-carrier-mass': ['m_kg', 'm'],
631
+ 'child-voltage': ['V_volts', 'V'],
632
+ 'child-gap': ['d_m', 'd'],
633
+ },
634
+ target: childLangmuirCurrentQ,
635
+ confidence: 'established',
636
+ domain: {
637
+ description: 'm > 0, V > 0, d > 0; cathode field 0; Poisson not at x = 0',
638
+ predicate: (i) => finite(i['child-carrier-mass']) &&
639
+ i['child-carrier-mass'] > 0 &&
640
+ finite(i['child-voltage']) &&
641
+ i['child-voltage'] > 0 &&
642
+ finite(i['child-gap']) &&
643
+ i['child-gap'] > 0,
644
+ },
645
+ evaluate: (i) => evaluateChildLangmuir({
646
+ m_kg: i['child-carrier-mass'],
647
+ V_volts: i['child-voltage'],
648
+ d_m: i['child-gap'],
649
+ }).J_A_per_m2,
650
+ symbolic: BE81_SYMBOLIC,
651
+ citation: 'PhysJS.ChildLangmuir.current_eq. e is the elementary charge. Not a drift-only solid.',
652
+ });
653
+ /**
654
+ * BE-82 Shockley diode at ideality 1. Not a diffusion-length ODE.
655
+ *
656
+ * @public
657
+ */
658
+ export const be82Edge = withBoundAliases({
659
+ id: 'be-82',
660
+ beId: 82,
661
+ kind: 'law',
662
+ label: 'Shockley diode I = I_s (exp(e V/(k_B T)) − 1)',
663
+ sources: [shockleySaturationQ, shockleyVoltageQ, shockleyTemperatureQ],
664
+ aliases: {
665
+ 'shockley-saturation': ['I_s_A', 'I_s'],
666
+ 'shockley-voltage': ['V_volts', 'V'],
667
+ 'shockley-temperature': ['T_K', 'T'],
668
+ },
669
+ target: shockleyCurrentQ,
670
+ confidence: 'established',
671
+ domain: {
672
+ description: 'I_s and V finite, T ≠ 0; ideality 1',
673
+ predicate: (i) => finite(i['shockley-saturation']) &&
674
+ finite(i['shockley-voltage']) &&
675
+ finite(i['shockley-temperature']) &&
676
+ i['shockley-temperature'] !== 0,
677
+ },
678
+ evaluate: (i) => evaluateShockleyDiode({
679
+ I_s_A: i['shockley-saturation'],
680
+ V_volts: i['shockley-voltage'],
681
+ T_K: i['shockley-temperature'],
682
+ }).I_A,
683
+ symbolic: BE82_SYMBOLIC,
684
+ citation: 'PhysJS.ShockleyDiode.shockley_eq. Quasi-equilibrium, detailed balance at V = 0, and low injection are hypotheses. Ideality 2 is not this current.',
685
+ });
686
+ /**
687
+ * BE-83 Thomson coefficient. Builds on the Kelvin relation read along
688
+ * temperature. The quantities do not meet be-73, so the edges do not compose.
689
+ *
690
+ * @public
691
+ */
692
+ export const be83Edge = withBoundAliases({
693
+ id: 'be-83',
694
+ beId: 83,
695
+ kind: 'law',
696
+ label: 'Thomson coefficient μ_T = T dS/dT',
697
+ sources: [thomsonTemperatureQ, seebeckSlopeQ],
698
+ aliases: {
699
+ 'thomson-temperature': ['T_K', 'T'],
700
+ 'seebeck-slope': ['dS_dT_V_per_K2', 'dS_dT'],
701
+ },
702
+ target: thomsonCoefficientQ,
703
+ confidence: 'established',
704
+ domain: {
705
+ description: 'T and dS/dT finite; Kelvin along temperature and the Thomson split are hypotheses',
706
+ predicate: (i) => finite(i['thomson-temperature']) && finite(i['seebeck-slope']),
707
+ },
708
+ evaluate: (i) => evaluateThomsonCoefficient({
709
+ T_K: i['thomson-temperature'],
710
+ dS_dT_V_per_K2: i['seebeck-slope'],
711
+ }).mu_V_per_K,
712
+ symbolic: BE83_SYMBOLIC,
713
+ citation: 'PhysJS.Thomson.thomson_eq. Π(t) = S(t) t is PhysJS.KelvinRelation.peltier_eq read along temperature. Not a second copy of Π = S T.',
714
+ });
715
+ /**
716
+ * BE-84 four-point sheet resistance. The radial 1/r potential is a premise.
717
+ *
718
+ * @public
719
+ */
720
+ export const be84Edge = withBoundAliases({
721
+ id: 'be-84',
722
+ beId: 84,
723
+ kind: 'law',
724
+ label: 'Four-point sheet resistance R_s = (π / ln 2) (V/I)',
725
+ sources: [fourPointVoltageQ, fourPointCurrentQ],
726
+ aliases: {
727
+ 'four-point-voltage': ['V_volts', 'V'],
728
+ 'four-point-current': ['I_A', 'I'],
729
+ },
730
+ target: sheetResistanceQ,
731
+ confidence: 'established',
732
+ domain: {
733
+ description: 'V finite, I ≠ 0; probes at 0, s, 2s, 3s; radial field (I R_s)/(2 π r)',
734
+ predicate: (i) => finite(i['four-point-voltage']) && finite(i['four-point-current']) && i['four-point-current'] !== 0,
735
+ },
736
+ evaluate: (i) => evaluateFourPointSheet({
737
+ V_volts: i['four-point-voltage'],
738
+ I_A: i['four-point-current'],
739
+ }).R_s_ohm,
740
+ symbolic: BE84_SYMBOLIC,
741
+ citation: 'PhysJS.FourPoint.sheet_eq. The Laplace field and linear superposition are hypotheses. A sink at 4s is 2π/ln 3. Not PhysJS.Crossing.antisymmetry.',
742
+ });
743
+ /**
744
+ * BE-85 one-sided shot noise. Not Johnson–Nyquist and not the two-sided e I.
745
+ *
746
+ * @public
747
+ */
748
+ export const be85Edge = withBoundAliases({
749
+ id: 'be-85',
750
+ beId: 85,
751
+ kind: 'law',
752
+ label: 'Shot noise S_I = 2 e I',
753
+ sources: [shotCurrentQ],
754
+ aliases: {
755
+ 'shot-current': ['I_A', 'I'],
756
+ },
757
+ target: shotNoiseQ,
758
+ confidence: 'established',
759
+ domain: {
760
+ description: 'I finite; Poisson Var(N) = mean(N); one-sided Δf = 1/(2 T)',
761
+ predicate: (i) => finite(i['shot-current']),
762
+ },
763
+ evaluate: (i) => evaluateShotNoise({ I_A: i['shot-current'] }).S_I_A2_per_Hz,
764
+ symbolic: BE85_SYMBOLIC,
765
+ citation: 'PhysJS.ShotNoise.shot_eq. e is the elementary charge. The two-sided bandwidth gives e I. Not Johnson–Nyquist.',
766
+ });
767
+ /**
768
+ * BE-86 Reynolds analogy. Matched wall slopes and Pr = 1 are hypotheses.
769
+ *
770
+ * @public
771
+ */
772
+ export const be86Edge = withBoundAliases({
773
+ id: 'be-86',
774
+ beId: 86,
775
+ kind: 'law',
776
+ label: 'Reynolds analogy St = C_f / 2',
777
+ sources: [skinFrictionQ],
778
+ aliases: {
779
+ 'skin-friction': ['C_f'],
780
+ },
781
+ target: stantonNumberQ,
782
+ confidence: 'established',
783
+ domain: {
784
+ description: 'C_f finite; normalized wall gradients agree and Pr = 1',
785
+ predicate: (i) => finite(i['skin-friction']),
786
+ },
787
+ evaluate: (i) => evaluateReynoldsAnalogy({ C_f: i['skin-friction'] }).St,
788
+ symbolic: BE86_SYMBOLIC,
789
+ citation: 'PhysJS.ReynoldsAnalogy.reynolds_eq. St Pr = C_f/2 when the slopes match. Pr = 1 is the hypothesis that drops Pr. Not a Nusselt correlation.',
790
+ });
791
+ /**
792
+ * BE-87 capacitor voltage variance. One quadratic term, not (3/2) k_B T/C.
793
+ *
794
+ * @public
795
+ */
796
+ export const be87Edge = withBoundAliases({
797
+ id: 'be-87',
798
+ beId: 87,
799
+ kind: 'law',
800
+ label: 'Capacitor noise ⟨v²⟩ = k_B T / C',
801
+ sources: [capacitorTemperatureQ, capacitanceQ],
802
+ aliases: {
803
+ 'capacitor-temperature': ['T_K', 'T'],
804
+ capacitance: ['C_F', 'C'],
805
+ },
806
+ target: capacitorVoltageVarianceQ,
807
+ confidence: 'established',
808
+ domain: {
809
+ description: 'T finite, C > 0; U = (C/2) V²',
810
+ predicate: (i) => finite(i['capacitor-temperature']) && finite(i['capacitance']) && i['capacitance'] > 0,
811
+ },
812
+ evaluate: (i) => evaluateCapacitorNoise({
813
+ T_K: i['capacitor-temperature'],
814
+ C_F: i['capacitance'],
815
+ }).v2_V2,
816
+ symbolic: BE87_SYMBOLIC,
817
+ citation: 'PhysJS.CapacitorNoise.noise_eq. (3/2) k_B T/C is not this variance. Dropping the energy half gives k_B T/(2 C).',
818
+ });
325
819
  /** The applied-physicist edges, in catalog-id order. @public */
326
820
  export const APPLIED_PHYSICIST_EDGES = [
327
821
  be66Edge,
@@ -332,5 +826,19 @@ export const APPLIED_PHYSICIST_EDGES = [
332
826
  be71Edge,
333
827
  be72Edge,
334
828
  be73Edge,
829
+ be74Edge,
830
+ be75Edge,
831
+ be76Edge,
832
+ be77Edge,
833
+ be78Edge,
834
+ be79Edge,
835
+ be80Edge,
836
+ be81Edge,
837
+ be82Edge,
838
+ be83Edge,
839
+ be84Edge,
840
+ be85Edge,
841
+ be86Edge,
842
+ be87Edge,
335
843
  ];
336
844
  //# sourceMappingURL=applied-physicist.js.map