Beispiel #1
0
def indicator_func(mpb, eps_slab, eps_air, type, TOL=1e-3):
    # type air_slab_bdry, slab_only, air_hole_slab_bdry
    epsilon = readfield(mpb, field_type='epsilon_isotropic_trace')

    if type == 'slab_only':
        indicator_slab = np.zeros(epsilon.dset.shape)
        mask_slab = abs(epsilon.dset[:] - eps_slab) <= TOL
        indicator_slab[mask_slab] = 1
        indicator = indicator_slab


    elif type == 'air_slab_bdry':
        indicator_air_slab_bdry = np.zeros(epsilon.dset.shape)
        # still keeps the slab-hole boundary
        mask_air_slab_bdry = np.logical_not(np.logical_or(abs(epsilon.dset[:]- eps_air) <= TOL, \
            abs(epsilon.dset[:]- eps_slab) <= TOL))
        indicator_air_slab_bdry[mask_slab_hole_bdry] = 1
        indicator = indicator_air_slab_bdry

    elif type == 'air_hole_slab_bdry':
        indicator_air_hole_slab_bdry = np.zeros(epsilon.dset.shape)
        # still keeps the slab-hole boundary
        mask_air_hole_slab_bdry = np.logical_not(np.logical_or(abs(epsilon.dset[:]- eps_air) <= TOL, \
            abs(epsilon.dset[:]- eps_slab) <= TOL))
        # loop over the z dimension and weed out slab-supercell boundary by looking
        # at mean epsilon in the xy cross section
        for k in range(epsilon.dset.shape[2]):
            # 0.5*(eps_air + eps_slab) is a reasonable estimate.
            if np.mean(epsilon.dset[:,:,k]) < 0.5*(eps_air + eps_slab):
                mask_air_hole_slab_bdry[:,:,k] = 0
        indicator_air_hole_slab_bdry[mask_slab_hole_bdry] = 1
        indicator = indicator_air_hole_slab_bdry
        # FOR DEBUGGING
        # plt.figure()
        # plt.imshow(indicator_slab_hole_bdry[:,:, int(epsilon.dset.shape[2]/2)])
        # plt.colorbar()
        # plt.show()
    else:
        print('Invalid type entereted. Valid options are')
        epsilon.close()
        return None
    epsilon.close()
    return indicator
Beispiel #2
0
def indicator_func(mpb, eps_slab, eps_air, type, TOL=1e-3):
    # type air_slab_bdry, slab_only, air_hole_slab_bdry
    epsilon = readfield(mpb, field_type='epsilon_isotropic_trace')

    if type == 'slab_only':
        indicator_slab = np.zeros(epsilon.dset.shape)
        mask_slab = abs(epsilon.dset[:] - eps_slab) <= TOL
        indicator_slab[mask_slab] = 1
        indicator = indicator_slab

    elif type == 'air_slab_bdry':
        indicator_air_slab_bdry = np.zeros(epsilon.dset.shape)
        # still keeps the slab-hole boundary
        mask_air_slab_bdry = np.logical_not(np.logical_or(abs(epsilon.dset[:]- eps_air) <= TOL, \
            abs(epsilon.dset[:]- eps_slab) <= TOL))
        indicator_air_slab_bdry[mask_slab_hole_bdry] = 1
        indicator = indicator_air_slab_bdry

    elif type == 'air_hole_slab_bdry':
        indicator_air_hole_slab_bdry = np.zeros(epsilon.dset.shape)
        # still keeps the slab-hole boundary
        mask_air_hole_slab_bdry = np.logical_not(np.logical_or(abs(epsilon.dset[:]- eps_air) <= TOL, \
            abs(epsilon.dset[:]- eps_slab) <= TOL))
        # loop over the z dimension and weed out slab-supercell boundary by looking
        # at mean epsilon in the xy cross section
        for k in range(epsilon.dset.shape[2]):
            # 0.5*(eps_air + eps_slab) is a reasonable estimate.
            if np.mean(epsilon.dset[:, :, k]) < 0.5 * (eps_air + eps_slab):
                mask_air_hole_slab_bdry[:, :, k] = 0
        indicator_air_hole_slab_bdry[mask_slab_hole_bdry] = 1
        indicator = indicator_air_hole_slab_bdry
        # FOR DEBUGGING
        # plt.figure()
        # plt.imshow(indicator_slab_hole_bdry[:,:, int(epsilon.dset.shape[2]/2)])
        # plt.colorbar()
        # plt.show()
    else:
        print('Invalid type entereted. Valid options are')
        epsilon.close()
        return None
    epsilon.close()
    return indicator
Beispiel #3
0
def plotfields(mpb, field_type, kindex=None, band=None, comp=None, mpbpostprocess=False,
    epsilon_contour_options={}, figsize=None, field_file=None, epsilon_file=None, plot_options={}):
    """
    Plots fields

    Inputs
    ------
    mpbpostprocess : False (default), assumes no post processing of the fields
                     has been performed using mpb-data
    field_type : 'e', 'epsilon', 'epsilon-ft'
    plot_options : specifies extra plot options such as axes limits
    """

    if figsize is not None:
        plt.figure(figsize=figsize)
    else:
        plt.figure()

    if epsilon_file is None:
        epsilon = readfield(mpb, field_type='epsilon_isotropic_trace', mpbpostprocess=mpbpostprocess)
    elif isinstance(epsilon_file, str):
        epsilon = readfield(mpb, field_type='epsilon_isotropic_trace', mpbpostprocess=mpbpostprocess, field_file=epsilon_file)

    if field_type == 'e':
        if field_file is None:
            E = readfield(mpb, kindex, band, field_type, mpbpostprocess=mpbpostprocess)
        elif isinstance(field_file, str):
            E = readfield(mpb, kindex, band, field_type, mpbpostprocess=mpbpostprocess, field_file=field_file)

        E.create_complex()
        if comp is None:
            E2 = np.abs(E.x)**2 + np.abs(E.y)**2 + np.abs(E.z)**2
            if E2.ndim == 1:
                # (x) = getscale(mpb)
                # (xgrid, ygrid) = np.meshgrid(x, x)
                # creates a E2.ndim x E2.ndim square grid
                E2grid = np.tile(E2, (E2.shape[0], 1))
                epsilon_grid = np.tile(epsilon.dset, (epsilon.dset.shape[0], 1))
                # plt.contourf(xgrid, ygrid, E2grid)
                # plt.pcolormesh(E2grid)
                plt.imshow(E2grid)
                plt.colorbar()
                # plt.contour(xgrid, ygrid, epsilon_grid, colors='k', linewidths=lw)
                plt.contour(epsilon_grid, colors='w', **epsilon_contour_options)
                ax = plt.gca()
                ax.set_xticks(())
                ax.set_yticks(())
                plt.xlim(0, E2grid.shape[0]-1)
                plt.ylim(0, E2grid.shape[1]-1)

            elif E2.ndim == 2:
                # (x, y) = getscale(mpb)
                # (xgrid, ygrid) = np.meshgrid(x, y)
                # plt.contourf(xgrid, ygrid, E2)
                # plt.pcolormesh(E2)
                plt.imshow(E2)
                plt.colorbar()
                # plt.contour(xgrid, ygrid, epsilon.dset, colors='k', linewidths=lw)
                plt.contour(epsilon.dset, colors='w', **epsilon_contour_options)
                ax = plt.gca()
                ax.set_xticks(())
                ax.set_yticks(())
                # Determine which grid is on the axis. If Ny > Nx, the yindices
                # are placed on the x-axis
                if E2.shape[0] >= E2.shape[1]:
                    plt.xlim(0, E2.shape[0]-1)
                    plt.ylim(0, E2.shape[1]-1)
                else:
                    plt.xlim(0, E2.shape[1]-1)
                    plt.ylim(0, E2.shape[0]-1)

            elif E2.ndim == 3:
                # ASSUME SLAB GEOMETRY
                # xy cross section
                plt.imshow(E2[:, :, E2.shape[2]/2], aspect='equal')
                plt.colorbar()
                plt.contour(epsilon.dset[:, :, epsilon.dset.shape[2]/2], colors='w', **epsilon_contour_options)
                ax = plt.gca()
                ax.set_xticks(())
                ax.set_yticks(())

                # Determine which grid is on the axis. If Ny > Nx, the yindices
                # are placed on the x-axis
                if E2.shape[0] >= E2.shape[1]:
                    plt.xlim(0, E2.shape[0]-1)
                    plt.ylim(0, E2.shape[1]-1)
                else:
                    plt.xlim(0, E2.shape[1]-1)
                    plt.ylim(0, E2.shape[0]-1)

    elif field_type == 'epsilon':
        if len(epsilon.dset.shape) == 1:
            epsilon_grid = np.tile(epsilon.dset, (epsilon.dset.shape[0], 1))
            # epsilon_grid_ft = fftshift(fft2(epsilon_grid))
            (x) = getscale(mpb)
            (xgrid, ygrid) = np.meshgrid(x, x)
            # plt.pcolormesh(xgrid, ygrid, epsilon_grid, cmap='Greys')
            plt.imshow(epsilon_grid, cmap='Greys')
            plt.colorbar()
            ax = plt.gca()
            ax.set_xticks(())
            ax.set_yticks(())
            plt.xlim(0, epsilon_grid.shape[0]-1)
            plt.ylim(0, epsilon_grid.shape[1]-1)
            # plt.figure()
            # plt.imshow(np.abs(epsilon_grid_ft)**2)
            # plt.colorbar()

        elif len(epsilon.dset.shape) == 2:
            # Greys or gray
            # plt.pcolor(epsilon.dset, cmap='Greys')
            # filter out DC_component
            # epsilon_ft[np.unravel_index(np.argmax(epsilon_ft), np.shape(epsilon_ft))] = 0

            plt.imshow(epsilon.dset, cmap='Greys')
            plt.colorbar()
            plt.xlim(0, epsilon.dset.shape[0]-1)
            plt.ylim(0, epsilon.dset.shape[1]-1)
            ax = plt.gca()
            ax.set_xticks(())
            ax.set_yticks(())

        elif len(epsilon.dset.shape) == 3:
            # ASSUME PC SLAB GEOMETRY ONLY
            # plot in middle of slab
            # xy cross section
            # plt.imshow(epsilon.dset[:, :, epsilon.dset.shape[2]/2], cmap='Greys', aspect='equal')
            # yz cross section
            # plt.imshow(epsilon.dset[epsilon.dset.shape[0]/2, :, :], cmap='Greys', aspect='equal')
            plt.imshow(epsilon.dset[0, :, :], cmap='Greys', aspect='equal')
            plt.colorbar()
            # plt.xlim(0, epsilon.dset.shape[0]-1)
            # plt.ylim(0, epsilon.dset.shape[1]-1)
            ax = plt.gca()
            ax.set_xticks(())
            ax.set_yticks(())

    elif field_type == 'epsilon-ft':
        if len(epsilon.dset.shape) == 1:
            pass
        elif len(epsilon.dset.shape) == 2:
            # zero pad
            epsilon_ft = fftshift(fft2(np.pad(epsilon.dset[:,:], (512, 512), 'constant')))
            plt.imshow((np.abs(epsilon_ft)/np.max(np.abs(epsilon_ft)))**2, cmap='Greys', vmin=0, vmax=0.1)
            ax = plt.gca()
            ax.set_xticks(())
            ax.set_yticks(())

        elif len(epsilon.dset.shape) == 3:
            pass

        ax = plt.gca()
        ax.set_xticks(())
        ax.set_yticks(())

        if 'xlims' in plot_options:
            xa = plot_options['xlims'][0]
            xb = plot_options['xlims'][1]
            plt.xlim(xa, xb)

        if 'ylims' in plot_options:
            ya = plot_options['ylims'][0]
            yb = plot_options['ylims'][1]
            plt.ylim(ya, yb)

    epsilon.close()
Beispiel #4
0
from MPBParser import MPBBandStructure, readfield, getscale
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as spintegrate
from indicator import indicator_func

mpb = MPBBandStructure('/home/nishan/Code/thales/MPB/w14/nonbloch/w14.out', symm='zeven')
# mpb.csvparser()
mpb.readbanddata()
#E_nonbloch = readfield(mpbobj=mpb, field_type='e.nonbloch.v', kindex=3, band=16)
E_nonbloch = readfield(field_file='/home/nishan/Code/thales/MPB/w14/nonbloch/e.nonbloch.v.k10.b16.zeven.h5', field_type='e.nonbloch.v')
E_nonbloch.create_complex()

# (x, dx, y, dy, z, dz) = getscale(mpb, retstep=True)

ind = indicator_func(mpb, 10.0489, 1.0, 'slab_only')
# for DEBUGGING
# plt.figure()
# plt.imshow(ind[:,:, 50])
# plt.colorbar()
# plt.show()


def nlo_coeffs(efield, indicator, ccnl):
    """
    Returns the nonlinear coupling coeffs after integration
    efield is assumed to be nonbloch
    """

    (x, y, z) = getscale(mpb)
    # (x, dx, y, dy, z, dz) = getscale(mpb, retstep=True)