-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathCC.py
178 lines (158 loc) · 5.44 KB
/
CC.py
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
#!/usr/bin/env python
import sys
from math import *
try:
if sys.argv[1] == '-h':
print '''Cosmology calculator ala Ned Wright (www.astro.ucla.edu/~wright)
input values = redshift, Ho, Omega_m, Omega_vac
ouput values = age at z, distance in Mpc, kpc/arcsec, apparent to abs mag conversion
Options: -h for this message
-v for verbose response '''
sys.exit()
if sys.argv[1] == '-v':
verbose=1
length=len(sys.argv)-1
else:
verbose=0
length=len(sys.argv)
# if no values, assume Benchmark Model, input is z
if length == 2:
if float(sys.argv[1+verbose]) > 100:
z=float(sys.argv[1+verbose])/299790. # velocity to redshift
else:
z=float(sys.argv[1+verbose]) # redshift
H0 = 75 # Hubble constant
H0 = 69.6
WM = 0.3 # Omega(matter)
WM = 0.286
WV = 1.0 - WM - 0.4165/(H0*H0) # Omega(vacuum) or lambda
# if one value, assume Benchmark Model with given Ho
elif length == 3:
z=float(sys.argv[1+verbose]) # redshift
H0 = float(sys.argv[2+verbose]) # Hubble constant
WM = 0.3 # Omega(matter)
WV = 1.0 - WM - 0.4165/(H0*H0) # Omega(vacuum) or lambda
# if Univ is Open, use Ho, Wm and set Wv to 0.
elif length == 4:
z=float(sys.argv[1+verbose]) # redshift
H0 = float(sys.argv[2+verbose]) # Hubble constant
WM = float(sys.argv[3+verbose]) # Omega(matter)
WV = 0.0 # Omega(vacuum) or lambda
# if Univ is General, use Ho, Wm and given Wv
elif length == 5:
z=float(sys.argv[1+verbose]) # redshift
H0 = float(sys.argv[2+verbose]) # Hubble constant
WM = float(sys.argv[3+verbose]) # Omega(matter)
WV = float(sys.argv[4+verbose]) # Omega(vacuum) or lambda
# or else fail
else:
print 'need some values or too many values'
sys.exit()
# initialize constants
WR = 0. # Omega(radiation)
WK = 0. # Omega curvaturve = 1-Omega(total)
c = 299792.458 # velocity of light in km/sec
Tyr = 977.8 # coefficent for converting 1/H into Gyr
DTT = 0.5 # time from z to now in units of 1/H0
DTT_Gyr = 0.0 # value of DTT in Gyr
age = 0.5 # age of Universe in units of 1/H0
age_Gyr = 0.0 # value of age in Gyr
zage = 0.1 # age of Universe at redshift z in units of 1/H0
zage_Gyr = 0.0 # value of zage in Gyr
DCMR = 0.0 # comoving radial distance in units of c/H0
DCMR_Mpc = 0.0
DCMR_Gyr = 0.0
DA = 0.0 # angular size distance
DA_Mpc = 0.0
DA_Gyr = 0.0
kpc_DA = 0.0
DL = 0.0 # luminosity distance
DL_Mpc = 0.0
DL_Gyr = 0.0 # DL in units of billions of light years
V_Gpc = 0.0
a = 1.0 # 1/(1+z), the scale factor of the Universe
az = 0.5 # 1/(1+z(object))
h = H0/100.
WR = 4.165E-5/(h*h) # includes 3 massless neutrino species, T0 = 2.72528
WK = 1-WM-WR-WV
az = 1.0/(1+1.0*z)
age = 0.
n=1000 # number of points in integrals
for i in range(n):
a = az*(i+0.5)/n
adot = sqrt(WK+(WM/a)+(WR/(a*a))+(WV*a*a))
age = age + 1./adot
zage = az*age/n
zage_Gyr = (Tyr/H0)*zage
DTT = 0.0
DCMR = 0.0
# do integral over a=1/(1+z) from az to 1 in n steps, midpoint rule
for i in range(n):
a = az+(1-az)*(i+0.5)/n
adot = sqrt(WK+(WM/a)+(WR/(a*a))+(WV*a*a))
DTT = DTT + 1./adot
DCMR = DCMR + 1./(a*adot)
DTT = (1.-az)*DTT/n
DCMR = (1.-az)*DCMR/n
age = DTT+zage
age_Gyr = age*(Tyr/H0)
DTT_Gyr = (Tyr/H0)*DTT
DCMR_Gyr = (Tyr/H0)*DCMR
DCMR_Mpc = (c/H0)*DCMR
# tangential comoving distance
ratio = 1.00
x = sqrt(abs(WK))*DCMR
if x > 0.1:
if WK > 0:
ratio = 0.5*(exp(x)-exp(-x))/x
else:
ratio = sin(x)/x
else:
y = x*x
if WK < 0: y = -y
ratio = 1. + y/6. + y*y/120.
DCMT = ratio*DCMR
DA = az*DCMT
DA_Mpc = (c/H0)*DA
kpc_DA = DA_Mpc/206.264806
DA_Gyr = (Tyr/H0)*DA
DL = DA/(az*az)
DL_Mpc = (c/H0)*DL
DL_Gyr = (Tyr/H0)*DL
# comoving volume computation
ratio = 1.00
x = sqrt(abs(WK))*DCMR
if x > 0.1:
if WK > 0:
ratio = (0.125*(exp(2.*x)-exp(-2.*x))-x/2.)/(x*x*x/3.)
else:
ratio = (x/2. - sin(2.*x)/4.)/(x*x*x/3.)
else:
y = x*x
if WK < 0: y = -y
ratio = 1. + y/5. + (2./105.)*y*y
VCM = ratio*DCMR*DCMR*DCMR/3.
V_Gpc = 4.*pi*((0.001*c/H0)**3)*VCM
if verbose == 1:
print 'For H_o = ' + '%1.1f' % H0 + ', Omega_M = ' + '%1.2f' % WM + ', Omega_vac = ',
print '%1.2f' % WV + ', z = ' + '%1.3f' % z
print 'It is now ' + '%1.1f' % age_Gyr + ' Gyr since the Big Bang.'
print 'The age at redshift z was ' + '%1.1f' % zage_Gyr + ' Gyr.'
print 'The light travel time was ' + '%1.1f' % DTT_Gyr + ' Gyr.'
print 'The comoving radial distance, which goes into Hubbles law, is',
print '%1.1f' % DCMR_Mpc + ' Mpc or ' + '%1.1f' % DCMR_Gyr + ' Gly.'
print 'The comoving volume within redshift z is ' + '%1.1f' % V_Gpc + ' Gpc^3.'
print 'The angular size distance D_A is ' + '%1.1f' % DA_Mpc + ' Mpc or',
print '%1.1f' % DA_Gyr + ' Gly.'
print 'This gives a scale of ' + '%.2f' % kpc_DA + ' kpc/".'
print 'The luminosity distance D_L is ' + '%1.1f' % DL_Mpc + ' Mpc or ' + '%1.1f' % DL_Gyr + ' Gly.'
print 'The distance modulus, m-M, is '+'%1.2f' % (5*log10(DL_Mpc*1e6)-5)
else:
print '%1.2f' % zage_Gyr,
print '%1.2f' % DCMR_Mpc,
print '%1.2f' % kpc_DA,
print '%1.2f' % (5*log10(DL_Mpc*1e6)-5)
except IndexError:
print 'need some values or too many values'
except ValueError:
print 'nonsense value or option'