From f065fa62355422fd48167a46d4b683d67b9a8aaa Mon Sep 17 00:00:00 2001
From: dsjohns2 <dsjohns2@illinois.edu>
Date: Tue, 8 Aug 2017 14:18:43 -0500
Subject: [PATCH] Add ability to extract many simulations at a time

---
 POWER/power.py | 295 +++++++++++++++++++++++++------------------------
 1 file changed, 149 insertions(+), 146 deletions(-)

diff --git a/POWER/power.py b/POWER/power.py
index 1d5df72..efd30b5 100755
--- a/POWER/power.py
+++ b/POWER/power.py
@@ -239,150 +239,153 @@ def getCutoffFrequency(sim_name):
 #-----Main-----#
 
 #Initialize simulation data
-if(len(sys.argv) == 2):
-	radiiUsedForExtrapolation = 7	#use the first n radii available  
-elif(len(sys.argv) == 3):
-	radiiUsedForExtrapolation = int(sys.argv[2])	#use the first n radii available  
-else:
-	print("Pass in simulation folder and the number of radii to be used in the extrapolation (optional, default=all) (e.g., ./power.py ./simulations/J0040_N40 6).")
+if(len(sys.argv) < 2):
+	print("Pass in the simulation folders and the number n of the n innermost detector radii to be used in the extrapolation (optional, default=all) (e.g., ./power.py ./simulations/J0040_N40 /path/to/my_simulation_folder 6).")
 	sys.exit()
-sim_path = sys.argv[1]
-main_dir = sim_path
-sim = sim_path.split("/")[-1]
-
-simdirs = main_dir+"/output-????/%s/" % (sim)
-f0 = getCutoffFrequency(sim)
-
-#Create data directories
-main_directory = "Extrapolated_Strain"
-sim_dir = main_directory+"/"+sim
-if not os.path.exists(main_directory):
-    os.makedirs(main_directory)
-if not os.path.exists(sim_dir):
-    os.makedirs(sim_dir)
-
-#Get ADMMass
-ADMMass = -1
-filename = main_dir+"/output-0000/%s/TwoPunctures.bbh" % (sim)
-with open(filename) as file:
-	contents = file.readlines()
-	for line in contents:
-		line_elems = line.split(" ")
-		if(line_elems[0] == "initial-ADM-energy"):
-			ADMMass = float(line_elems[-1])
-
-#Get Psi4
-radii = [100, 115, 136, 167, 214, 300, 500]
-psi4dsetname_100 = 'l2_m2_r'+str(radii[0])+'.00'
-psi4dsetname_115 = 'l2_m2_r'+str(radii[1])+'.00'
-psi4dsetname_136 = 'l2_m2_r'+str(radii[2])+'.00'
-psi4dsetname_167 = 'l2_m2_r'+str(radii[3])+'.00'
-psi4dsetname_214 = 'l2_m2_r'+str(radii[4])+'.00'
-psi4dsetname_300 = 'l2_m2_r'+str(radii[5])+'.00'
-psi4dsetname_500 = 'l2_m2_r'+str(radii[6])+'.00'
-mp_psi4_100 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_100)
-mp_psi4_115 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_115)
-mp_psi4_136 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_136)
-mp_psi4_167 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_167)
-mp_psi4_214 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_214)
-mp_psi4_300 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_300)
-mp_psi4_500 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_500)
-mp_psi4_vars = [mp_psi4_100, mp_psi4_115, mp_psi4_136, mp_psi4_167, mp_psi4_214, mp_psi4_300, mp_psi4_500]
-
-#Get Tortoise Coordinate
-tortoise = [None] * 7
-for i in range(0, 7):
-	tortoise[i] = -RadialToTortoise(radii[i], ADMMass)
-
-strain = [None]*7
-phase = [None]*7
-amp = [None]*7
-for i in range(0, 7):
-	#Get modified Psi4 (Multiply real and imaginary psi4 columns by radii and add the tortoise coordinate to the time colum)
-	mp_psi4_vars[i][:, 0] += tortoise[i]
-	mp_psi4_vars[i][:, 1] *= radii[i]
-	mp_psi4_vars[i][:, 2] *= radii[i]
-
-	#Fixed-frequency integration twice to get strain
-	hTable = psi4ToStrain(mp_psi4_vars[i], f0)
-	time = hTable[:, 0]
-	h = hTable[:, 1]
-	hplus = h.real
-	hcross = h.imag
-	newhTable = np.column_stack((time, hplus, hcross))
-	warnings.filterwarnings('ignore')
-	finalhTable = newhTable.astype(float)
-	np.savetxt("./Extrapolated_Strain/"+sim+"/"+sim+"_strain_at_"+str(radii[i])+".dat", finalhTable)
-	strain[i] = finalhTable
-
-	#Get phase and amplitude of strain
-	h_phase = np.unwrap(np.angle(h))
-	while(h_phase[0] < 0):
-		h_phase[:] += 2*math.pi
-	angleTable = np.column_stack((time, h_phase))
-	angleTable = angleTable.astype(float)
-	phase[i] = angleTable
-	h_amp = np.absolute(h)
-	ampTable = np.column_stack((time, h_amp))
-	ampTable = ampTable.astype(float)
-	amp[i] = ampTable
-
-#Interpolate phase and amplitude
-t = phase[0][:, 0]
-last_t = phase[radiiUsedForExtrapolation - 1][-1, 0]
-last_index = 0;
-for i in range(0, len(phase[0][:, 0])):
-	if(t[i] > last_t):
-		last_index = i
-		break
-last_index = last_index-1
-t = phase[0][0:last_index, 0]
-dts = t[1:] - t[:-1]
-dt = float(np.amin(dts))
-t = np.arange(phase[0][0, 0], phase[0][last_index, 0], dt)
-interpolation_order = 9
-for i in range(0, radiiUsedForExtrapolation):
-	interp_function = scipy.interpolate.interp1d(phase[i][:, 0], phase[i][:, 1], kind=interpolation_order)
-	resampled_phase_vals = interp_function(t)
-	while(resampled_phase_vals[0] < 0):
-		resampled_phase_vals[:] += 2*math.pi
-	phase[i] = np.column_stack((t, resampled_phase_vals))
-	interp_function = scipy.interpolate.interp1d(amp[i][:, 0], amp[i][:, 1], kind=interpolation_order)
-	resampled_amp_vals = interp_function(t)
-	amp[i] = np.column_stack((t, resampled_amp_vals))
-
-#Extrapolate
-phase_extrapolation_order = 1
-amp_extrapolation_order = 2
-radii = np.asarray(radii, dtype=float)
-radii = radii[0:radiiUsedForExtrapolation]
-A_phase = np.power(radii, 0)
-A_amp = np.power(radii, 0)
-for i in range(1, phase_extrapolation_order+1):
-	A_phase = np.column_stack((A_phase, np.power(radii, -1*i)))
-
-for i in range(1, amp_extrapolation_order+1):
-	A_amp = np.column_stack((A_amp, np.power(radii, -1*i)))
-
-radially_extrapolated_phase = np.empty(0)
-radially_extrapolated_amp = np.empty(0)
-for i in range(0, len(t)):
-	b_phase = np.empty(0)
-	for j in range(0, radiiUsedForExtrapolation):
-		b_phase = np.append(b_phase, phase[j][i, 1])
-	x_phase = np.linalg.lstsq(A_phase, b_phase)[0]
-	radially_extrapolated_phase = np.append(radially_extrapolated_phase, x_phase[0])
-
-	b_amp = np.empty(0)
-	for j in range(0, radiiUsedForExtrapolation):
-		b_amp = np.append(b_amp, amp[j][i, 1])
-	x_amp = np.linalg.lstsq(A_amp, b_amp)[0]
-	radially_extrapolated_amp = np.append(radially_extrapolated_amp, x_amp[0])
-
-radially_extrapolated_h_plus = np.empty(0)
-radially_extrapolated_h_cross = np.empty(0)
-for i in range(0, len(radially_extrapolated_amp)):
-	radially_extrapolated_h_plus = np.append(radially_extrapolated_h_plus, radially_extrapolated_amp[i] * math.cos(radially_extrapolated_phase[i]))
-	radially_extrapolated_h_cross = np.append(radially_extrapolated_h_cross, radially_extrapolated_amp[i] * math.sin(radially_extrapolated_phase[i]))
-
-np.savetxt("./Extrapolated_Strain/"+sim+"/"+sim+"_radially_extrapolated_strain.dat", np.column_stack((t, radially_extrapolated_h_plus, radially_extrapolated_h_cross)))
+elif(os.path.isdir(sys.argv[-1])):
+	radiiUsedForExtrapolation = 7	#use the first n radii available  
+	paths = sys.argv[1:]
+elif(not os.path.isdir(sys.argv[-1])):
+	radiiUsedForExtrapolation = int(sys.argv[-1])	#use the first n radii available  
+	paths = sys.argv[1:-1]
+
+for sim_path in paths:
+	main_dir = sim_path
+	sim = sim_path.split("/")[-1]
+
+	simdirs = main_dir+"/output-????/%s/" % (sim)
+	f0 = getCutoffFrequency(sim)
+
+	#Create data directories
+	main_directory = "Extrapolated_Strain"
+	sim_dir = main_directory+"/"+sim
+	if not os.path.exists(main_directory):
+		os.makedirs(main_directory)
+	if not os.path.exists(sim_dir):
+		os.makedirs(sim_dir)
+
+	#Get ADMMass
+	ADMMass = -1
+	filename = main_dir+"/output-0000/%s/TwoPunctures.bbh" % (sim)
+	with open(filename) as file:
+		contents = file.readlines()
+		for line in contents:
+			line_elems = line.split(" ")
+			if(line_elems[0] == "initial-ADM-energy"):
+				ADMMass = float(line_elems[-1])
+
+	#Get Psi4
+	radii = [100, 115, 136, 167, 214, 300, 500]
+	psi4dsetname_100 = 'l2_m2_r'+str(radii[0])+'.00'
+	psi4dsetname_115 = 'l2_m2_r'+str(radii[1])+'.00'
+	psi4dsetname_136 = 'l2_m2_r'+str(radii[2])+'.00'
+	psi4dsetname_167 = 'l2_m2_r'+str(radii[3])+'.00'
+	psi4dsetname_214 = 'l2_m2_r'+str(radii[4])+'.00'
+	psi4dsetname_300 = 'l2_m2_r'+str(radii[5])+'.00'
+	psi4dsetname_500 = 'l2_m2_r'+str(radii[6])+'.00'
+	mp_psi4_100 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_100)
+	mp_psi4_115 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_115)
+	mp_psi4_136 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_136)
+	mp_psi4_167 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_167)
+	mp_psi4_214 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_214)
+	mp_psi4_300 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_300)
+	mp_psi4_500 = loadHDF5Series(simdirs+"mp_psi4.h5", psi4dsetname_500)
+	mp_psi4_vars = [mp_psi4_100, mp_psi4_115, mp_psi4_136, mp_psi4_167, mp_psi4_214, mp_psi4_300, mp_psi4_500]
+
+	#Get Tortoise Coordinate
+	tortoise = [None] * 7
+	for i in range(0, 7):
+		tortoise[i] = -RadialToTortoise(radii[i], ADMMass)
+
+	strain = [None]*7
+	phase = [None]*7
+	amp = [None]*7
+	for i in range(0, 7):
+		#Get modified Psi4 (Multiply real and imaginary psi4 columns by radii and add the tortoise coordinate to the time colum)
+		mp_psi4_vars[i][:, 0] += tortoise[i]
+		mp_psi4_vars[i][:, 1] *= radii[i]
+		mp_psi4_vars[i][:, 2] *= radii[i]
+
+		#Fixed-frequency integration twice to get strain
+		hTable = psi4ToStrain(mp_psi4_vars[i], f0)
+		time = hTable[:, 0]
+		h = hTable[:, 1]
+		hplus = h.real
+		hcross = h.imag
+		newhTable = np.column_stack((time, hplus, hcross))
+		warnings.filterwarnings('ignore')
+		finalhTable = newhTable.astype(float)
+		np.savetxt("./Extrapolated_Strain/"+sim+"/"+sim+"_strain_at_"+str(radii[i])+".dat", finalhTable)
+		strain[i] = finalhTable
+
+		#Get phase and amplitude of strain
+		h_phase = np.unwrap(np.angle(h))
+		while(h_phase[0] < 0):
+			h_phase[:] += 2*math.pi
+		angleTable = np.column_stack((time, h_phase))
+		angleTable = angleTable.astype(float)
+		phase[i] = angleTable
+		h_amp = np.absolute(h)
+		ampTable = np.column_stack((time, h_amp))
+		ampTable = ampTable.astype(float)
+		amp[i] = ampTable
+
+	#Interpolate phase and amplitude
+	t = phase[0][:, 0]
+	last_t = phase[radiiUsedForExtrapolation - 1][-1, 0]
+	last_index = 0;
+	for i in range(0, len(phase[0][:, 0])):
+		if(t[i] > last_t):
+			last_index = i
+			break
+	last_index = last_index-1
+	t = phase[0][0:last_index, 0]
+	dts = t[1:] - t[:-1]
+	dt = float(np.amin(dts))
+	t = np.arange(phase[0][0, 0], phase[0][last_index, 0], dt)
+	interpolation_order = 9
+	for i in range(0, radiiUsedForExtrapolation):
+		interp_function = scipy.interpolate.interp1d(phase[i][:, 0], phase[i][:, 1], kind=interpolation_order)
+		resampled_phase_vals = interp_function(t)
+		while(resampled_phase_vals[0] < 0):
+			resampled_phase_vals[:] += 2*math.pi
+		phase[i] = np.column_stack((t, resampled_phase_vals))
+		interp_function = scipy.interpolate.interp1d(amp[i][:, 0], amp[i][:, 1], kind=interpolation_order)
+		resampled_amp_vals = interp_function(t)
+		amp[i] = np.column_stack((t, resampled_amp_vals))
+
+	#Extrapolate
+	phase_extrapolation_order = 1
+	amp_extrapolation_order = 2
+	radii = np.asarray(radii, dtype=float)
+	radii = radii[0:radiiUsedForExtrapolation]
+	A_phase = np.power(radii, 0)
+	A_amp = np.power(radii, 0)
+	for i in range(1, phase_extrapolation_order+1):
+		A_phase = np.column_stack((A_phase, np.power(radii, -1*i)))
+
+	for i in range(1, amp_extrapolation_order+1):
+		A_amp = np.column_stack((A_amp, np.power(radii, -1*i)))
+
+	radially_extrapolated_phase = np.empty(0)
+	radially_extrapolated_amp = np.empty(0)
+	for i in range(0, len(t)):
+		b_phase = np.empty(0)
+		for j in range(0, radiiUsedForExtrapolation):
+			b_phase = np.append(b_phase, phase[j][i, 1])
+		x_phase = np.linalg.lstsq(A_phase, b_phase)[0]
+		radially_extrapolated_phase = np.append(radially_extrapolated_phase, x_phase[0])
+
+		b_amp = np.empty(0)
+		for j in range(0, radiiUsedForExtrapolation):
+			b_amp = np.append(b_amp, amp[j][i, 1])
+		x_amp = np.linalg.lstsq(A_amp, b_amp)[0]
+		radially_extrapolated_amp = np.append(radially_extrapolated_amp, x_amp[0])
+
+	radially_extrapolated_h_plus = np.empty(0)
+	radially_extrapolated_h_cross = np.empty(0)
+	for i in range(0, len(radially_extrapolated_amp)):
+		radially_extrapolated_h_plus = np.append(radially_extrapolated_h_plus, radially_extrapolated_amp[i] * math.cos(radially_extrapolated_phase[i]))
+		radially_extrapolated_h_cross = np.append(radially_extrapolated_h_cross, radially_extrapolated_amp[i] * math.sin(radially_extrapolated_phase[i]))
+
+	np.savetxt("./Extrapolated_Strain/"+sim+"/"+sim+"_radially_extrapolated_strain.dat", np.column_stack((t, radially_extrapolated_h_plus, radially_extrapolated_h_cross)))
-- 
GitLab