图片解析应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
13 KiB

  1. """
  2. SI unit system.
  3. Based on MKSA, which stands for "meter, kilogram, second, ampere".
  4. Added kelvin, candela and mole.
  5. """
  6. from typing import List
  7. from sympy.physics.units import DimensionSystem, Dimension, dHg0
  8. from sympy.physics.units.quantities import Quantity
  9. from sympy.core.numbers import (Rational, pi)
  10. from sympy.core.singleton import S
  11. from sympy.functions.elementary.miscellaneous import sqrt
  12. from sympy.physics.units.definitions.dimension_definitions import (
  13. acceleration, action, current, impedance, length, mass, time, velocity,
  14. amount_of_substance, temperature, information, frequency, force, pressure,
  15. energy, power, charge, voltage, capacitance, conductance, magnetic_flux,
  16. magnetic_density, inductance, luminous_intensity
  17. )
  18. from sympy.physics.units.definitions import (
  19. kilogram, newton, second, meter, gram, cd, K, joule, watt, pascal, hertz,
  20. coulomb, volt, ohm, siemens, farad, henry, tesla, weber, dioptre, lux,
  21. katal, gray, becquerel, inch, liter, julian_year, gravitational_constant,
  22. speed_of_light, elementary_charge, planck, hbar, electronvolt,
  23. avogadro_number, avogadro_constant, boltzmann_constant,
  24. stefan_boltzmann_constant, atomic_mass_constant, molar_gas_constant,
  25. faraday_constant, josephson_constant, von_klitzing_constant,
  26. acceleration_due_to_gravity, magnetic_constant, vacuum_permittivity,
  27. vacuum_impedance, coulomb_constant, atmosphere, bar, pound, psi, mmHg,
  28. milli_mass_unit, quart, lightyear, astronomical_unit, planck_mass,
  29. planck_time, planck_temperature, planck_length, planck_charge, planck_area,
  30. planck_volume, planck_momentum, planck_energy, planck_force, planck_power,
  31. planck_density, planck_energy_density, planck_intensity,
  32. planck_angular_frequency, planck_pressure, planck_current, planck_voltage,
  33. planck_impedance, planck_acceleration, bit, byte, kibibyte, mebibyte,
  34. gibibyte, tebibyte, pebibyte, exbibyte, curie, rutherford, radian, degree,
  35. steradian, angular_mil, atomic_mass_unit, gee, kPa, ampere, u0, c, kelvin,
  36. mol, mole, candela, m, kg, s, electric_constant, G, boltzmann
  37. )
  38. from sympy.physics.units.prefixes import PREFIXES, prefix_unit
  39. from sympy.physics.units.systems.mksa import MKSA, dimsys_MKSA
  40. derived_dims = (frequency, force, pressure, energy, power, charge, voltage,
  41. capacitance, conductance, magnetic_flux,
  42. magnetic_density, inductance, luminous_intensity)
  43. base_dims = (amount_of_substance, luminous_intensity, temperature)
  44. units = [mol, cd, K, lux, hertz, newton, pascal, joule, watt, coulomb, volt,
  45. farad, ohm, siemens, weber, tesla, henry, candela, lux, becquerel,
  46. gray, katal]
  47. all_units = [] # type: List[Quantity]
  48. for u in units:
  49. all_units.extend(prefix_unit(u, PREFIXES))
  50. all_units.extend([mol, cd, K, lux])
  51. dimsys_SI = dimsys_MKSA.extend(
  52. [
  53. # Dimensional dependencies for other base dimensions:
  54. temperature,
  55. amount_of_substance,
  56. luminous_intensity,
  57. ])
  58. dimsys_default = dimsys_SI.extend(
  59. [information],
  60. )
  61. SI = MKSA.extend(base=(mol, cd, K), units=all_units, name='SI', dimension_system=dimsys_SI)
  62. One = S.One
  63. SI.set_quantity_dimension(radian, One)
  64. SI.set_quantity_scale_factor(ampere, One)
  65. SI.set_quantity_scale_factor(kelvin, One)
  66. SI.set_quantity_scale_factor(mole, One)
  67. SI.set_quantity_scale_factor(candela, One)
  68. # MKSA extension to MKS: derived units
  69. SI.set_quantity_scale_factor(coulomb, One)
  70. SI.set_quantity_scale_factor(volt, joule/coulomb)
  71. SI.set_quantity_scale_factor(ohm, volt/ampere)
  72. SI.set_quantity_scale_factor(siemens, ampere/volt)
  73. SI.set_quantity_scale_factor(farad, coulomb/volt)
  74. SI.set_quantity_scale_factor(henry, volt*second/ampere)
  75. SI.set_quantity_scale_factor(tesla, volt*second/meter**2)
  76. SI.set_quantity_scale_factor(weber, joule/ampere)
  77. SI.set_quantity_dimension(lux, luminous_intensity / length ** 2)
  78. SI.set_quantity_scale_factor(lux, steradian*candela/meter**2)
  79. # katal is the SI unit of catalytic activity
  80. SI.set_quantity_dimension(katal, amount_of_substance / time)
  81. SI.set_quantity_scale_factor(katal, mol/second)
  82. # gray is the SI unit of absorbed dose
  83. SI.set_quantity_dimension(gray, energy / mass)
  84. SI.set_quantity_scale_factor(gray, meter**2/second**2)
  85. # becquerel is the SI unit of radioactivity
  86. SI.set_quantity_dimension(becquerel, 1 / time)
  87. SI.set_quantity_scale_factor(becquerel, 1/second)
  88. #### CONSTANTS ####
  89. # elementary charge
  90. # REF: NIST SP 959 (June 2019)
  91. SI.set_quantity_dimension(elementary_charge, charge)
  92. SI.set_quantity_scale_factor(elementary_charge, 1.602176634e-19*coulomb)
  93. # Electronvolt
  94. # REF: NIST SP 959 (June 2019)
  95. SI.set_quantity_dimension(electronvolt, energy)
  96. SI.set_quantity_scale_factor(electronvolt, 1.602176634e-19*joule)
  97. # Avogadro number
  98. # REF: NIST SP 959 (June 2019)
  99. SI.set_quantity_dimension(avogadro_number, One)
  100. SI.set_quantity_scale_factor(avogadro_number, 6.02214076e23)
  101. # Avogadro constant
  102. SI.set_quantity_dimension(avogadro_constant, amount_of_substance ** -1)
  103. SI.set_quantity_scale_factor(avogadro_constant, avogadro_number / mol)
  104. # Boltzmann constant
  105. # REF: NIST SP 959 (June 2019)
  106. SI.set_quantity_dimension(boltzmann_constant, energy / temperature)
  107. SI.set_quantity_scale_factor(boltzmann_constant, 1.380649e-23*joule/kelvin)
  108. # Stefan-Boltzmann constant
  109. # REF: NIST SP 959 (June 2019)
  110. SI.set_quantity_dimension(stefan_boltzmann_constant, energy * time ** -1 * length ** -2 * temperature ** -4)
  111. SI.set_quantity_scale_factor(stefan_boltzmann_constant, pi**2 * boltzmann_constant**4 / (60 * hbar**3 * speed_of_light ** 2))
  112. # Atomic mass
  113. # REF: NIST SP 959 (June 2019)
  114. SI.set_quantity_dimension(atomic_mass_constant, mass)
  115. SI.set_quantity_scale_factor(atomic_mass_constant, 1.66053906660e-24*gram)
  116. # Molar gas constant
  117. # REF: NIST SP 959 (June 2019)
  118. SI.set_quantity_dimension(molar_gas_constant, energy / (temperature * amount_of_substance))
  119. SI.set_quantity_scale_factor(molar_gas_constant, boltzmann_constant * avogadro_constant)
  120. # Faraday constant
  121. SI.set_quantity_dimension(faraday_constant, charge / amount_of_substance)
  122. SI.set_quantity_scale_factor(faraday_constant, elementary_charge * avogadro_constant)
  123. # Josephson constant
  124. SI.set_quantity_dimension(josephson_constant, frequency / voltage)
  125. SI.set_quantity_scale_factor(josephson_constant, 0.5 * planck / elementary_charge)
  126. # Von Klitzing constant
  127. SI.set_quantity_dimension(von_klitzing_constant, voltage / current)
  128. SI.set_quantity_scale_factor(von_klitzing_constant, hbar / elementary_charge ** 2)
  129. # Acceleration due to gravity (on the Earth surface)
  130. SI.set_quantity_dimension(acceleration_due_to_gravity, acceleration)
  131. SI.set_quantity_scale_factor(acceleration_due_to_gravity, 9.80665*meter/second**2)
  132. # magnetic constant:
  133. SI.set_quantity_dimension(magnetic_constant, force / current ** 2)
  134. SI.set_quantity_scale_factor(magnetic_constant, 4*pi/10**7 * newton/ampere**2)
  135. # electric constant:
  136. SI.set_quantity_dimension(vacuum_permittivity, capacitance / length)
  137. SI.set_quantity_scale_factor(vacuum_permittivity, 1/(u0 * c**2))
  138. # vacuum impedance:
  139. SI.set_quantity_dimension(vacuum_impedance, impedance)
  140. SI.set_quantity_scale_factor(vacuum_impedance, u0 * c)
  141. # Coulomb's constant:
  142. SI.set_quantity_dimension(coulomb_constant, force * length ** 2 / charge ** 2)
  143. SI.set_quantity_scale_factor(coulomb_constant, 1/(4*pi*vacuum_permittivity))
  144. SI.set_quantity_dimension(psi, pressure)
  145. SI.set_quantity_scale_factor(psi, pound * gee / inch ** 2)
  146. SI.set_quantity_dimension(mmHg, pressure)
  147. SI.set_quantity_scale_factor(mmHg, dHg0 * acceleration_due_to_gravity * kilogram / meter**2)
  148. SI.set_quantity_dimension(milli_mass_unit, mass)
  149. SI.set_quantity_scale_factor(milli_mass_unit, atomic_mass_unit/1000)
  150. SI.set_quantity_dimension(quart, length ** 3)
  151. SI.set_quantity_scale_factor(quart, Rational(231, 4) * inch**3)
  152. # Other convenient units and magnitudes
  153. SI.set_quantity_dimension(lightyear, length)
  154. SI.set_quantity_scale_factor(lightyear, speed_of_light*julian_year)
  155. SI.set_quantity_dimension(astronomical_unit, length)
  156. SI.set_quantity_scale_factor(astronomical_unit, 149597870691*meter)
  157. # Fundamental Planck units:
  158. SI.set_quantity_dimension(planck_mass, mass)
  159. SI.set_quantity_scale_factor(planck_mass, sqrt(hbar*speed_of_light/G))
  160. SI.set_quantity_dimension(planck_time, time)
  161. SI.set_quantity_scale_factor(planck_time, sqrt(hbar*G/speed_of_light**5))
  162. SI.set_quantity_dimension(planck_temperature, temperature)
  163. SI.set_quantity_scale_factor(planck_temperature, sqrt(hbar*speed_of_light**5/G/boltzmann**2))
  164. SI.set_quantity_dimension(planck_length, length)
  165. SI.set_quantity_scale_factor(planck_length, sqrt(hbar*G/speed_of_light**3))
  166. SI.set_quantity_dimension(planck_charge, charge)
  167. SI.set_quantity_scale_factor(planck_charge, sqrt(4*pi*electric_constant*hbar*speed_of_light))
  168. # Derived Planck units:
  169. SI.set_quantity_dimension(planck_area, length ** 2)
  170. SI.set_quantity_scale_factor(planck_area, planck_length**2)
  171. SI.set_quantity_dimension(planck_volume, length ** 3)
  172. SI.set_quantity_scale_factor(planck_volume, planck_length**3)
  173. SI.set_quantity_dimension(planck_momentum, mass * velocity)
  174. SI.set_quantity_scale_factor(planck_momentum, planck_mass * speed_of_light)
  175. SI.set_quantity_dimension(planck_energy, energy)
  176. SI.set_quantity_scale_factor(planck_energy, planck_mass * speed_of_light**2)
  177. SI.set_quantity_dimension(planck_force, force)
  178. SI.set_quantity_scale_factor(planck_force, planck_energy / planck_length)
  179. SI.set_quantity_dimension(planck_power, power)
  180. SI.set_quantity_scale_factor(planck_power, planck_energy / planck_time)
  181. SI.set_quantity_dimension(planck_density, mass / length ** 3)
  182. SI.set_quantity_scale_factor(planck_density, planck_mass / planck_length**3)
  183. SI.set_quantity_dimension(planck_energy_density, energy / length ** 3)
  184. SI.set_quantity_scale_factor(planck_energy_density, planck_energy / planck_length**3)
  185. SI.set_quantity_dimension(planck_intensity, mass * time ** (-3))
  186. SI.set_quantity_scale_factor(planck_intensity, planck_energy_density * speed_of_light)
  187. SI.set_quantity_dimension(planck_angular_frequency, 1 / time)
  188. SI.set_quantity_scale_factor(planck_angular_frequency, 1 / planck_time)
  189. SI.set_quantity_dimension(planck_pressure, pressure)
  190. SI.set_quantity_scale_factor(planck_pressure, planck_force / planck_length**2)
  191. SI.set_quantity_dimension(planck_current, current)
  192. SI.set_quantity_scale_factor(planck_current, planck_charge / planck_time)
  193. SI.set_quantity_dimension(planck_voltage, voltage)
  194. SI.set_quantity_scale_factor(planck_voltage, planck_energy / planck_charge)
  195. SI.set_quantity_dimension(planck_impedance, impedance)
  196. SI.set_quantity_scale_factor(planck_impedance, planck_voltage / planck_current)
  197. SI.set_quantity_dimension(planck_acceleration, acceleration)
  198. SI.set_quantity_scale_factor(planck_acceleration, speed_of_light / planck_time)
  199. # Older units for radioactivity
  200. SI.set_quantity_dimension(curie, 1 / time)
  201. SI.set_quantity_scale_factor(curie, 37000000000*becquerel)
  202. SI.set_quantity_dimension(rutherford, 1 / time)
  203. SI.set_quantity_scale_factor(rutherford, 1000000*becquerel)
  204. # check that scale factors are the right SI dimensions:
  205. for _scale_factor, _dimension in zip(
  206. SI._quantity_scale_factors.values(),
  207. SI._quantity_dimension_map.values()
  208. ):
  209. dimex = SI.get_dimensional_expr(_scale_factor)
  210. if dimex != 1:
  211. # XXX: equivalent_dims is an instance method taking two arguments in
  212. # addition to self so this can not work:
  213. if not DimensionSystem.equivalent_dims(_dimension, Dimension(dimex)): # type: ignore
  214. raise ValueError("quantity value and dimension mismatch")
  215. del _scale_factor, _dimension
  216. __all__ = [
  217. 'mmHg', 'atmosphere', 'inductance', 'newton', 'meter',
  218. 'vacuum_permittivity', 'pascal', 'magnetic_constant', 'voltage',
  219. 'angular_mil', 'luminous_intensity', 'all_units',
  220. 'julian_year', 'weber', 'exbibyte', 'liter',
  221. 'molar_gas_constant', 'faraday_constant', 'avogadro_constant',
  222. 'lightyear', 'planck_density', 'gee', 'mol', 'bit', 'gray',
  223. 'planck_momentum', 'bar', 'magnetic_density', 'prefix_unit', 'PREFIXES',
  224. 'planck_time', 'dimex', 'gram', 'candela', 'force', 'planck_intensity',
  225. 'energy', 'becquerel', 'planck_acceleration', 'speed_of_light',
  226. 'conductance', 'frequency', 'coulomb_constant', 'degree', 'lux', 'planck',
  227. 'current', 'planck_current', 'tebibyte', 'planck_power', 'MKSA', 'power',
  228. 'K', 'planck_volume', 'quart', 'pressure', 'amount_of_substance',
  229. 'joule', 'boltzmann_constant', 'Dimension', 'c', 'planck_force', 'length',
  230. 'watt', 'action', 'hbar', 'gibibyte', 'DimensionSystem', 'cd', 'volt',
  231. 'planck_charge', 'dioptre', 'vacuum_impedance', 'dimsys_default', 'farad',
  232. 'charge', 'gravitational_constant', 'temperature', 'u0', 'hertz',
  233. 'capacitance', 'tesla', 'steradian', 'planck_mass', 'josephson_constant',
  234. 'planck_area', 'stefan_boltzmann_constant', 'base_dims',
  235. 'astronomical_unit', 'radian', 'planck_voltage', 'impedance',
  236. 'planck_energy', 'atomic_mass_constant', 'rutherford', 'second', 'inch',
  237. 'elementary_charge', 'SI', 'electronvolt', 'dimsys_SI', 'henry',
  238. 'planck_angular_frequency', 'ohm', 'pound', 'planck_pressure', 'G', 'psi',
  239. 'dHg0', 'von_klitzing_constant', 'planck_length', 'avogadro_number',
  240. 'mole', 'acceleration', 'information', 'planck_energy_density',
  241. 'mebibyte', 's', 'acceleration_due_to_gravity',
  242. 'planck_temperature', 'units', 'mass', 'dimsys_MKSA', 'kelvin', 'kPa',
  243. 'boltzmann', 'milli_mass_unit', 'planck_impedance', 'electric_constant',
  244. 'derived_dims', 'kg', 'coulomb', 'siemens', 'byte', 'magnetic_flux',
  245. 'atomic_mass_unit', 'm', 'kibibyte', 'kilogram', 'One', 'curie', 'u',
  246. 'time', 'pebibyte', 'velocity', 'ampere', 'katal',
  247. ]