Coverage for /usr/lib/python3/dist-packages/sympy/physics/units/systems/si.py: 99%

140 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-14 15:55 +0200

1""" 

2SI unit system. 

3Based on MKSA, which stands for "meter, kilogram, second, ampere". 

4Added kelvin, candela and mole. 

5 

6""" 

7 

8from __future__ import annotations 

9 

10from sympy.physics.units import DimensionSystem, Dimension, dHg0 

11 

12from sympy.physics.units.quantities import Quantity 

13 

14from sympy.core.numbers import (Rational, pi) 

15from sympy.core.singleton import S 

16from sympy.functions.elementary.miscellaneous import sqrt 

17from sympy.physics.units.definitions.dimension_definitions import ( 

18 acceleration, action, current, impedance, length, mass, time, velocity, 

19 amount_of_substance, temperature, information, frequency, force, pressure, 

20 energy, power, charge, voltage, capacitance, conductance, magnetic_flux, 

21 magnetic_density, inductance, luminous_intensity 

22) 

23from sympy.physics.units.definitions import ( 

24 kilogram, newton, second, meter, gram, cd, K, joule, watt, pascal, hertz, 

25 coulomb, volt, ohm, siemens, farad, henry, tesla, weber, dioptre, lux, 

26 katal, gray, becquerel, inch, liter, julian_year, gravitational_constant, 

27 speed_of_light, elementary_charge, planck, hbar, electronvolt, 

28 avogadro_number, avogadro_constant, boltzmann_constant, electron_rest_mass, 

29 stefan_boltzmann_constant, Da, atomic_mass_constant, molar_gas_constant, 

30 faraday_constant, josephson_constant, von_klitzing_constant, 

31 acceleration_due_to_gravity, magnetic_constant, vacuum_permittivity, 

32 vacuum_impedance, coulomb_constant, atmosphere, bar, pound, psi, mmHg, 

33 milli_mass_unit, quart, lightyear, astronomical_unit, planck_mass, 

34 planck_time, planck_temperature, planck_length, planck_charge, planck_area, 

35 planck_volume, planck_momentum, planck_energy, planck_force, planck_power, 

36 planck_density, planck_energy_density, planck_intensity, 

37 planck_angular_frequency, planck_pressure, planck_current, planck_voltage, 

38 planck_impedance, planck_acceleration, bit, byte, kibibyte, mebibyte, 

39 gibibyte, tebibyte, pebibyte, exbibyte, curie, rutherford, radian, degree, 

40 steradian, angular_mil, atomic_mass_unit, gee, kPa, ampere, u0, c, kelvin, 

41 mol, mole, candela, m, kg, s, electric_constant, G, boltzmann 

42) 

43from sympy.physics.units.prefixes import PREFIXES, prefix_unit 

44from sympy.physics.units.systems.mksa import MKSA, dimsys_MKSA 

45 

46derived_dims = (frequency, force, pressure, energy, power, charge, voltage, 

47 capacitance, conductance, magnetic_flux, 

48 magnetic_density, inductance, luminous_intensity) 

49base_dims = (amount_of_substance, luminous_intensity, temperature) 

50 

51units = [mol, cd, K, lux, hertz, newton, pascal, joule, watt, coulomb, volt, 

52 farad, ohm, siemens, weber, tesla, henry, candela, lux, becquerel, 

53 gray, katal] 

54 

55all_units: list[Quantity] = [] 

56for u in units: 

57 all_units.extend(prefix_unit(u, PREFIXES)) 

58 

59all_units.extend(units) 

60all_units.extend([mol, cd, K, lux]) 

61 

62 

63dimsys_SI = dimsys_MKSA.extend( 

64 [ 

65 # Dimensional dependencies for other base dimensions: 

66 temperature, 

67 amount_of_substance, 

68 luminous_intensity, 

69 ]) 

70 

71dimsys_default = dimsys_SI.extend( 

72 [information], 

73) 

74 

75SI = MKSA.extend(base=(mol, cd, K), units=all_units, name='SI', dimension_system=dimsys_SI, derived_units={ 

76 power: watt, 

77 magnetic_flux: weber, 

78 time: second, 

79 impedance: ohm, 

80 pressure: pascal, 

81 current: ampere, 

82 voltage: volt, 

83 length: meter, 

84 frequency: hertz, 

85 inductance: henry, 

86 temperature: kelvin, 

87 amount_of_substance: mole, 

88 luminous_intensity: candela, 

89 conductance: siemens, 

90 mass: kilogram, 

91 magnetic_density: tesla, 

92 charge: coulomb, 

93 force: newton, 

94 capacitance: farad, 

95 energy: joule, 

96 velocity: meter/second, 

97}) 

98 

99One = S.One 

100 

101SI.set_quantity_dimension(radian, One) 

102 

103SI.set_quantity_scale_factor(ampere, One) 

104 

105SI.set_quantity_scale_factor(kelvin, One) 

106 

107SI.set_quantity_scale_factor(mole, One) 

108 

109SI.set_quantity_scale_factor(candela, One) 

110 

111# MKSA extension to MKS: derived units 

112 

113SI.set_quantity_scale_factor(coulomb, One) 

114 

115SI.set_quantity_scale_factor(volt, joule/coulomb) 

116 

117SI.set_quantity_scale_factor(ohm, volt/ampere) 

118 

119SI.set_quantity_scale_factor(siemens, ampere/volt) 

120 

121SI.set_quantity_scale_factor(farad, coulomb/volt) 

122 

123SI.set_quantity_scale_factor(henry, volt*second/ampere) 

124 

125SI.set_quantity_scale_factor(tesla, volt*second/meter**2) 

126 

127SI.set_quantity_scale_factor(weber, joule/ampere) 

128 

129 

130SI.set_quantity_dimension(lux, luminous_intensity / length ** 2) 

131SI.set_quantity_scale_factor(lux, steradian*candela/meter**2) 

132 

133# katal is the SI unit of catalytic activity 

134 

135SI.set_quantity_dimension(katal, amount_of_substance / time) 

136SI.set_quantity_scale_factor(katal, mol/second) 

137 

138# gray is the SI unit of absorbed dose 

139 

140SI.set_quantity_dimension(gray, energy / mass) 

141SI.set_quantity_scale_factor(gray, meter**2/second**2) 

142 

143# becquerel is the SI unit of radioactivity 

144 

145SI.set_quantity_dimension(becquerel, 1 / time) 

146SI.set_quantity_scale_factor(becquerel, 1/second) 

147 

148#### CONSTANTS #### 

149 

150# elementary charge 

151# REF: NIST SP 959 (June 2019) 

152 

153SI.set_quantity_dimension(elementary_charge, charge) 

154SI.set_quantity_scale_factor(elementary_charge, 1.602176634e-19*coulomb) 

155 

156# Electronvolt 

157# REF: NIST SP 959 (June 2019) 

158 

159SI.set_quantity_dimension(electronvolt, energy) 

160SI.set_quantity_scale_factor(electronvolt, 1.602176634e-19*joule) 

161 

162# Avogadro number 

163# REF: NIST SP 959 (June 2019) 

164 

165SI.set_quantity_dimension(avogadro_number, One) 

166SI.set_quantity_scale_factor(avogadro_number, 6.02214076e23) 

167 

168# Avogadro constant 

169 

170SI.set_quantity_dimension(avogadro_constant, amount_of_substance ** -1) 

171SI.set_quantity_scale_factor(avogadro_constant, avogadro_number / mol) 

172 

173# Boltzmann constant 

174# REF: NIST SP 959 (June 2019) 

175 

176SI.set_quantity_dimension(boltzmann_constant, energy / temperature) 

177SI.set_quantity_scale_factor(boltzmann_constant, 1.380649e-23*joule/kelvin) 

178 

179# Stefan-Boltzmann constant 

180# REF: NIST SP 959 (June 2019) 

181 

182SI.set_quantity_dimension(stefan_boltzmann_constant, energy * time ** -1 * length ** -2 * temperature ** -4) 

183SI.set_quantity_scale_factor(stefan_boltzmann_constant, pi**2 * boltzmann_constant**4 / (60 * hbar**3 * speed_of_light ** 2)) 

184 

185# Atomic mass 

186# REF: NIST SP 959 (June 2019) 

187 

188SI.set_quantity_dimension(atomic_mass_constant, mass) 

189SI.set_quantity_scale_factor(atomic_mass_constant, 1.66053906660e-24*gram) 

190 

191# Molar gas constant 

192# REF: NIST SP 959 (June 2019) 

193 

194SI.set_quantity_dimension(molar_gas_constant, energy / (temperature * amount_of_substance)) 

195SI.set_quantity_scale_factor(molar_gas_constant, boltzmann_constant * avogadro_constant) 

196 

197# Faraday constant 

198 

199SI.set_quantity_dimension(faraday_constant, charge / amount_of_substance) 

200SI.set_quantity_scale_factor(faraday_constant, elementary_charge * avogadro_constant) 

201 

202# Josephson constant 

203 

204SI.set_quantity_dimension(josephson_constant, frequency / voltage) 

205SI.set_quantity_scale_factor(josephson_constant, 0.5 * planck / elementary_charge) 

206 

207# Von Klitzing constant 

208 

209SI.set_quantity_dimension(von_klitzing_constant, voltage / current) 

210SI.set_quantity_scale_factor(von_klitzing_constant, hbar / elementary_charge ** 2) 

211 

212# Acceleration due to gravity (on the Earth surface) 

213 

214SI.set_quantity_dimension(acceleration_due_to_gravity, acceleration) 

215SI.set_quantity_scale_factor(acceleration_due_to_gravity, 9.80665*meter/second**2) 

216 

217# magnetic constant: 

218 

219SI.set_quantity_dimension(magnetic_constant, force / current ** 2) 

220SI.set_quantity_scale_factor(magnetic_constant, 4*pi/10**7 * newton/ampere**2) 

221 

222# electric constant: 

223 

224SI.set_quantity_dimension(vacuum_permittivity, capacitance / length) 

225SI.set_quantity_scale_factor(vacuum_permittivity, 1/(u0 * c**2)) 

226 

227# vacuum impedance: 

228 

229SI.set_quantity_dimension(vacuum_impedance, impedance) 

230SI.set_quantity_scale_factor(vacuum_impedance, u0 * c) 

231 

232# Electron rest mass 

233SI.set_quantity_dimension(electron_rest_mass, mass) 

234SI.set_quantity_scale_factor(electron_rest_mass, 9.1093837015e-31*kilogram) 

235 

236# Coulomb's constant: 

237SI.set_quantity_dimension(coulomb_constant, force * length ** 2 / charge ** 2) 

238SI.set_quantity_scale_factor(coulomb_constant, 1/(4*pi*vacuum_permittivity)) 

239 

240SI.set_quantity_dimension(psi, pressure) 

241SI.set_quantity_scale_factor(psi, pound * gee / inch ** 2) 

242 

243SI.set_quantity_dimension(mmHg, pressure) 

244SI.set_quantity_scale_factor(mmHg, dHg0 * acceleration_due_to_gravity * kilogram / meter**2) 

245 

246SI.set_quantity_dimension(milli_mass_unit, mass) 

247SI.set_quantity_scale_factor(milli_mass_unit, atomic_mass_unit/1000) 

248 

249SI.set_quantity_dimension(quart, length ** 3) 

250SI.set_quantity_scale_factor(quart, Rational(231, 4) * inch**3) 

251 

252# Other convenient units and magnitudes 

253 

254SI.set_quantity_dimension(lightyear, length) 

255SI.set_quantity_scale_factor(lightyear, speed_of_light*julian_year) 

256 

257SI.set_quantity_dimension(astronomical_unit, length) 

258SI.set_quantity_scale_factor(astronomical_unit, 149597870691*meter) 

259 

260# Fundamental Planck units: 

261 

262SI.set_quantity_dimension(planck_mass, mass) 

263SI.set_quantity_scale_factor(planck_mass, sqrt(hbar*speed_of_light/G)) 

264 

265SI.set_quantity_dimension(planck_time, time) 

266SI.set_quantity_scale_factor(planck_time, sqrt(hbar*G/speed_of_light**5)) 

267 

268SI.set_quantity_dimension(planck_temperature, temperature) 

269SI.set_quantity_scale_factor(planck_temperature, sqrt(hbar*speed_of_light**5/G/boltzmann**2)) 

270 

271SI.set_quantity_dimension(planck_length, length) 

272SI.set_quantity_scale_factor(planck_length, sqrt(hbar*G/speed_of_light**3)) 

273 

274SI.set_quantity_dimension(planck_charge, charge) 

275SI.set_quantity_scale_factor(planck_charge, sqrt(4*pi*electric_constant*hbar*speed_of_light)) 

276 

277# Derived Planck units: 

278 

279SI.set_quantity_dimension(planck_area, length ** 2) 

280SI.set_quantity_scale_factor(planck_area, planck_length**2) 

281 

282SI.set_quantity_dimension(planck_volume, length ** 3) 

283SI.set_quantity_scale_factor(planck_volume, planck_length**3) 

284 

285SI.set_quantity_dimension(planck_momentum, mass * velocity) 

286SI.set_quantity_scale_factor(planck_momentum, planck_mass * speed_of_light) 

287 

288SI.set_quantity_dimension(planck_energy, energy) 

289SI.set_quantity_scale_factor(planck_energy, planck_mass * speed_of_light**2) 

290 

291SI.set_quantity_dimension(planck_force, force) 

292SI.set_quantity_scale_factor(planck_force, planck_energy / planck_length) 

293 

294SI.set_quantity_dimension(planck_power, power) 

295SI.set_quantity_scale_factor(planck_power, planck_energy / planck_time) 

296 

297SI.set_quantity_dimension(planck_density, mass / length ** 3) 

298SI.set_quantity_scale_factor(planck_density, planck_mass / planck_length**3) 

299 

300SI.set_quantity_dimension(planck_energy_density, energy / length ** 3) 

301SI.set_quantity_scale_factor(planck_energy_density, planck_energy / planck_length**3) 

302 

303SI.set_quantity_dimension(planck_intensity, mass * time ** (-3)) 

304SI.set_quantity_scale_factor(planck_intensity, planck_energy_density * speed_of_light) 

305 

306SI.set_quantity_dimension(planck_angular_frequency, 1 / time) 

307SI.set_quantity_scale_factor(planck_angular_frequency, 1 / planck_time) 

308 

309SI.set_quantity_dimension(planck_pressure, pressure) 

310SI.set_quantity_scale_factor(planck_pressure, planck_force / planck_length**2) 

311 

312SI.set_quantity_dimension(planck_current, current) 

313SI.set_quantity_scale_factor(planck_current, planck_charge / planck_time) 

314 

315SI.set_quantity_dimension(planck_voltage, voltage) 

316SI.set_quantity_scale_factor(planck_voltage, planck_energy / planck_charge) 

317 

318SI.set_quantity_dimension(planck_impedance, impedance) 

319SI.set_quantity_scale_factor(planck_impedance, planck_voltage / planck_current) 

320 

321SI.set_quantity_dimension(planck_acceleration, acceleration) 

322SI.set_quantity_scale_factor(planck_acceleration, speed_of_light / planck_time) 

323 

324# Older units for radioactivity 

325 

326SI.set_quantity_dimension(curie, 1 / time) 

327SI.set_quantity_scale_factor(curie, 37000000000*becquerel) 

328 

329SI.set_quantity_dimension(rutherford, 1 / time) 

330SI.set_quantity_scale_factor(rutherford, 1000000*becquerel) 

331 

332 

333# check that scale factors are the right SI dimensions: 

334for _scale_factor, _dimension in zip( 

335 SI._quantity_scale_factors.values(), 

336 SI._quantity_dimension_map.values() 

337): 

338 dimex = SI.get_dimensional_expr(_scale_factor) 

339 if dimex != 1: 

340 # XXX: equivalent_dims is an instance method taking two arguments in 

341 # addition to self so this can not work: 

342 if not DimensionSystem.equivalent_dims(_dimension, Dimension(dimex)): # type: ignore 

343 raise ValueError("quantity value and dimension mismatch") 

344del _scale_factor, _dimension 

345 

346__all__ = [ 

347 'mmHg', 'atmosphere', 'inductance', 'newton', 'meter', 

348 'vacuum_permittivity', 'pascal', 'magnetic_constant', 'voltage', 

349 'angular_mil', 'luminous_intensity', 'all_units', 

350 'julian_year', 'weber', 'exbibyte', 'liter', 

351 'molar_gas_constant', 'faraday_constant', 'avogadro_constant', 

352 'lightyear', 'planck_density', 'gee', 'mol', 'bit', 'gray', 

353 'planck_momentum', 'bar', 'magnetic_density', 'prefix_unit', 'PREFIXES', 

354 'planck_time', 'dimex', 'gram', 'candela', 'force', 'planck_intensity', 

355 'energy', 'becquerel', 'planck_acceleration', 'speed_of_light', 

356 'conductance', 'frequency', 'coulomb_constant', 'degree', 'lux', 'planck', 

357 'current', 'planck_current', 'tebibyte', 'planck_power', 'MKSA', 'power', 

358 'K', 'planck_volume', 'quart', 'pressure', 'amount_of_substance', 

359 'joule', 'boltzmann_constant', 'Dimension', 'c', 'planck_force', 'length', 

360 'watt', 'action', 'hbar', 'gibibyte', 'DimensionSystem', 'cd', 'volt', 

361 'planck_charge', 'dioptre', 'vacuum_impedance', 'dimsys_default', 'farad', 

362 'charge', 'gravitational_constant', 'temperature', 'u0', 'hertz', 

363 'capacitance', 'tesla', 'steradian', 'planck_mass', 'josephson_constant', 

364 'planck_area', 'stefan_boltzmann_constant', 'base_dims', 

365 'astronomical_unit', 'radian', 'planck_voltage', 'impedance', 

366 'planck_energy', 'Da', 'atomic_mass_constant', 'rutherford', 'second', 'inch', 

367 'elementary_charge', 'SI', 'electronvolt', 'dimsys_SI', 'henry', 

368 'planck_angular_frequency', 'ohm', 'pound', 'planck_pressure', 'G', 'psi', 

369 'dHg0', 'von_klitzing_constant', 'planck_length', 'avogadro_number', 

370 'mole', 'acceleration', 'information', 'planck_energy_density', 

371 'mebibyte', 's', 'acceleration_due_to_gravity', 'electron_rest_mass', 

372 'planck_temperature', 'units', 'mass', 'dimsys_MKSA', 'kelvin', 'kPa', 

373 'boltzmann', 'milli_mass_unit', 'planck_impedance', 'electric_constant', 

374 'derived_dims', 'kg', 'coulomb', 'siemens', 'byte', 'magnetic_flux', 

375 'atomic_mass_unit', 'm', 'kibibyte', 'kilogram', 'One', 'curie', 'u', 

376 'time', 'pebibyte', 'velocity', 'ampere', 'katal', 

377]