From 7afb4914f25ca3d5eb31822c0e849b23542fc563 Mon Sep 17 00:00:00 2001 From: Roland Haas <rhaas@tapir.caltech.edu> Date: Mon, 17 Jun 2019 15:01:50 -0400 Subject: [PATCH] POWER: let user specify which radii to use --- POWER/power.py | 60 +++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/POWER/power.py b/POWER/power.py index 6f005c4..966af2f 100755 --- a/POWER/power.py +++ b/POWER/power.py @@ -427,17 +427,27 @@ def get_angular_momentum(python_strain): if __name__ == "__main__": #Initialize simulation data if(len(sys.argv) < 2): - print("Pass in the number n of the n innermost detector radii to be used in the extrapolation (optional, default=all) and the simulation folders (e.g., ./power.py 6 ./simulations/J0040_N40 /path/to/my_simulation_folder).") - sys.exit() - 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 - if(radiiUsedForExtrapolation < 1 or radiiUsedForExtrapolation > 7): - print("Invalid specified radii number") - sys.exit() - paths = sys.argv[2:] + print("You need to pass at least one simulation path") + sys.exit(1) + + # let user specify which radii to use. + # either the n innermost one or the n immermost ones starting from the ith: + # "n" or "i n" + if(not os.path.isdir(sys.argv[1])): + if(not os.path.isdir(sys.argv[2])): + non_dirs = 2 + radiiUsedForExtrapolation = int(sys.argv[2]) + firstRadiusUsedForExtrapolation = int(sys.argv[1])-1 + else: + non_dirs = 1 + radiiUsedForExtrapolation = int(sys.argv[1]) + firstRadiusUsedForExtrapolation = 0 + else: + non_dirs = 0 + radiiUsedForExtrapolation = 7 #use the first n radii available + firstRadiusUsedForExtrapolation = 0 + + paths = sys.argv[1+non_dirs:] for sim_path in paths: main_dir = sim_path @@ -560,27 +570,27 @@ if __name__ == "__main__": amp.append(ampTable) #Interpolate phase and amplitude - t = phase[0][:, 0] - last_t = phase[radiiUsedForExtrapolation - 1][-1, 0] + t = phase[firstRadiusUsedForExtrapolation][:, 0] + last_t = phase[firstRadiusUsedForExtrapolation+radiiUsedForExtrapolation - 1][-1, 0] last_index = 0; # TODO: use array notation for this (this is a boolean # plus a first_of or so) - for i in range(0, len(phase[0][:, 0])): + for i in range(0, len(phase[firstRadiusUsedForExtrapolation][:, 0])): if(t[i] > last_t): last_index = i break last_index = last_index-1 - t = phase[0][0:last_index, 0] + t = phase[firstRadiusUsedForExtrapolation][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) + t = np.arange(phase[firstRadiusUsedForExtrapolation][0, 0], phase[firstRadiusUsedForExtrapolation][last_index, 0], dt) interpolation_order = 9 - for i in range(0, radiiUsedForExtrapolation): + for i in range(firstRadiusUsedForExtrapolation, firstRadiusUsedForExtrapolation+radiiUsedForExtrapolation): interp_function = scipy.interpolate.interp1d(phase[i][:, 0], phase[i][:, 1], kind=interpolation_order) resampled_phase_vals = interp_function(t) # try and keep all initial phases within 2pi of each other if(i > 0): - phase_shift = round((resampled_phase_vals[0] - phase[0][0,1])/(2.*math.pi))*2.*math.pi + phase_shift = round((resampled_phase_vals[0] - phase[firstRadiusUsedForExtrapolation][0,1])/(2.*math.pi))*2.*math.pi resampled_phase_vals -= phase_shift phase[i] = np.column_stack((t, resampled_phase_vals)) interp_function = scipy.interpolate.interp1d(amp[i][:, 0], amp[i][:, 1], kind=interpolation_order) @@ -591,27 +601,27 @@ if __name__ == "__main__": phase_extrapolation_order = 1 amp_extrapolation_order = 2 radii = np.asarray(radii, dtype=float) - radii = radii[0:radiiUsedForExtrapolation] + used_radii = radii[firstRadiusUsedForExtrapolation:firstRadiusUsedForExtrapolation+radiiUsedForExtrapolation] # TODO: replace by np.ones (which is all it does anyway) - A_phase = np.power(radii, 0) - A_amp = np.power(radii, 0) + A_phase = np.power(used_radii, 0) + A_amp = np.power(used_radii, 0) for i in range(1, phase_extrapolation_order+1): - A_phase = np.column_stack((A_phase, np.power(radii, -1*i))) + A_phase = np.column_stack((A_phase, np.power(used_radii, -1*i))) for i in range(1, amp_extrapolation_order+1): - A_amp = np.column_stack((A_amp, np.power(radii, -1*i))) + A_amp = np.column_stack((A_amp, np.power(used_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): + for j in range(firstRadiusUsedForExtrapolation, firstRadiusUsedForExtrapolation+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): + for j in range(firstRadiusUsedForExtrapolation, firstRadiusUsedForExtrapolation+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]) -- GitLab