def run_simulation(caller=None, prop=False): bRun.label.set_text('Setting up...') drawnow() # Grab the parameters from the text boxes: pump_pulse_length = float(bPulse.text) centerwl = float(bWave.text) # in nm pump_power = float(bPower.text) * 1e3 GDD = float(bGDD.text) TOD = float(bTOD.text) window = float(bWindow.text) steps = int(bSteps.text) npoints = int(eval(bPoints.text)) fiber_length = float(bLength.text) * 1e-3 gamma = float(bGamma.text) beta2 = float(bBeta2.text) beta3 = float(bBeta3.text) beta4 = float(bBeta4.text) fibWL = float(bFibWL.text) isNotRaman = np.logical_not(bCheck.lines[0][0].get_visible()) isNotSteep = np.logical_not(bCheck.lines[1][0].get_visible()) # set up the pulse parameters pulse = SechPulse(pump_power, pump_pulse_length, centerwl, time_window=window, GDD=GDD, TOD=TOD, NPTS=npoints, frep_MHz=100, power_is_avg=False) fiber1 = fiber.FiberInstance() fiber1.generate_fiber(fiber_length, center_wl_nm=fibWL, betas=(beta2, beta3, beta4), gamma_W_m=gamma * 1e-3, gvd_units='ps^n/km') # fiber1.load_from_db(fiber_length, 'dudley') print 'Parameters\n------------------' print '--Pulse--' print 'Duration (ps) %f' % pump_pulse_length print 'Center wl (nm) %g' % centerwl print 'Pump power (W) %g' % pump_power print ' Energy (nJ) %f' % (pulse.calc_epp() * 1e9) print 'GDD (ps^2) %f' % (GDD) print 'TOD (ps^3) %f' % (TOD) print '--Simulation--' print 'Window (ps) %f' % window print 'Steps %i' % steps print 'Time points %i' % npoints print '--Fiber--' print 'Length (mm) %f' % (fiber_length * 1e3) print 'Gamma (W-1km-1) %f' % (gamma) print 'Beta2 (ps^2/km) %f' % (beta2) print 'Beta3 (ps^3/km) %f' % (beta3) print 'Beta4 (ps^4/km) %f' % (beta4) print 'FiberWL (nm) %f' % (fibWL) W = pulse.W_mks F = W / (2 * np.pi) T = pulse.T_ps xW = W[W > 0] D = fiber1.Beta2_to_D(pulse) beta = fiber1.Beta2(pulse) * 1e3 # Plot the dispersion in the left plots lineL1.set_data(F[W > 0][::10], D[W > 0][::10]) lineL2.set_data(F[W > 0][::10], beta[W > 0][::10]) # plot the pulse in the top plots line1a.set_data(F[W > 0], dB(pulse.AW[W > 0])) line2a.set_data(T, dB(pulse.AT)) laser_freq = 3e8 / (centerwl * 1e-9) fiber_freq = 3e8 / (fibWL * 1e-9) vline1a.set_xdata((laser_freq, laser_freq)) vline1b.set_xdata((fiber_freq, fiber_freq)) vline2a.set_xdata((laser_freq, laser_freq)) vline2b.set_xdata((fiber_freq, fiber_freq)) if prop == False: bRun.label.set_text('Run simulation') drawnow() return # stop here unless we've actually pressed the "Run" button ######################## Propagation t = time.time() bRun.label.set_text('Running...') drawnow() # set up the propagation parameters evol = SSFM.SSFM(local_error=0.001, USE_SIMPLE_RAMAN=True, disable_Raman=isNotRaman, disable_self_steepening=isNotSteep) # propagate the pulse! y, AW, AT, pulse1 = evol.propagate(pulse_in=pulse, fiber=fiber1, n_steps=steps) zW_in = np.transpose(AW)[:, (W > 0)] zT_in = np.transpose(AT) zW = dB(zW_in) zT = dB(zT_in) bRun.label.set_text('Drawing plots...') drawnow() line1b.set_data(F[F > 0], zW[-1]) line2b.set_data(T, zT[-1]) for ax in (ax3, ax4): ax.clear() extent = (np.min(F[F > 0]), np.max(F[F > 0]), np.min(y), np.max(y[:-1])) ax3.imshow(zW, extent=extent, vmin=np.max(zW) - 60.0, vmax=np.max(zW), aspect='auto', origin='lower') ax3.set_xlabel('Frequency (Hz)') ax3.set_ylabel('Distance (m)') extent = (np.min(T), np.max(T), np.min(y), np.max(y[:-1])) ax4.imshow(zT, extent=extent, vmin=np.max(zT) - 60.0, vmax=np.max(zT), aspect='auto', origin='lower') ax4.set_xlabel('Delay (ps)') print 'Total time: %.2f sec' % (time.time() - t) reset_plots() bRun.label.set_text('Run simulation') drawnow()
npoints = 2**13 init = SechPulse(power=pump_power, T0_ps=pump_pulse_length, center_wavelength_nm=centerwl, time_window_ps=10.0, GDD=0, TOD=0.0, NPTS=npoints, frep_MHz=100.0, power_is_avg=False) fiber1 = fiber.FiberInstance() fiber1.load_from_db(fiber_length, 'dudley') evol = SSFM.SSFM(dz=dz, local_error=0.001, USE_SIMPLE_RAMAN=True) y = np.zeros(steps) AW = np.zeros((init.NPTS, steps)) AT = np.copy(AW) y, AW, AT, pulse1 = evol.propagate(pulse_in=init, fiber=fiber1, n_steps=steps) wl = init.wl_nm loWL = 400 hiWL = 1400 iis = np.logical_and(wl > loWL, wl < hiWL) iisT = np.logical_and(init.T_ps > -1, init.T_ps < 5)
def run_simulation(caller=None): pump_pulse_length = float(bPulse.text) centerwl = float(bWave.text) # in nm pump_power = float(bPower.text) * 1e3 fiber_length = float(bLength.text) * 1e-3 dz = float(bDz.text) steps = int(bSteps.text) npoints = int(eval(bPoints.text)) print 'Running simulation with' print 'Pulse duration (fs): %f' % pump_pulse_length print 'Center wavelength (nm): %f' % centerwl print 'Pump power (W): %f' % pump_power print 'Fiber length (m): %f' % fiber_length print 'dz: %f' % dz print 'Steps: %i' % steps print 'Number of points: %i' % npoints init = SechPulse(pump_power, pump_pulse_length, centerwl, time_window=5.0, GDD=0, TOD=0.0, NPTS=npoints, frep_MHz=100, power_is_avg=False) fiber1 = fiber.FiberInstance() fiber1.load_from_db(fiber_length, 'dudley') evol = SSFM.SSFM(dz=dz, local_error=0.001, USE_SIMPLE_RAMAN=True) y = np.zeros(steps) AW = np.zeros((init.NPTS, steps)) AT = np.copy(AW) y, AW, AT, pulse1 = evol.propagate(pulse_in=init, fiber=fiber1, n_steps=steps) wl = init.wl_nm loWL = 400 hiWL = 1400 iis = np.logical_and(wl > loWL, wl < hiWL) iisT = np.logical_and(init.T_ps > -1, init.T_ps < 5) xW = wl[iis] xT = init.T_ps[iisT] zW_in = np.transpose(AW)[:, iis] zT_in = np.transpose(AT)[:, iisT] zW = 10 * np.log10(np.abs(zW_in)**2) zT = 10 * np.log10(np.abs(zT_in)**2) mlIW = np.max(zW) mlIT = np.max(zT) D = fiber1.Beta2_to_D(init) beta = fiber1.Beta2(init) for ax in (ax1, ax2, ax3, ax4): ax.clear() axL1.plot(wl, D) axL1.set_xlim(400, 1600) axL1.set_ylim(-400, 300) axL1.set_xlabel('Wavelength (nm)') axL1.set_ylabel('D (ps/nm/km)') axL2.plot(wl, beta * 1000) axL2.set_xlim(400, 1600) axL2.set_ylim(-350, 200) axL2.set_xlabel('Wavelength (nm)') axL2.set_ylabel(r'$\beta_2$ (ps$^2$/km)') zW_grid = reinterpolate(xW, y[:-1], zW) extent = (np.min(xW), np.max(xW), np.min(y), np.max(y[:-1])) ax3.imshow(zW_grid, extent=extent, vmin=mlIW - 40.0, vmax=mlIW, aspect='auto', origin='lower') ax3.autoscale(tight=True) ax3.set_xlim([loWL, hiWL]) ax3.set_xlabel('Wavelength (nm)') ax3.set_ylabel('Distance (m)') # plt.pcolormesh(xT, y, zT, vmin = mlIT - 40.0, vmax = mlIT) zT_grid = reinterpolate(xT, y[:-1], zT) extent = (np.min(xT), np.max(xT), np.min(y), np.max(y[:-1])) ax4.imshow(zT_grid, extent=extent, vmin=mlIT - 40.0, vmax=mlIT, aspect='auto', origin='lower') ax4.autoscale(tight=True) ax4.set_xlabel('Delay (ps)') # ax4.set_ylabel('Distance (m)') for label in ax4.get_yticklabels(): label.set_visible(False) ax1.plot(xW, zW[0], color='b', label='Before') ax1.plot(xW, zW[-1], color='r', label='After') ax1.set_ylim(-40, 0) ax2.plot(xT, zT[0], color='b', label='Before') ax2.plot(xT, zT[-1], color='r', label='After') ax2.set_ylim(-10, 40)
def run_simulation(caller=None, prop=False): bRun.label.set_text('Setting up...') drawnow() # Grab the parameters from the text boxes: pump_pulse_length = float(bPulse.text) centerwl = float(bWave.text) # in nm pump_power = float(bPower.text) * 1e3 fiber_length = float(bLength.text) * 1e-3 dz = float(bDz.text) steps = int(bSteps.text) npoints = int(eval(bPoints.text)) # set up the pulse parameters pulse = SechPulse(pump_power, pump_pulse_length, centerwl, time_window=10.0, GDD=0, TOD=0.0, NPTS=npoints, frep_MHz=100, power_is_avg=False) fiber1 = fiber.FiberInstance() fiber1.load_from_db(fiber_length, 'dudley') print 'Parameters\n------------------' print '--Pulse--' print 'Duration (ps) %f' % pump_pulse_length print 'Center wl (nm) %g' % centerwl print 'Pump power (W) %g' % pump_power print ' Energy (nJ) %f' % (pulse.calc_epp() * 1e9) print '--Fiber--' print 'Length (mm) %f' % (fiber_length * 1e3) print '--Simulation--' print 'dz %f' % dz print 'Steps %i' % steps print 'Time points %i' % npoints W = pulse.W_mks T = pulse.T_ps xW = W[W > 0] D = fiber1.Beta2_to_D(pulse) beta = fiber1.Beta2(pulse) # Plot the dispersion in the left plots lineL1.set_data(W[W > 0], D[W > 0]) lineL2.set_data(W[W > 0], beta[W > 0]) # plot the pulse in the top plots line1a.set_data(W[W > 0], dB(pulse.AW[W > 0])) line2a.set_data(T, dB(pulse.AT)) if prop == False: bRun.label.set_text('Run simulation') drawnow() return # stop here unless we've actually pressed the "Run" button ######################## Propagation t = time.time() bRun.label.set_text('Running...') drawnow() # set up the propagation parameters evol = SSFM.SSFM(dz=1e100, local_error=0.001, USE_SIMPLE_RAMAN=True) # propagate the pulse! y, AW, AT, pulse1 = evol.propagate(pulse_in=pulse, fiber=fiber1, n_steps=steps) zW_in = np.transpose(AW)[:, (W > 0)] zT_in = np.transpose(AT) zW = dB(zW_in) zT = dB(zT_in) bRun.label.set_text('Drawing plots...') drawnow() line1b.set_data(xW, zW[-1]) line2b.set_data(T, zT[-1]) for ax in (ax3, ax4): ax.clear() extent = (np.min(xW), np.max(xW), np.min(y), np.max(y[:-1])) ax3.imshow(zW, extent=extent, vmin=np.max(zW) - 40.0, vmax=np.max(zW), aspect='auto', origin='lower') ax3.set_xlabel('Wavelength (nm)') ax3.set_ylabel('Distance (m)') extent = (np.min(T), np.max(T), np.min(y), np.max(y[:-1])) ax4.imshow(zT, extent=extent, vmin=np.max(zT) - 40.0, vmax=np.max(zT), aspect='auto', origin='lower') ax4.set_xlabel('Delay (ps)') print 'Total time: %.2f sec' % (time.time() - t) bRun.label.set_text('Run simulation') drawnow()