@classytic/stage 0.3.0 → 0.4.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.
- package/dist/_virtual/_rolldown/runtime.mjs +18 -0
- package/dist/atomic/aufbau.d.mts +144 -0
- package/dist/atomic/aufbau.mjs +384 -0
- package/dist/atomic/elements.d.mts +67 -0
- package/dist/atomic/elements.mjs +785 -0
- package/dist/atomic/emission.d.mts +112 -0
- package/dist/atomic/emission.mjs +179 -0
- package/dist/atomic/index.d.mts +8 -0
- package/dist/atomic/index.mjs +9 -0
- package/dist/atomic/periodic.d.mts +82 -0
- package/dist/atomic/periodic.mjs +231 -0
- package/dist/atomic/properties.d.mts +100 -0
- package/dist/atomic/properties.mjs +574 -0
- package/dist/atomic/shells.d.mts +137 -0
- package/dist/atomic/shells.mjs +170 -0
- package/dist/atomic/trends.d.mts +148 -0
- package/dist/atomic/trends.mjs +225 -0
- package/dist/chem/chromatography.d.mts +66 -0
- package/dist/chem/chromatography.mjs +63 -0
- package/dist/chem/complex.d.mts +114 -0
- package/dist/chem/complex.mjs +234 -0
- package/dist/chem/cycle.d.mts +75 -0
- package/dist/chem/cycle.mjs +145 -0
- package/dist/chem/equation.d.mts +86 -0
- package/dist/chem/equation.mjs +168 -0
- package/dist/chem/formula.d.mts +90 -0
- package/dist/chem/formula.mjs +201 -0
- package/dist/chem/functional-groups.d.mts +31 -0
- package/dist/chem/functional-groups.mjs +187 -0
- package/dist/chem/hazard.d.mts +94 -0
- package/dist/chem/hazard.mjs +329 -0
- package/dist/chem/index.d.mts +34 -33
- package/dist/chem/index.mjs +34 -28
- package/dist/chem/ionic.d.mts +98 -0
- package/dist/chem/ionic.mjs +156 -0
- package/dist/chem/layout.d.mts +46 -0
- package/dist/chem/layout.mjs +342 -0
- package/dist/chem/lewis.d.mts +79 -0
- package/dist/chem/lewis.mjs +163 -0
- package/dist/chem/molecular-orbital.d.mts +114 -0
- package/dist/chem/molecular-orbital.mjs +201 -0
- package/dist/chem/molecule.d.mts +154 -0
- package/dist/chem/molecule.mjs +282 -0
- package/dist/chem/nmr.d.mts +153 -0
- package/dist/chem/nmr.mjs +165 -0
- package/dist/chem/polymer.d.mts +65 -0
- package/dist/chem/polymer.mjs +179 -0
- package/dist/chem/redox.d.mts +138 -0
- package/dist/chem/redox.mjs +328 -0
- package/dist/chem/relations.d.mts +183 -0
- package/dist/chem/relations.mjs +299 -0
- package/dist/chem/skeleton.d.mts +51 -0
- package/dist/chem/skeleton.mjs +186 -0
- package/dist/chem/solution.d.mts +116 -0
- package/dist/chem/solution.mjs +186 -0
- package/dist/chem/species.d.mts +47 -0
- package/dist/chem/species.mjs +128 -0
- package/dist/chem/stereo.d.mts +108 -0
- package/dist/chem/stereo.mjs +286 -0
- package/dist/chem/stoichiometry.d.mts +95 -0
- package/dist/chem/stoichiometry.mjs +145 -0
- package/dist/chem/synthesis.d.mts +113 -0
- package/dist/chem/synthesis.mjs +281 -0
- package/dist/chem/vsepr.d.mts +80 -0
- package/dist/chem/vsepr.mjs +247 -0
- package/dist/circuit/ac.d.mts +163 -0
- package/dist/circuit/ac.mjs +452 -0
- package/dist/circuit/dc.d.mts +92 -0
- package/dist/circuit/dc.mjs +333 -0
- package/dist/circuit/index.d.mts +5 -92
- package/dist/circuit/index.mjs +5 -332
- package/dist/circuit/network.d.mts +99 -0
- package/dist/circuit/network.mjs +440 -0
- package/dist/circuit/topology.d.mts +102 -0
- package/dist/circuit/topology.mjs +143 -0
- package/dist/colour/absorption.d.mts +79 -0
- package/dist/colour/absorption.mjs +137 -0
- package/dist/colour/index.d.mts +6 -0
- package/dist/colour/index.mjs +7 -0
- package/dist/colour/name.d.mts +14 -0
- package/dist/colour/name.mjs +76 -0
- package/dist/colour/observer.d.mts +31 -0
- package/dist/colour/observer.mjs +46 -0
- package/dist/colour/spectrum.d.mts +61 -0
- package/dist/colour/spectrum.mjs +108 -0
- package/dist/colour/srgb.d.mts +49 -0
- package/dist/colour/srgb.mjs +108 -0
- package/dist/core/constants.d.mts +138 -0
- package/dist/core/constants.mjs +139 -0
- package/dist/core/index.d.mts +3 -1
- package/dist/core/index.mjs +3 -1
- package/dist/core/vec3.d.mts +94 -0
- package/dist/core/vec3.mjs +123 -0
- package/dist/core/worked.d.mts +35 -0
- package/dist/core/worked.mjs +44 -0
- package/dist/electro/cell.d.mts +102 -0
- package/dist/electro/cell.mjs +170 -0
- package/dist/electro/conductivity.d.mts +157 -0
- package/dist/electro/conductivity.mjs +156 -0
- package/dist/electro/couples.d.mts +114 -0
- package/dist/electro/couples.mjs +334 -0
- package/dist/electro/electrolysis.d.mts +96 -0
- package/dist/electro/electrolysis.mjs +274 -0
- package/dist/electro/faraday.d.mts +150 -0
- package/dist/electro/faraday.mjs +118 -0
- package/dist/electro/index.d.mts +6 -0
- package/dist/electro/index.mjs +7 -0
- package/dist/finance/accounting/adjustments.d.mts +17 -0
- package/dist/finance/accounting/adjustments.mjs +202 -0
- package/dist/finance/accounting/analysis.d.mts +8 -0
- package/dist/finance/accounting/analysis.mjs +205 -0
- package/dist/finance/accounting/clubs.d.mts +21 -0
- package/dist/finance/accounting/clubs.mjs +217 -0
- package/dist/finance/accounting/company-statements.d.mts +7 -0
- package/dist/finance/accounting/company-statements.mjs +150 -0
- package/dist/finance/accounting/harness.d.mts +7 -0
- package/dist/finance/accounting/harness.mjs +45 -0
- package/dist/finance/accounting/index.d.mts +18 -0
- package/dist/finance/accounting/index.mjs +18 -0
- package/dist/finance/accounting/journalize.d.mts +16 -0
- package/dist/finance/accounting/journalize.mjs +128 -0
- package/dist/finance/accounting/manufacturing.d.mts +8 -0
- package/dist/finance/accounting/manufacturing.mjs +236 -0
- package/dist/finance/accounting/partnership.d.mts +7 -0
- package/dist/finance/accounting/partnership.mjs +152 -0
- package/dist/finance/accounting/period-case.d.mts +6 -0
- package/dist/finance/accounting/period-case.mjs +71 -0
- package/dist/finance/accounting/post.d.mts +9 -0
- package/dist/finance/accounting/post.mjs +84 -0
- package/dist/finance/accounting/precision.d.mts +9 -0
- package/dist/finance/accounting/precision.mjs +15 -0
- package/dist/finance/accounting/rules.d.mts +21 -0
- package/dist/finance/accounting/rules.mjs +37 -0
- package/dist/finance/accounting/solve.d.mts +28 -0
- package/dist/finance/accounting/solve.mjs +92 -0
- package/dist/finance/accounting/statements.d.mts +7 -0
- package/dist/finance/accounting/statements.mjs +142 -0
- package/dist/finance/accounting/types.d.mts +649 -0
- package/dist/finance/accounting/validate.d.mts +7 -0
- package/dist/finance/accounting/validate.mjs +67 -0
- package/dist/finance/accounting/verification.d.mts +24 -0
- package/dist/finance/accounting/verification.mjs +386 -0
- package/dist/finance/bizsim.d.mts +21 -39
- package/dist/finance/bizsim.mjs +276 -97
- package/dist/finance/index.d.mts +20 -43
- package/dist/finance/index.mjs +19 -77
- package/dist/finance/investment-math.d.mts +7 -0
- package/dist/finance/investment-math.mjs +18 -0
- package/dist/finance/management-accounting/budgeting.d.mts +7 -0
- package/dist/finance/management-accounting/budgeting.mjs +189 -0
- package/dist/finance/management-accounting/cash-budget.d.mts +7 -0
- package/dist/finance/management-accounting/cash-budget.mjs +154 -0
- package/dist/finance/management-accounting/costing.d.mts +8 -0
- package/dist/finance/management-accounting/costing.mjs +175 -0
- package/dist/finance/management-accounting/decisions.d.mts +8 -0
- package/dist/finance/management-accounting/decisions.mjs +164 -0
- package/dist/finance/management-accounting/index.d.mts +13 -0
- package/dist/finance/management-accounting/index.mjs +13 -0
- package/dist/finance/management-accounting/integrated-budget.d.mts +8 -0
- package/dist/finance/management-accounting/integrated-budget.mjs +67 -0
- package/dist/finance/management-accounting/inventory-costing.d.mts +7 -0
- package/dist/finance/management-accounting/inventory-costing.mjs +173 -0
- package/dist/finance/management-accounting/investment-appraisal.d.mts +7 -0
- package/dist/finance/management-accounting/investment-appraisal.mjs +148 -0
- package/dist/finance/management-accounting/management-case.d.mts +8 -0
- package/dist/finance/management-accounting/management-case.mjs +91 -0
- package/dist/finance/management-accounting/master-budget.d.mts +7 -0
- package/dist/finance/management-accounting/master-budget.mjs +137 -0
- package/dist/finance/management-accounting/production-costing.d.mts +8 -0
- package/dist/finance/management-accounting/production-costing.mjs +214 -0
- package/dist/finance/management-accounting/types.d.mts +644 -0
- package/dist/finance/management-accounting/variances.d.mts +7 -0
- package/dist/finance/management-accounting/variances.mjs +150 -0
- package/dist/index.d.mts +6 -6
- package/dist/index.mjs +1 -1
- package/dist/math/analysis.d.mts +61 -0
- package/dist/math/analysis.mjs +187 -0
- package/dist/math/answer-check.d.mts +50 -0
- package/dist/math/answer-check.mjs +106 -0
- package/dist/math/calculus.d.mts +4 -9
- package/dist/math/calculus.mjs +216 -7
- package/dist/math/complex.d.mts +93 -0
- package/dist/math/complex.mjs +239 -0
- package/dist/math/expr.d.mts +23 -0
- package/dist/math/expr.mjs +36 -0
- package/dist/math/index.d.mts +8 -22
- package/dist/math/index.mjs +8 -37
- package/dist/math/latex.mjs +2 -1
- package/dist/math/parse.mjs +1 -1
- package/dist/math/poly.d.mts +55 -0
- package/dist/math/poly.mjs +273 -0
- package/dist/math/rearrange.d.mts +14 -0
- package/dist/math/rearrange.mjs +125 -0
- package/dist/math/solve.d.mts +21 -0
- package/dist/math/solve.mjs +75 -0
- package/dist/networking/addressing.d.mts +26 -0
- package/dist/networking/addressing.mjs +33 -0
- package/dist/networking/cloud/access.d.mts +36 -0
- package/dist/networking/cloud/access.mjs +95 -0
- package/dist/networking/cloud/containers.d.mts +43 -0
- package/dist/networking/cloud/containers.mjs +54 -0
- package/dist/networking/cloud/edge.d.mts +17 -0
- package/dist/networking/cloud/edge.mjs +31 -0
- package/dist/networking/cloud/failure-domains.d.mts +19 -0
- package/dist/networking/cloud/failure-domains.mjs +22 -0
- package/dist/networking/cloud/geo-routing.d.mts +22 -0
- package/dist/networking/cloud/geo-routing.mjs +64 -0
- package/dist/networking/cloud/index.d.mts +18 -0
- package/dist/networking/cloud/index.mjs +19 -0
- package/dist/networking/cloud/inference-reliability.d.mts +30 -0
- package/dist/networking/cloud/inference-reliability.mjs +76 -0
- package/dist/networking/cloud/inference.d.mts +118 -0
- package/dist/networking/cloud/inference.mjs +179 -0
- package/dist/networking/cloud/infrastructure.d.mts +45 -0
- package/dist/networking/cloud/infrastructure.mjs +96 -0
- package/dist/networking/cloud/observability.d.mts +24 -0
- package/dist/networking/cloud/observability.mjs +34 -0
- package/dist/networking/cloud/orchestration.d.mts +32 -0
- package/dist/networking/cloud/orchestration.mjs +38 -0
- package/dist/networking/cloud/recovery.d.mts +21 -0
- package/dist/networking/cloud/recovery.mjs +27 -0
- package/dist/networking/cloud/releases.d.mts +42 -0
- package/dist/networking/cloud/releases.mjs +135 -0
- package/dist/networking/cloud/scaling.d.mts +25 -0
- package/dist/networking/cloud/scaling.mjs +65 -0
- package/dist/networking/cloud/secrets.d.mts +39 -0
- package/dist/networking/cloud/secrets.mjs +68 -0
- package/dist/networking/cloud/server-deployment.d.mts +29 -0
- package/dist/networking/cloud/server-deployment.mjs +72 -0
- package/dist/networking/cloud/storage.d.mts +16 -0
- package/dist/networking/cloud/storage.mjs +58 -0
- package/dist/networking/cloud/vpc.d.mts +18 -0
- package/dist/networking/cloud/vpc.mjs +100 -0
- package/dist/networking/delivery.d.mts +34 -0
- package/dist/networking/delivery.mjs +52 -0
- package/dist/networking/index.d.mts +47 -0
- package/dist/networking/index.mjs +47 -0
- package/dist/networking/ipv6.d.mts +28 -0
- package/dist/networking/ipv6.mjs +17 -0
- package/dist/networking/journeys.d.mts +83 -0
- package/dist/networking/journeys.mjs +161 -0
- package/dist/networking/models/airtime.d.mts +87 -0
- package/dist/networking/models/airtime.mjs +130 -0
- package/dist/networking/models/cellular.d.mts +157 -0
- package/dist/networking/models/cellular.mjs +252 -0
- package/dist/networking/models/encapsulation.d.mts +98 -0
- package/dist/networking/models/encapsulation.mjs +132 -0
- package/dist/networking/models/handover.d.mts +116 -0
- package/dist/networking/models/handover.mjs +209 -0
- package/dist/networking/models/handshake.d.mts +90 -0
- package/dist/networking/models/handshake.mjs +122 -0
- package/dist/networking/models/index.d.mts +14 -0
- package/dist/networking/models/index.mjs +15 -0
- package/dist/networking/models/media.d.mts +82 -0
- package/dist/networking/models/media.mjs +188 -0
- package/dist/networking/models/satellite.d.mts +86 -0
- package/dist/networking/models/satellite.mjs +121 -0
- package/dist/networking/models/spectrum.d.mts +83 -0
- package/dist/networking/models/spectrum.mjs +235 -0
- package/dist/networking/models/switch.d.mts +80 -0
- package/dist/networking/models/switch.mjs +155 -0
- package/dist/networking/models/vlan.d.mts +62 -0
- package/dist/networking/models/vlan.mjs +100 -0
- package/dist/networking/models/vpn.d.mts +66 -0
- package/dist/networking/models/vpn.mjs +125 -0
- package/dist/networking/models/wifi-privacy.d.mts +82 -0
- package/dist/networking/models/wifi-privacy.mjs +130 -0
- package/dist/networking/models/wifi.d.mts +240 -0
- package/dist/networking/models/wifi.mjs +562 -0
- package/dist/networking/nat-traversal.d.mts +24 -0
- package/dist/networking/nat-traversal.mjs +38 -0
- package/dist/networking/protocols.d.mts +17 -0
- package/dist/networking/protocols.mjs +57 -0
- package/dist/networking/queue.d.mts +12 -0
- package/dist/networking/queue.mjs +18 -0
- package/dist/networking/route-learning.d.mts +23 -0
- package/dist/networking/route-learning.mjs +43 -0
- package/dist/networking/routing.d.mts +11 -0
- package/dist/networking/routing.mjs +25 -0
- package/dist/networking/signals.d.mts +26 -0
- package/dist/networking/signals.mjs +35 -0
- package/dist/networking/subnet.d.mts +49 -0
- package/dist/networking/subnet.mjs +89 -0
- package/dist/networking/tcp-reliability.d.mts +24 -0
- package/dist/networking/tcp-reliability.mjs +38 -0
- package/dist/networking/topology/contract.d.mts +123 -0
- package/dist/networking/topology/index.d.mts +4 -0
- package/dist/networking/topology/index.mjs +4 -0
- package/dist/networking/topology/presets.d.mts +7 -0
- package/dist/networking/topology/presets.mjs +302 -0
- package/dist/networking/topology/simulation.d.mts +8 -0
- package/dist/networking/topology/simulation.mjs +179 -0
- package/dist/networking/wireless.d.mts +11 -0
- package/dist/networking/wireless.mjs +17 -0
- package/dist/optics/imaging.d.mts +218 -0
- package/dist/optics/imaging.mjs +276 -0
- package/dist/optics/index.d.mts +7 -0
- package/dist/optics/index.mjs +8 -0
- package/dist/optics/laws.d.mts +70 -0
- package/dist/optics/laws.mjs +195 -0
- package/dist/optics/prism.d.mts +148 -0
- package/dist/optics/prism.mjs +197 -0
- package/dist/optics/refraction.d.mts +201 -0
- package/dist/optics/refraction.mjs +270 -0
- package/dist/optics/wave-optics.d.mts +171 -0
- package/dist/optics/wave-optics.mjs +259 -0
- package/dist/physics/ac/index.d.mts +183 -0
- package/dist/physics/ac/index.mjs +203 -0
- package/dist/physics/dynamics/forces.d.mts +98 -0
- package/dist/physics/dynamics/forces.mjs +153 -0
- package/dist/physics/dynamics/friction.d.mts +76 -0
- package/dist/physics/dynamics/friction.mjs +119 -0
- package/dist/physics/dynamics/system.d.mts +68 -0
- package/dist/physics/dynamics/system.mjs +125 -0
- package/dist/physics/electrostatics/index.d.mts +169 -0
- package/dist/physics/electrostatics/index.mjs +249 -0
- package/dist/physics/energy/centre-of-mass.d.mts +115 -0
- package/dist/physics/energy/centre-of-mass.mjs +180 -0
- package/dist/physics/energy/conservation.d.mts +81 -0
- package/dist/physics/energy/conservation.mjs +129 -0
- package/dist/physics/energy/power.d.mts +90 -0
- package/dist/physics/energy/power.mjs +167 -0
- package/dist/physics/energy/spring.d.mts +73 -0
- package/dist/physics/energy/spring.mjs +129 -0
- package/dist/physics/energy/store.d.mts +63 -0
- package/dist/physics/energy/store.mjs +108 -0
- package/dist/physics/energy/theorem.d.mts +65 -0
- package/dist/physics/energy/theorem.mjs +113 -0
- package/dist/physics/energy/work.d.mts +114 -0
- package/dist/physics/energy/work.mjs +219 -0
- package/dist/physics/gravitation/body.d.mts +85 -0
- package/dist/physics/gravitation/body.mjs +168 -0
- package/dist/physics/gravitation/kepler.d.mts +127 -0
- package/dist/physics/gravitation/kepler.mjs +216 -0
- package/dist/physics/gravitation/law.d.mts +117 -0
- package/dist/physics/gravitation/law.mjs +175 -0
- package/dist/physics/gravitation/orbit.d.mts +119 -0
- package/dist/physics/gravitation/orbit.mjs +202 -0
- package/dist/physics/gravitation/potential.d.mts +114 -0
- package/dist/physics/gravitation/potential.mjs +202 -0
- package/dist/physics/gravitation/variation.d.mts +97 -0
- package/dist/physics/gravitation/variation.mjs +175 -0
- package/dist/physics/index.d.mts +35 -0
- package/dist/physics/index.mjs +36 -0
- package/dist/physics/integral-sweep.d.mts +63 -0
- package/dist/physics/integral-sweep.mjs +126 -0
- package/dist/physics/kinematics/equations.d.mts +47 -0
- package/dist/physics/kinematics/equations.mjs +126 -0
- package/dist/physics/kinematics/free-fall.d.mts +53 -0
- package/dist/physics/kinematics/free-fall.mjs +71 -0
- package/dist/physics/kinematics/given.d.mts +16 -0
- package/dist/physics/kinematics/given.mjs +55 -0
- package/dist/physics/kinematics/roots.d.mts +41 -0
- package/dist/physics/kinematics/roots.mjs +72 -0
- package/dist/physics/kinematics/solve.d.mts +52 -0
- package/dist/physics/kinematics/solve.mjs +172 -0
- package/dist/physics/magnetism/biot-savart.d.mts +161 -0
- package/dist/physics/magnetism/biot-savart.mjs +353 -0
- package/dist/physics/magnetism/flux.d.mts +94 -0
- package/dist/physics/magnetism/flux.mjs +313 -0
- package/dist/physics/magnetism/geomagnetism.d.mts +151 -0
- package/dist/physics/magnetism/geomagnetism.mjs +184 -0
- package/dist/physics/magnetism/index.d.mts +12 -0
- package/dist/physics/magnetism/index.mjs +74 -0
- package/dist/physics/magnetism/lorentz.d.mts +28 -0
- package/dist/physics/magnetism/lorentz.mjs +88 -0
- package/dist/physics/magnetism/magnetic-force.d.mts +102 -0
- package/dist/physics/magnetism/magnetic-force.mjs +169 -0
- package/dist/physics/momentum/collide.d.mts +77 -0
- package/dist/physics/momentum/collide.mjs +115 -0
- package/dist/physics/momentum/impulse.d.mts +89 -0
- package/dist/physics/momentum/impulse.mjs +159 -0
- package/dist/physics/momentum/planar.d.mts +60 -0
- package/dist/physics/momentum/planar.mjs +110 -0
- package/dist/physics/projectile.d.mts +107 -0
- package/dist/physics/projectile.mjs +185 -0
- package/dist/physics/rotation/angular.d.mts +85 -0
- package/dist/physics/rotation/angular.mjs +130 -0
- package/dist/physics/rotation/circular.d.mts +79 -0
- package/dist/physics/rotation/circular.mjs +131 -0
- package/dist/physics/rotation/inertia.d.mts +164 -0
- package/dist/physics/rotation/inertia.mjs +332 -0
- package/dist/physics/rotation/torque.d.mts +65 -0
- package/dist/physics/rotation/torque.mjs +134 -0
- package/dist/physics/vectors.d.mts +64 -0
- package/dist/physics/vectors.mjs +114 -0
- package/dist/quantity/index.d.mts +119 -0
- package/dist/quantity/index.mjs +417 -0
- package/dist/relation/derive.d.mts +74 -0
- package/dist/relation/derive.mjs +73 -0
- package/dist/relation/index.d.mts +56 -0
- package/dist/relation/index.mjs +234 -0
- package/dist/scene/evaluators.mjs +1 -1
- package/dist/sim/thermal.mjs +45 -20
- package/dist/thermo/calorimetry.d.mts +207 -0
- package/dist/thermo/calorimetry.mjs +345 -0
- package/dist/thermo/cycles.d.mts +142 -0
- package/dist/thermo/cycles.mjs +256 -0
- package/dist/thermo/entropy.d.mts +87 -0
- package/dist/thermo/entropy.mjs +140 -0
- package/dist/thermo/expansion.d.mts +130 -0
- package/dist/thermo/expansion.mjs +178 -0
- package/dist/thermo/gas.d.mts +197 -0
- package/dist/thermo/gas.mjs +279 -0
- package/dist/thermo/heat-transfer.d.mts +164 -0
- package/dist/thermo/heat-transfer.mjs +217 -0
- package/dist/thermo/index.d.mts +9 -82
- package/dist/thermo/index.mjs +9 -132
- package/dist/thermo/processes.d.mts +95 -0
- package/dist/thermo/processes.mjs +154 -0
- package/dist/thermo/temperature.d.mts +174 -0
- package/dist/thermo/temperature.mjs +236 -0
- package/dist/waves/damping.d.mts +224 -0
- package/dist/waves/damping.mjs +317 -0
- package/dist/waves/doppler.d.mts +72 -0
- package/dist/waves/doppler.mjs +125 -0
- package/dist/waves/index.d.mts +10 -0
- package/dist/waves/index.mjs +10 -0
- package/dist/waves/pendulum.d.mts +130 -0
- package/dist/waves/pendulum.mjs +211 -0
- package/dist/waves/pitch.d.mts +125 -0
- package/dist/waves/pitch.mjs +158 -0
- package/dist/waves/shm.d.mts +170 -0
- package/dist/waves/shm.mjs +279 -0
- package/dist/waves/springs.d.mts +103 -0
- package/dist/waves/springs.mjs +176 -0
- package/dist/waves/superposition.d.mts +124 -0
- package/dist/waves/superposition.mjs +196 -0
- package/dist/waves/wave.d.mts +154 -0
- package/dist/waves/wave.mjs +178 -0
- package/package.json +74 -2
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { Relation } from "../relation/index.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/chem/relations.d.ts
|
|
4
|
+
/** `n = m / M`, moles from a mass weighed out. */
|
|
5
|
+
declare const molesFromMass: () => Relation;
|
|
6
|
+
/** `n = c * V`, moles in a volume of solution. Give V in cm3 and the conversion looks after itself. */
|
|
7
|
+
declare const molesFromSolution: () => Relation;
|
|
8
|
+
/** `n = N / L`, moles from a number of particles. */
|
|
9
|
+
declare const molesFromParticles: () => Relation;
|
|
10
|
+
/**
|
|
11
|
+
* `n = V / Vm`, moles of a gas from its volume at a stated molar volume.
|
|
12
|
+
*
|
|
13
|
+
* The molar volume is a variable rather than a constant baked in, because it is not one: it depends
|
|
14
|
+
* on temperature and pressure, and quoting 22.4 dm3/mol without saying "at standard temperature and
|
|
15
|
+
* pressure" is where a great many wrong answers begin.
|
|
16
|
+
*/
|
|
17
|
+
declare const molesFromGasVolume: () => Relation;
|
|
18
|
+
/** `P * V = n * R * T`, the ideal gas equation. Temperature in kelvin, as it must be. */
|
|
19
|
+
declare const idealGas: () => Relation;
|
|
20
|
+
/** `P1 * V1 / T1 = P2 * V2 / T2`, one gas under two sets of conditions. */
|
|
21
|
+
declare const combinedGasLaw: () => Relation;
|
|
22
|
+
/** `c = n / V`, concentration from moles and volume. */
|
|
23
|
+
declare const concentration: () => Relation;
|
|
24
|
+
/**
|
|
25
|
+
* `c1 * V1 = c2 * V2`, dilution.
|
|
26
|
+
*
|
|
27
|
+
* True because the moles do not change when water is added, which is the whole of the derivation
|
|
28
|
+
* and is worth saying every time it is used.
|
|
29
|
+
*/
|
|
30
|
+
declare const dilution: () => Relation;
|
|
31
|
+
/** `m_conc = c * V * M`, the mass to weigh out to make up a standard solution. */
|
|
32
|
+
declare const massForSolution: () => Relation;
|
|
33
|
+
/**
|
|
34
|
+
* `b = n / m_solvent`, molality: moles of solute per kilogram of SOLVENT.
|
|
35
|
+
*
|
|
36
|
+
* Not per kilogram of solution, and not per litre of anything. The distinction from molarity is the
|
|
37
|
+
* point of having both: molality uses a mass, so it does not change when the temperature does,
|
|
38
|
+
* which is why it is the one that appears in freezing point and boiling point work.
|
|
39
|
+
*/
|
|
40
|
+
declare const molality: () => Relation;
|
|
41
|
+
/** `rho = m / V`, density, which is what converts between a volume and a mass of solution. */
|
|
42
|
+
declare const density: () => Relation;
|
|
43
|
+
/**
|
|
44
|
+
* `A = eps * c * l`, the Beer-Lambert law.
|
|
45
|
+
*
|
|
46
|
+
* Absorbance is dimensionless: it is a logarithm of a ratio of intensities, so it has no unit, and
|
|
47
|
+
* the molar absorptivity carries whatever is needed to cancel the concentration and the path
|
|
48
|
+
* length. Declaring it that way is what lets the units check pass, and it is also the honest
|
|
49
|
+
* description of what absorbance is.
|
|
50
|
+
*
|
|
51
|
+
* Solving it for the concentration is the entire quantitative use of a colorimeter: measure the
|
|
52
|
+
* absorbance of a coloured solution, and read its concentration off.
|
|
53
|
+
*/
|
|
54
|
+
declare const beerLambert: () => Relation;
|
|
55
|
+
/**
|
|
56
|
+
* `A = log10(I0 / I)`, absorbance from the light that went in and the light that came out.
|
|
57
|
+
*
|
|
58
|
+
* The definition the law above is built on, and the reason absorbance has no unit.
|
|
59
|
+
*/
|
|
60
|
+
declare const absorbanceFromIntensity: () => Relation;
|
|
61
|
+
/** `q = m * c * dT`, the heat a measured temperature change accounts for. */
|
|
62
|
+
declare const heatEnergy: () => Relation;
|
|
63
|
+
/**
|
|
64
|
+
* The values these relations are usually fed, kept as data with their units attached.
|
|
65
|
+
*
|
|
66
|
+
* Passed in rather than compiled into the relations. A molar volume of 24 dm3/mol is only right at
|
|
67
|
+
* room temperature and 22.4 only at standard temperature and pressure, and a relation that hid
|
|
68
|
+
* either inside itself would give a confidently wrong answer under the other conditions.
|
|
69
|
+
*/
|
|
70
|
+
declare const CONSTANTS: {
|
|
71
|
+
/** Avogadro constant, per mole. */readonly avogadro: 6.02214076e+23; /** Molar gas constant, J per mole per kelvin. */
|
|
72
|
+
readonly gasConstant: number; /** Molar volume of an ideal gas at 273.15 K and 100 kPa, dm3 per mole. */
|
|
73
|
+
readonly molarVolumeStp: 22.7; /** Molar volume at 298 K and 100 kPa, dm3 per mole: the figure room-temperature questions use. */
|
|
74
|
+
readonly molarVolumeRoom: 24; /** Specific heat capacity of water, J per gram per kelvin. */
|
|
75
|
+
readonly waterHeatCapacity: 4.18;
|
|
76
|
+
};
|
|
77
|
+
/** Kelvin from degrees Celsius. One line, and the source of a great many wrong gas answers. */
|
|
78
|
+
declare const kelvinFrom: (celsius: number) => number;
|
|
79
|
+
/**
|
|
80
|
+
* The derivations, so a lesson can say why a formula is true and not only how to use it.
|
|
81
|
+
*
|
|
82
|
+
* Three kinds, and the difference between them is worth as much as the formulae. A definition has
|
|
83
|
+
* nothing underneath it. A derived relation follows from others plus something held fixed, and the
|
|
84
|
+
* chain is executable, so the claim is checked rather than asserted. A measured one was observed by
|
|
85
|
+
* somebody, and saying so is the difference between teaching chemistry and teaching a formula
|
|
86
|
+
* sheet.
|
|
87
|
+
*/
|
|
88
|
+
declare const DERIVATIONS: {
|
|
89
|
+
/**
|
|
90
|
+
* Dilution, the one everyone memorises and nobody can justify.
|
|
91
|
+
*
|
|
92
|
+
* The argument is three sentences long. Adding water changes the volume and changes the
|
|
93
|
+
* concentration, and does not change the number of moles. So `n = cV` holds at both ends with the
|
|
94
|
+
* same n, and that is the rule.
|
|
95
|
+
*/
|
|
96
|
+
readonly dilution: {
|
|
97
|
+
readonly kind: "derived";
|
|
98
|
+
readonly summary: "Adding water changes how much there is of the solution and how concentrated it is, and changes nothing about how much solute is in it.";
|
|
99
|
+
readonly invariant: "the number of moles of solute, which water does not create or destroy";
|
|
100
|
+
readonly arrivesAt: "c2";
|
|
101
|
+
readonly steps: readonly [{
|
|
102
|
+
readonly relation: () => Relation;
|
|
103
|
+
readonly solveFor: "n";
|
|
104
|
+
readonly using: {
|
|
105
|
+
readonly c: "c1";
|
|
106
|
+
readonly V: "V1";
|
|
107
|
+
};
|
|
108
|
+
readonly gives: "n";
|
|
109
|
+
readonly because: "first find how many moles the stock solution you measured out actually contains";
|
|
110
|
+
}, {
|
|
111
|
+
readonly relation: () => Relation;
|
|
112
|
+
readonly solveFor: "c";
|
|
113
|
+
readonly using: {
|
|
114
|
+
readonly n: "n";
|
|
115
|
+
readonly V: "V2";
|
|
116
|
+
};
|
|
117
|
+
readonly gives: "c2";
|
|
118
|
+
readonly because: "those same moles are now spread through the larger volume, so the concentration is what they make up in it";
|
|
119
|
+
}];
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* The mass to weigh out for a standard solution.
|
|
123
|
+
*
|
|
124
|
+
* Two definitions laid end to end, which is worth showing because learners meet it as a third
|
|
125
|
+
* formula rather than as the two they already have.
|
|
126
|
+
*/
|
|
127
|
+
readonly massForSolution: {
|
|
128
|
+
readonly kind: "derived";
|
|
129
|
+
readonly summary: "You cannot weigh out moles, so work out how many moles the solution needs and then what that many moles weigh.";
|
|
130
|
+
readonly invariant: "nothing is held fixed here: this is two definitions used one after the other";
|
|
131
|
+
readonly arrivesAt: "m";
|
|
132
|
+
readonly steps: readonly [{
|
|
133
|
+
readonly relation: () => Relation;
|
|
134
|
+
readonly solveFor: "n";
|
|
135
|
+
readonly using: {
|
|
136
|
+
readonly c: "c";
|
|
137
|
+
readonly V: "V";
|
|
138
|
+
};
|
|
139
|
+
readonly gives: "n";
|
|
140
|
+
readonly because: "the volume you are making up, at the concentration you want, needs this many moles";
|
|
141
|
+
}, {
|
|
142
|
+
readonly relation: () => Relation;
|
|
143
|
+
readonly solveFor: "m";
|
|
144
|
+
readonly using: {
|
|
145
|
+
readonly n: "n";
|
|
146
|
+
readonly M: "M";
|
|
147
|
+
};
|
|
148
|
+
readonly gives: "m";
|
|
149
|
+
readonly because: "and that many moles of this substance weigh this much, which is what goes on the balance";
|
|
150
|
+
}];
|
|
151
|
+
};
|
|
152
|
+
readonly concentration: {
|
|
153
|
+
readonly kind: "definition";
|
|
154
|
+
readonly summary: "Concentration is how many moles are dissolved in each unit of volume. That is what the word means.";
|
|
155
|
+
};
|
|
156
|
+
readonly molesFromMass: {
|
|
157
|
+
readonly kind: "definition";
|
|
158
|
+
readonly summary: "Molar mass is defined as the mass of one mole, so dividing a mass by it counts how many moles that mass is.";
|
|
159
|
+
};
|
|
160
|
+
/**
|
|
161
|
+
* The Beer-Lambert law, which is measured and is usually taught as though it were not.
|
|
162
|
+
*
|
|
163
|
+
* It is stated as a formula with no hint that anyone ever checked it, and it does in fact fail:
|
|
164
|
+
* at high concentrations absorbance stops rising in step, which is why a calibration curve is
|
|
165
|
+
* drawn and a sample too dark to read is diluted before it is measured.
|
|
166
|
+
*/
|
|
167
|
+
readonly beerLambert: {
|
|
168
|
+
readonly kind: "measured";
|
|
169
|
+
readonly summary: "Each layer of a solution takes the same FRACTION of the light reaching it, so the light left falls away multiplicatively and its logarithm falls in step with both the concentration and the distance travelled.";
|
|
170
|
+
readonly evidence: "Measured: double the concentration of a coloured solution, or double the length of the cell, and the absorbance doubles. It stops holding at high concentrations, which is why a calibration curve is plotted rather than assumed and why a dark sample is diluted before it is read.";
|
|
171
|
+
};
|
|
172
|
+
readonly idealGas: {
|
|
173
|
+
readonly kind: "measured";
|
|
174
|
+
readonly summary: "Pressure times volume divided by temperature comes to the same thing for any gas, once there is enough of it to average over and the particles are far enough apart to ignore each other.";
|
|
175
|
+
readonly evidence: "Measured, and by three separate people on three separate pairs of variables before anyone combined them. It is a limit rather than a law: every real gas departs from it as it is compressed or cooled toward its boiling point, which is exactly when its particles stop being far apart.";
|
|
176
|
+
};
|
|
177
|
+
readonly heatEnergy: {
|
|
178
|
+
readonly kind: "definition";
|
|
179
|
+
readonly summary: "Specific heat capacity is defined as the energy one gram needs to warm by one kelvin, so the total is that energy times the grams times the kelvin.";
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
//#endregion
|
|
183
|
+
export { CONSTANTS, DERIVATIONS, absorbanceFromIntensity, beerLambert, combinedGasLaw, concentration, density, dilution, heatEnergy, idealGas, kelvinFrom, massForSolution, molality, molesFromGasVolume, molesFromMass, molesFromParticles, molesFromSolution };
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { AVOGADRO, GAS_CONSTANT, ZERO_CELSIUS_K } from "../core/constants.mjs";
|
|
2
|
+
import { relation } from "../relation/index.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/chem/relations.ts
|
|
5
|
+
/**
|
|
6
|
+
* The quantitative relations of chemistry, declared once and solvable in any direction.
|
|
7
|
+
*
|
|
8
|
+
* ## Why declared and not written as functions
|
|
9
|
+
*
|
|
10
|
+
* A textbook ends its quantitative chapter with a page of formulae to memorise, each one written
|
|
11
|
+
* the way it is most often used and rearranged by hand whenever it is not. That page is the part
|
|
12
|
+
* learners photograph and the part they get wrong, because a formula written one way round has to
|
|
13
|
+
* be turned round under exam pressure.
|
|
14
|
+
*
|
|
15
|
+
* A relation has no preferred direction. `n = c * V` answers for the moles, the concentration or
|
|
16
|
+
* the volume, and it shows the rearrangement and the substitution while it does it. So instead of
|
|
17
|
+
* three functions per formula, and a fourth when someone needs the working, there is one
|
|
18
|
+
* declaration:
|
|
19
|
+
*
|
|
20
|
+
* ```ts
|
|
21
|
+
* MOLES_FROM_SOLUTION.solve({ c: 0.100, V: qty(24.50, 'cm3') }); // n, straight off the burette
|
|
22
|
+
* MOLES_FROM_SOLUTION.solve({ n: 2.45e-3, V: 0.0245 }); // c, the titration answer
|
|
23
|
+
* MOLES_FROM_SOLUTION.steps({ c: 0.100, V: 0.0245 }); // the working, line by line
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* ## Units are checked when the relation is declared
|
|
27
|
+
*
|
|
28
|
+
* A relation whose units do not balance is refused at declaration, before anything can be written
|
|
29
|
+
* against it. That matters more than it sounds: a wrong formula that lessons, labs and the marker
|
|
30
|
+
* all share is worse than no formula, because everything then agrees and everything is wrong.
|
|
31
|
+
*
|
|
32
|
+
* It also means a volume can be given in cubic centimetres against a concentration in mol per cubic
|
|
33
|
+
* decimetre, and the factor of a thousand sorts itself out. That single conversion is the most
|
|
34
|
+
* common arithmetic slip in volumetric analysis, and here it is not a step anyone performs.
|
|
35
|
+
*
|
|
36
|
+
* ## Declared lazily, so importing one does not build them all
|
|
37
|
+
*
|
|
38
|
+
* Each is behind a getter that builds it on first use and remembers it. Building nineteen relations
|
|
39
|
+
* at import time would parse nineteen expressions and run nineteen dimensional checks for a caller
|
|
40
|
+
* that wanted one, and would pin all of them into any bundle that touched this file.
|
|
41
|
+
*
|
|
42
|
+
* Pure: no React, no pixels.
|
|
43
|
+
*/
|
|
44
|
+
/** Build once, on first use. */
|
|
45
|
+
function lazy(build) {
|
|
46
|
+
let made;
|
|
47
|
+
return () => made ??= build();
|
|
48
|
+
}
|
|
49
|
+
/** `n = m / M`, moles from a mass weighed out. */
|
|
50
|
+
const molesFromMass = lazy(() => relation("n = m / M", {
|
|
51
|
+
n: "mol",
|
|
52
|
+
m: "g",
|
|
53
|
+
M: "g/mol"
|
|
54
|
+
}, "moles from mass"));
|
|
55
|
+
/** `n = c * V`, moles in a volume of solution. Give V in cm3 and the conversion looks after itself. */
|
|
56
|
+
const molesFromSolution = lazy(() => relation("n = c * V", {
|
|
57
|
+
n: "mol",
|
|
58
|
+
c: "mol/dm3",
|
|
59
|
+
V: "dm3"
|
|
60
|
+
}, "moles in a solution"));
|
|
61
|
+
/** `n = N / L`, moles from a number of particles. */
|
|
62
|
+
const molesFromParticles = lazy(() => relation("n = N / L", {
|
|
63
|
+
n: "mol",
|
|
64
|
+
N: "1",
|
|
65
|
+
L: "1/mol"
|
|
66
|
+
}, "moles from a particle count"));
|
|
67
|
+
/**
|
|
68
|
+
* `n = V / Vm`, moles of a gas from its volume at a stated molar volume.
|
|
69
|
+
*
|
|
70
|
+
* The molar volume is a variable rather than a constant baked in, because it is not one: it depends
|
|
71
|
+
* on temperature and pressure, and quoting 22.4 dm3/mol without saying "at standard temperature and
|
|
72
|
+
* pressure" is where a great many wrong answers begin.
|
|
73
|
+
*/
|
|
74
|
+
const molesFromGasVolume = lazy(() => relation("n = V / Vm", {
|
|
75
|
+
n: "mol",
|
|
76
|
+
V: "dm3",
|
|
77
|
+
Vm: "dm3/mol"
|
|
78
|
+
}, "moles of a gas"));
|
|
79
|
+
/** `P * V = n * R * T`, the ideal gas equation. Temperature in kelvin, as it must be. */
|
|
80
|
+
const idealGas = lazy(() => relation("P * V = n * R * T", {
|
|
81
|
+
P: "Pa",
|
|
82
|
+
V: "m3",
|
|
83
|
+
n: "mol",
|
|
84
|
+
R: "J/mol/K",
|
|
85
|
+
T: "K"
|
|
86
|
+
}, "the ideal gas equation"));
|
|
87
|
+
/** `P1 * V1 / T1 = P2 * V2 / T2`, one gas under two sets of conditions. */
|
|
88
|
+
const combinedGasLaw = lazy(() => relation("P1 * V1 / T1 = P2 * V2 / T2", {
|
|
89
|
+
P1: "Pa",
|
|
90
|
+
V1: "m3",
|
|
91
|
+
T1: "K",
|
|
92
|
+
P2: "Pa",
|
|
93
|
+
V2: "m3",
|
|
94
|
+
T2: "K"
|
|
95
|
+
}, "the combined gas law"));
|
|
96
|
+
/** `c = n / V`, concentration from moles and volume. */
|
|
97
|
+
const concentration = lazy(() => relation("c = n / V", {
|
|
98
|
+
c: "mol/dm3",
|
|
99
|
+
n: "mol",
|
|
100
|
+
V: "dm3"
|
|
101
|
+
}, "concentration"));
|
|
102
|
+
/**
|
|
103
|
+
* `c1 * V1 = c2 * V2`, dilution.
|
|
104
|
+
*
|
|
105
|
+
* True because the moles do not change when water is added, which is the whole of the derivation
|
|
106
|
+
* and is worth saying every time it is used.
|
|
107
|
+
*/
|
|
108
|
+
const dilution = lazy(() => relation("c1 * V1 = c2 * V2", {
|
|
109
|
+
c1: "mol/dm3",
|
|
110
|
+
V1: "dm3",
|
|
111
|
+
c2: "mol/dm3",
|
|
112
|
+
V2: "dm3"
|
|
113
|
+
}, "dilution"));
|
|
114
|
+
/** `m_conc = c * V * M`, the mass to weigh out to make up a standard solution. */
|
|
115
|
+
const massForSolution = lazy(() => relation("m = c * V * M", {
|
|
116
|
+
m: "g",
|
|
117
|
+
c: "mol/dm3",
|
|
118
|
+
V: "dm3",
|
|
119
|
+
M: "g/mol"
|
|
120
|
+
}, "mass for a standard solution"));
|
|
121
|
+
/**
|
|
122
|
+
* `b = n / m_solvent`, molality: moles of solute per kilogram of SOLVENT.
|
|
123
|
+
*
|
|
124
|
+
* Not per kilogram of solution, and not per litre of anything. The distinction from molarity is the
|
|
125
|
+
* point of having both: molality uses a mass, so it does not change when the temperature does,
|
|
126
|
+
* which is why it is the one that appears in freezing point and boiling point work.
|
|
127
|
+
*/
|
|
128
|
+
const molality = lazy(() => relation("b = n / ms", {
|
|
129
|
+
b: "mol/kg",
|
|
130
|
+
n: "mol",
|
|
131
|
+
ms: "kg"
|
|
132
|
+
}, "molality"));
|
|
133
|
+
/** `rho = m / V`, density, which is what converts between a volume and a mass of solution. */
|
|
134
|
+
const density = lazy(() => relation("rho = m / V", {
|
|
135
|
+
rho: "g/cm3",
|
|
136
|
+
m: "g",
|
|
137
|
+
V: "cm3"
|
|
138
|
+
}, "density"));
|
|
139
|
+
/**
|
|
140
|
+
* `A = eps * c * l`, the Beer-Lambert law.
|
|
141
|
+
*
|
|
142
|
+
* Absorbance is dimensionless: it is a logarithm of a ratio of intensities, so it has no unit, and
|
|
143
|
+
* the molar absorptivity carries whatever is needed to cancel the concentration and the path
|
|
144
|
+
* length. Declaring it that way is what lets the units check pass, and it is also the honest
|
|
145
|
+
* description of what absorbance is.
|
|
146
|
+
*
|
|
147
|
+
* Solving it for the concentration is the entire quantitative use of a colorimeter: measure the
|
|
148
|
+
* absorbance of a coloured solution, and read its concentration off.
|
|
149
|
+
*/
|
|
150
|
+
const beerLambert = lazy(() => relation("A = eps * c * l", {
|
|
151
|
+
A: "1",
|
|
152
|
+
eps: "dm3/mol/cm",
|
|
153
|
+
c: "mol/dm3",
|
|
154
|
+
l: "cm"
|
|
155
|
+
}, "the Beer-Lambert law"));
|
|
156
|
+
/**
|
|
157
|
+
* `A = log10(I0 / I)`, absorbance from the light that went in and the light that came out.
|
|
158
|
+
*
|
|
159
|
+
* The definition the law above is built on, and the reason absorbance has no unit.
|
|
160
|
+
*/
|
|
161
|
+
const absorbanceFromIntensity = lazy(() => relation("A = log10(I0 / I)", {
|
|
162
|
+
A: "1",
|
|
163
|
+
I0: "1",
|
|
164
|
+
I: "1"
|
|
165
|
+
}, "absorbance from transmitted light"));
|
|
166
|
+
/** `q = m * c * dT`, the heat a measured temperature change accounts for. */
|
|
167
|
+
const heatEnergy = lazy(() => relation("q = m * cs * dT", {
|
|
168
|
+
q: "J",
|
|
169
|
+
m: "g",
|
|
170
|
+
cs: "J/g/K",
|
|
171
|
+
dT: "K"
|
|
172
|
+
}, "heat from a temperature change"));
|
|
173
|
+
/**
|
|
174
|
+
* The values these relations are usually fed, kept as data with their units attached.
|
|
175
|
+
*
|
|
176
|
+
* Passed in rather than compiled into the relations. A molar volume of 24 dm3/mol is only right at
|
|
177
|
+
* room temperature and 22.4 only at standard temperature and pressure, and a relation that hid
|
|
178
|
+
* either inside itself would give a confidently wrong answer under the other conditions.
|
|
179
|
+
*/
|
|
180
|
+
const CONSTANTS = {
|
|
181
|
+
/** Avogadro constant, per mole. */
|
|
182
|
+
avogadro: AVOGADRO,
|
|
183
|
+
/** Molar gas constant, J per mole per kelvin. */
|
|
184
|
+
gasConstant: GAS_CONSTANT,
|
|
185
|
+
/** Molar volume of an ideal gas at 273.15 K and 100 kPa, dm3 per mole. */
|
|
186
|
+
molarVolumeStp: 22.7,
|
|
187
|
+
/** Molar volume at 298 K and 100 kPa, dm3 per mole: the figure room-temperature questions use. */
|
|
188
|
+
molarVolumeRoom: 24,
|
|
189
|
+
/** Specific heat capacity of water, J per gram per kelvin. */
|
|
190
|
+
waterHeatCapacity: 4.18
|
|
191
|
+
};
|
|
192
|
+
/** Kelvin from degrees Celsius. One line, and the source of a great many wrong gas answers. */
|
|
193
|
+
const kelvinFrom = (celsius) => celsius + ZERO_CELSIUS_K;
|
|
194
|
+
/**
|
|
195
|
+
* The derivations, so a lesson can say why a formula is true and not only how to use it.
|
|
196
|
+
*
|
|
197
|
+
* Three kinds, and the difference between them is worth as much as the formulae. A definition has
|
|
198
|
+
* nothing underneath it. A derived relation follows from others plus something held fixed, and the
|
|
199
|
+
* chain is executable, so the claim is checked rather than asserted. A measured one was observed by
|
|
200
|
+
* somebody, and saying so is the difference between teaching chemistry and teaching a formula
|
|
201
|
+
* sheet.
|
|
202
|
+
*/
|
|
203
|
+
const DERIVATIONS = {
|
|
204
|
+
/**
|
|
205
|
+
* Dilution, the one everyone memorises and nobody can justify.
|
|
206
|
+
*
|
|
207
|
+
* The argument is three sentences long. Adding water changes the volume and changes the
|
|
208
|
+
* concentration, and does not change the number of moles. So `n = cV` holds at both ends with the
|
|
209
|
+
* same n, and that is the rule.
|
|
210
|
+
*/
|
|
211
|
+
dilution: {
|
|
212
|
+
kind: "derived",
|
|
213
|
+
summary: "Adding water changes how much there is of the solution and how concentrated it is, and changes nothing about how much solute is in it.",
|
|
214
|
+
invariant: "the number of moles of solute, which water does not create or destroy",
|
|
215
|
+
arrivesAt: "c2",
|
|
216
|
+
steps: [{
|
|
217
|
+
relation: molesFromSolution,
|
|
218
|
+
solveFor: "n",
|
|
219
|
+
using: {
|
|
220
|
+
c: "c1",
|
|
221
|
+
V: "V1"
|
|
222
|
+
},
|
|
223
|
+
gives: "n",
|
|
224
|
+
because: "first find how many moles the stock solution you measured out actually contains"
|
|
225
|
+
}, {
|
|
226
|
+
relation: concentration,
|
|
227
|
+
solveFor: "c",
|
|
228
|
+
using: {
|
|
229
|
+
n: "n",
|
|
230
|
+
V: "V2"
|
|
231
|
+
},
|
|
232
|
+
gives: "c2",
|
|
233
|
+
because: "those same moles are now spread through the larger volume, so the concentration is what they make up in it"
|
|
234
|
+
}]
|
|
235
|
+
},
|
|
236
|
+
/**
|
|
237
|
+
* The mass to weigh out for a standard solution.
|
|
238
|
+
*
|
|
239
|
+
* Two definitions laid end to end, which is worth showing because learners meet it as a third
|
|
240
|
+
* formula rather than as the two they already have.
|
|
241
|
+
*/
|
|
242
|
+
massForSolution: {
|
|
243
|
+
kind: "derived",
|
|
244
|
+
summary: "You cannot weigh out moles, so work out how many moles the solution needs and then what that many moles weigh.",
|
|
245
|
+
invariant: "nothing is held fixed here: this is two definitions used one after the other",
|
|
246
|
+
arrivesAt: "m",
|
|
247
|
+
steps: [{
|
|
248
|
+
relation: molesFromSolution,
|
|
249
|
+
solveFor: "n",
|
|
250
|
+
using: {
|
|
251
|
+
c: "c",
|
|
252
|
+
V: "V"
|
|
253
|
+
},
|
|
254
|
+
gives: "n",
|
|
255
|
+
because: "the volume you are making up, at the concentration you want, needs this many moles"
|
|
256
|
+
}, {
|
|
257
|
+
relation: molesFromMass,
|
|
258
|
+
solveFor: "m",
|
|
259
|
+
using: {
|
|
260
|
+
n: "n",
|
|
261
|
+
M: "M"
|
|
262
|
+
},
|
|
263
|
+
gives: "m",
|
|
264
|
+
because: "and that many moles of this substance weigh this much, which is what goes on the balance"
|
|
265
|
+
}]
|
|
266
|
+
},
|
|
267
|
+
concentration: {
|
|
268
|
+
kind: "definition",
|
|
269
|
+
summary: "Concentration is how many moles are dissolved in each unit of volume. That is what the word means."
|
|
270
|
+
},
|
|
271
|
+
molesFromMass: {
|
|
272
|
+
kind: "definition",
|
|
273
|
+
summary: "Molar mass is defined as the mass of one mole, so dividing a mass by it counts how many moles that mass is."
|
|
274
|
+
},
|
|
275
|
+
/**
|
|
276
|
+
* The Beer-Lambert law, which is measured and is usually taught as though it were not.
|
|
277
|
+
*
|
|
278
|
+
* It is stated as a formula with no hint that anyone ever checked it, and it does in fact fail:
|
|
279
|
+
* at high concentrations absorbance stops rising in step, which is why a calibration curve is
|
|
280
|
+
* drawn and a sample too dark to read is diluted before it is measured.
|
|
281
|
+
*/
|
|
282
|
+
beerLambert: {
|
|
283
|
+
kind: "measured",
|
|
284
|
+
summary: "Each layer of a solution takes the same FRACTION of the light reaching it, so the light left falls away multiplicatively and its logarithm falls in step with both the concentration and the distance travelled.",
|
|
285
|
+
evidence: "Measured: double the concentration of a coloured solution, or double the length of the cell, and the absorbance doubles. It stops holding at high concentrations, which is why a calibration curve is plotted rather than assumed and why a dark sample is diluted before it is read."
|
|
286
|
+
},
|
|
287
|
+
idealGas: {
|
|
288
|
+
kind: "measured",
|
|
289
|
+
summary: "Pressure times volume divided by temperature comes to the same thing for any gas, once there is enough of it to average over and the particles are far enough apart to ignore each other.",
|
|
290
|
+
evidence: "Measured, and by three separate people on three separate pairs of variables before anyone combined them. It is a limit rather than a law: every real gas departs from it as it is compressed or cooled toward its boiling point, which is exactly when its particles stop being far apart."
|
|
291
|
+
},
|
|
292
|
+
heatEnergy: {
|
|
293
|
+
kind: "definition",
|
|
294
|
+
summary: "Specific heat capacity is defined as the energy one gram needs to warm by one kelvin, so the total is that energy times the grams times the kelvin."
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
//#endregion
|
|
299
|
+
export { CONSTANTS, DERIVATIONS, absorbanceFromIntensity, beerLambert, combinedGasLaw, concentration, density, dilution, heatEnergy, idealGas, kelvinFrom, massForSolution, molality, molesFromGasVolume, molesFromMass, molesFromParticles, molesFromSolution };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Structure } from "./molecule.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/chem/skeleton.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Atoms that lie on a ring, as one list per ring.
|
|
6
|
+
*
|
|
7
|
+
* Found by removing terminal atoms repeatedly: whatever survives is the ring system, because only a
|
|
8
|
+
* ring has no free end to peel. Simple, and right for the one-ring molecules this subset covers.
|
|
9
|
+
*/
|
|
10
|
+
declare function ringSystems(structure: Structure): number[][];
|
|
11
|
+
/**
|
|
12
|
+
* The longest chain through the structure, as atom ids in order.
|
|
13
|
+
*
|
|
14
|
+
* ## Which atoms count as backbone
|
|
15
|
+
*
|
|
16
|
+
* Every carbon, plus any heteroatom the chain RUNS THROUGH. The ester oxygen and the amide nitrogen
|
|
17
|
+
* are in the middle of a chain and are drawn in it; a carbonyl oxygen, a hydroxyl, an amine or a
|
|
18
|
+
* halogen hangs off the side and is drawn as a substituent.
|
|
19
|
+
*
|
|
20
|
+
* The test is how many bonds the atom has out into the skeleton, counting an open valence as one,
|
|
21
|
+
* because an open valence is where the chain continues into the next repeat unit. Two or more means
|
|
22
|
+
* the chain passes through.
|
|
23
|
+
*
|
|
24
|
+
* Restricting the walk to CARBON was the first version and it broke the thing this exists for: a
|
|
25
|
+
* nylon repeat unit is a chain of six carbons, an amide nitrogen and six more carbons, and a walk
|
|
26
|
+
* that could not cross the nitrogen reported half the molecule as one enormous substituent, which
|
|
27
|
+
* the drawing then collapsed into the label "C6H29N2".
|
|
28
|
+
*
|
|
29
|
+
* Ring atoms are excluded, because a ring is reported separately by {@link backboneOf}.
|
|
30
|
+
*/
|
|
31
|
+
declare function longestChain(structure: Structure): number[];
|
|
32
|
+
interface Backbone {
|
|
33
|
+
/** The atoms drawn across the page, in order. */
|
|
34
|
+
readonly atoms: readonly number[];
|
|
35
|
+
/** The backbone is a closed ring rather than an open chain. */
|
|
36
|
+
readonly ring: boolean;
|
|
37
|
+
/** True when the ring is aromatic, so it takes a circle rather than alternating bonds. */
|
|
38
|
+
readonly aromatic: boolean;
|
|
39
|
+
/** Everything else, grouped by which backbone atom it hangs from. */
|
|
40
|
+
readonly branches: ReadonlyMap<number, readonly number[]>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The backbone and its branches.
|
|
44
|
+
*
|
|
45
|
+
* A branch is every atom reachable from a backbone atom without going back through the backbone, so
|
|
46
|
+
* a carboxyl group on a ring comes back as three atoms attached at one vertex rather than as three
|
|
47
|
+
* unrelated neighbours.
|
|
48
|
+
*/
|
|
49
|
+
declare function backboneOf(structure: Structure): Backbone;
|
|
50
|
+
//#endregion
|
|
51
|
+
export { Backbone, backboneOf, longestChain, ringSystems };
|