def Ez_to_H(Ez, omega, dL, npml): """ Converts the Ez output of mode solver to Hx and Hy components """ N = Ez.size matrices = compute_derivative_matrices(omega, (N, 1), [npml, 0], dL=dL) Dxf, Dxb, Dyf, Dyb = matrices # save to a dictionary for convenience passing to primitives info_dict = {} info_dict['Dxf'] = Dxf info_dict['Dxb'] = Dxb info_dict['Dyf'] = Dyf info_dict['Dyb'] = Dyb Hx, Hy = Ez_to_Hx_Hy(Ez) return Hx, Hy
def get_modes(eps_cross, omega, dL, npml, m=1, filtering=True): """ Solve for the modes of a waveguide cross section ARGUMENTS eps_cross: the permittivity profile of the waveguide omega: angular frequency of the modes dL: grid size of the cross section npml: number of PML points on each side of the cross section m: number of modes to solve for filtering: whether to filter out evanescent modes RETURNS vals: array of effective indeces of the modes vectors: array containing the corresponding mode profiles """ k0 = omega / C_0 N = eps_cross.size matrices = compute_derivative_matrices(omega, (N, 1), [npml, 0], dL=dL) Dxf, Dxb, Dyf, Dyb = matrices diag_eps_r = sp.spdiags(eps_cross.flatten(), [0], N, N) A = diag_eps_r + Dxf.dot(Dxb) * (1 / k0)**2 n_max = np.sqrt(np.max(eps_cross)) vals, vecs = solver_eigs(A, m, guess_value=4 * n_max) if filtering: filter_re = lambda vals: np.real(vals) > 0.0 # filter_im = lambda vals: np.abs(np.imag(vals)) <= 1e-12 filters = [filter_re] vals, vecs = filter_modes(vals, vecs, filters=filters) if vals.size == 0: raise BaseException("Could not find any eigenmodes for this waveguide") vecs = normalize_modes(vecs) return vals, vecs