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)