def efield_at(self, phase): ''' Returns the EField circulating in the cavity at given phase ''' E_out = EField.from_EField(self.input_efield) E_out.E = self.compute_total_field(phase) return E_out
def cavity_fun(efield): efield = efield.propagate(d2).lens(f, lens_center).propagate(d1) efield = efield.tilt(2 * angle_m1) efield = efield.propagate(d1).lens(f, lens_center).propagate(d2) efield = efield.tilt(2 * angle_m2) return efield def cavity_fun(efield): # efield = efield.transmit(np.exp(-1j*efield.k*surface_map)) # efield = efield.lens(5) efield = efield.propagate(d2).lens(f).propagate(d1).propagate(d1) return efield.lens(f).propagate(d2) """ Calculation """ input_efield = sqrt(1 - r2**2) * EField.from_EField(E_ref).tilt(angle_beam) t = time() fields = compute_fields(cavity_fun, input_efield, r1 * r2 * tL**2, N_rt) t_fields = time() - t t = time() res = so.minimize_scalar(lambda dL: -compute_power(x, fields, lda, dL), bounds=(0, lda / 2), method='bounded', options={'xatol': lda / 10000}) t_minimize = time() - t n = 100 DdL = lda / 2 / 20 dLs = np.linspace(0, 1.2 * lda / 2, n)
def calculate_fields(self, input_efield, N=None): ''' Gets the fields propagated inside the cavity at every round trip. ''' self.input_efield = EField.from_EField(input_efield) self.fields = self.cavity.propagate_efield(input_efield, N=N)