Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

""" 

Collection of physical constants and conversion factors. 

 

Most constants are in SI units, so you can do 

print '10 mile per minute is', 10*mile/minute, 'm/s or', 10*mile/(minute*knot), 'knots' 

 

The list is not meant to be comprehensive, but just convenient for everyday use. 

""" 

""" 

BasSw 2006 

physical constants: imported from CODATA 

unit conversion: see e.g., NIST special publication 811 

Use at own risk: double-check values before calculating your Mars orbit-insertion burn. 

Some constants exist in a few variants, which are marked with suffixes. 

The ones without any suffix should be the most common ones. 

""" 

 

import math as _math 

from .codata import value as _cd 

import numpy as _np 

 

# mathematical constants 

pi = _math.pi 

golden = golden_ratio = (1 + _math.sqrt(5)) / 2 

 

# SI prefixes 

yotta = 1e24 

zetta = 1e21 

exa = 1e18 

peta = 1e15 

tera = 1e12 

giga = 1e9 

mega = 1e6 

kilo = 1e3 

hecto = 1e2 

deka = 1e1 

deci = 1e-1 

centi = 1e-2 

milli = 1e-3 

micro = 1e-6 

nano = 1e-9 

pico = 1e-12 

femto = 1e-15 

atto = 1e-18 

zepto = 1e-21 

 

# binary prefixes 

kibi = 2**10 

mebi = 2**20 

gibi = 2**30 

tebi = 2**40 

pebi = 2**50 

exbi = 2**60 

zebi = 2**70 

yobi = 2**80 

 

# physical constants 

c = speed_of_light = _cd('speed of light in vacuum') 

mu_0 = _cd('vacuum mag. permeability') 

epsilon_0 = _cd('vacuum electric permittivity') 

h = Planck = _cd('Planck constant') 

hbar = h / (2 * pi) 

G = gravitational_constant = _cd('Newtonian constant of gravitation') 

g = _cd('standard acceleration of gravity') 

e = elementary_charge = _cd('elementary charge') 

R = gas_constant = _cd('molar gas constant') 

alpha = fine_structure = _cd('fine-structure constant') 

N_A = Avogadro = _cd('Avogadro constant') 

k = Boltzmann = _cd('Boltzmann constant') 

sigma = Stefan_Boltzmann = _cd('Stefan-Boltzmann constant') 

Wien = _cd('Wien wavelength displacement law constant') 

Rydberg = _cd('Rydberg constant') 

 

# mass in kg 

gram = 1e-3 

metric_ton = 1e3 

grain = 64.79891e-6 

lb = pound = 7000 * grain # avoirdupois 

blob = slinch = pound * g / 0.0254 # lbf*s**2/in (added in 1.0.0) 

slug = blob / 12 # lbf*s**2/foot (added in 1.0.0) 

oz = ounce = pound / 16 

stone = 14 * pound 

long_ton = 2240 * pound 

short_ton = 2000 * pound 

 

troy_ounce = 480 * grain # only for metals / gems 

troy_pound = 12 * troy_ounce 

carat = 200e-6 

 

m_e = electron_mass = _cd('electron mass') 

m_p = proton_mass = _cd('proton mass') 

m_n = neutron_mass = _cd('neutron mass') 

m_u = u = atomic_mass = _cd('atomic mass constant') 

 

# angle in rad 

degree = pi / 180 

arcmin = arcminute = degree / 60 

arcsec = arcsecond = arcmin / 60 

 

# time in second 

minute = 60.0 

hour = 60 * minute 

day = 24 * hour 

week = 7 * day 

year = 365 * day 

Julian_year = 365.25 * day 

 

# length in meter 

inch = 0.0254 

foot = 12 * inch 

yard = 3 * foot 

mile = 1760 * yard 

mil = inch / 1000 

pt = point = inch / 72 # typography 

survey_foot = 1200.0 / 3937 

survey_mile = 5280 * survey_foot 

nautical_mile = 1852.0 

fermi = 1e-15 

angstrom = 1e-10 

micron = 1e-6 

au = astronomical_unit = 149597870700.0 

light_year = Julian_year * c 

parsec = au / arcsec 

 

# pressure in pascal 

atm = atmosphere = _cd('standard atmosphere') 

bar = 1e5 

torr = mmHg = atm / 760 

psi = pound * g / (inch * inch) 

 

# area in meter**2 

hectare = 1e4 

acre = 43560 * foot**2 

 

# volume in meter**3 

litre = liter = 1e-3 

gallon = gallon_US = 231 * inch**3 # US 

# pint = gallon_US / 8 

fluid_ounce = fluid_ounce_US = gallon_US / 128 

bbl = barrel = 42 * gallon_US # for oil 

 

gallon_imp = 4.54609e-3 # UK 

fluid_ounce_imp = gallon_imp / 160 

 

# speed in meter per second 

kmh = 1e3 / hour 

mph = mile / hour 

mach = speed_of_sound = 340.5 # approx value at 15 degrees in 1 atm. Is this a common value? 

knot = nautical_mile / hour 

 

# temperature in kelvin 

zero_Celsius = 273.15 

degree_Fahrenheit = 1/1.8 # only for differences 

 

# energy in joule 

eV = electron_volt = elementary_charge # * 1 Volt 

calorie = calorie_th = 4.184 

calorie_IT = 4.1868 

erg = 1e-7 

Btu_th = pound * degree_Fahrenheit * calorie_th / gram 

Btu = Btu_IT = pound * degree_Fahrenheit * calorie_IT / gram 

ton_TNT = 1e9 * calorie_th 

# Wh = watt_hour 

 

# power in watt 

hp = horsepower = 550 * foot * pound * g 

 

# force in newton 

dyn = dyne = 1e-5 

lbf = pound_force = pound * g 

kgf = kilogram_force = g # * 1 kg 

 

# functions for conversions that are not linear 

 

 

def convert_temperature(val, old_scale, new_scale): 

""" 

Convert from a temperature scale to another one among Celsius, Kelvin, 

Fahrenheit, and Rankine scales. 

 

Parameters 

---------- 

val : array_like 

Value(s) of the temperature(s) to be converted expressed in the 

original scale. 

 

old_scale: str 

Specifies as a string the original scale from which the temperature 

value(s) will be converted. Supported scales are Celsius ('Celsius', 

'celsius', 'C' or 'c'), Kelvin ('Kelvin', 'kelvin', 'K', 'k'), 

Fahrenheit ('Fahrenheit', 'fahrenheit', 'F' or 'f'), and Rankine 

('Rankine', 'rankine', 'R', 'r'). 

 

new_scale: str 

Specifies as a string the new scale to which the temperature 

value(s) will be converted. Supported scales are Celsius ('Celsius', 

'celsius', 'C' or 'c'), Kelvin ('Kelvin', 'kelvin', 'K', 'k'), 

Fahrenheit ('Fahrenheit', 'fahrenheit', 'F' or 'f'), and Rankine 

('Rankine', 'rankine', 'R', 'r'). 

 

Returns 

------- 

res : float or array of floats 

Value(s) of the converted temperature(s) expressed in the new scale. 

 

Notes 

----- 

.. versionadded:: 0.18.0 

 

Examples 

-------- 

>>> from scipy.constants import convert_temperature 

>>> convert_temperature(np.array([-40, 40]), 'Celsius', 'Kelvin') 

array([ 233.15, 313.15]) 

 

""" 

# Convert from `old_scale` to Kelvin 

if old_scale.lower() in ['celsius', 'c']: 

tempo = _np.asanyarray(val) + zero_Celsius 

elif old_scale.lower() in ['kelvin', 'k']: 

tempo = _np.asanyarray(val) 

elif old_scale.lower() in ['fahrenheit', 'f']: 

tempo = (_np.asanyarray(val) - 32) * 5 / 9 + zero_Celsius 

elif old_scale.lower() in ['rankine', 'r']: 

tempo = _np.asanyarray(val) * 5 / 9 

else: 

raise NotImplementedError("%s scale is unsupported: supported scales " 

"are Celsius, Kelvin, Fahrenheit, and " 

"Rankine" % old_scale) 

# and from Kelvin to `new_scale`. 

if new_scale.lower() in ['celsius', 'c']: 

res = tempo - zero_Celsius 

elif new_scale.lower() in ['kelvin', 'k']: 

res = tempo 

elif new_scale.lower() in ['fahrenheit', 'f']: 

res = (tempo - zero_Celsius) * 9 / 5 + 32 

elif new_scale.lower() in ['rankine', 'r']: 

res = tempo * 9 / 5 

else: 

raise NotImplementedError("'%s' scale is unsupported: supported " 

"scales are 'Celsius', 'Kelvin', " 

"'Fahrenheit', and 'Rankine'" % new_scale) 

 

return res 

 

 

# optics 

 

 

def lambda2nu(lambda_): 

""" 

Convert wavelength to optical frequency 

 

Parameters 

---------- 

lambda_ : array_like 

Wavelength(s) to be converted. 

 

Returns 

------- 

nu : float or array of floats 

Equivalent optical frequency. 

 

Notes 

----- 

Computes ``nu = c / lambda`` where c = 299792458.0, i.e., the 

(vacuum) speed of light in meters/second. 

 

Examples 

-------- 

>>> from scipy.constants import lambda2nu, speed_of_light 

>>> lambda2nu(np.array((1, speed_of_light))) 

array([ 2.99792458e+08, 1.00000000e+00]) 

 

""" 

return _np.asanyarray(c) / lambda_ 

 

 

def nu2lambda(nu): 

""" 

Convert optical frequency to wavelength. 

 

Parameters 

---------- 

nu : array_like 

Optical frequency to be converted. 

 

Returns 

------- 

lambda : float or array of floats 

Equivalent wavelength(s). 

 

Notes 

----- 

Computes ``lambda = c / nu`` where c = 299792458.0, i.e., the 

(vacuum) speed of light in meters/second. 

 

Examples 

-------- 

>>> from scipy.constants import nu2lambda, speed_of_light 

>>> nu2lambda(np.array((1, speed_of_light))) 

array([ 2.99792458e+08, 1.00000000e+00]) 

 

""" 

return c / _np.asanyarray(nu)