Пример #1
0
 def flattened_potential_energy(xy):
     # We convert xy to a 2D array here.
     xy = xy.reshape((-1, 2))
     bL = le.bond_length_list(xy, BL)
     # print 'bL = ', bL
     bU = 0.5 * sum(kL * (bL - bo)**2)
     return bU
Пример #2
0
def data2stills_2Dgyros(datadir,
                        simoutdir,
                        params,
                        framedir_name='stills',
                        init_skip=10,
                        climv=0.1,
                        numbering='adopt',
                        rough=False,
                        roughmov=True,
                        exaggerate=1.0,
                        rm_stills=True,
                        resolution=150,
                        figsize='auto',
                        color_particles='k',
                        DOSexcite=None,
                        lp=None,
                        framerate=10,
                        mov_exten='',
                        title='',
                        dos_meshfn_dir=None,
                        movname=None,
                        lw=2,
                        **kwargs):
    """Converts a list of data into a stack of png images of gyroscopic lattice using timestep_plot for each timestep.

    Parameters
    ----------
    simoutdir : string
        The output directory for the simulation (contains subdirs for xyv, KL)
    params : dict
        Parameters dictionary
    framedir_name : string
        Subdirectory of simoutdir in which to save movie images
    vsaved : bool
        whether the velocites are recorded (vsaved = False for Nash gyros, True for gHST, for example)
    init_skip : int
        One out of every init_skip frames will be written first, then the intermittent frames will be written, to see
        briefly what happens
    climv : float or tuple
        Color limit for coloring bonds by bond strain
    numbering : 'natural' or 'adopt' (default = 'adopt')
        Use indexing '0','1','2','3',... or adopt the index of the input file.
    rough : boolean
        Plot every init_skip files ONLY? (if False, writes every init_skip files first, then does the rest)
    exaggerate : float (default 1.0 --> in which case it is ignored)
        Exaggerate the displacements of each particle from its initial position by this factor. Ignored if == 1.0
    rm_stills : bool
        Whether or not to delete the stills after making them.
    DOSexcite : tuple of floats or None
        (excitation frequency, stdev time), or else None if DOS plot is not desired
    lp : dict
        Lattice parameters. If not None, then if eigval is not found in main dir, attempts to load eigval from gyro
        network, but will not compute it
    framerate : int or float (optional, default=10)
        framerate for movie
    mov_exten : str (optional)
        additional description to append to movie name, if movname is None
    movname : str or None
        Name or full path with name of movie to output of the simulation
    **kwargs : keyword arguments for leplt.timestep_plot()
        such as bgcolor, cmap (the strain colormap), color_particles, mimic_expt


    Returns
    ----------
    """
    plt.close('all')
    print 'Running data2stills_2Dgyros with DOSexcite = ', DOSexcite
    # get dirs
    # vsaved denotes whether the velocites are recorded
    # vsaved = False for Nash gyros, True for gHST, for example
    print 'simoutdir = ', simoutdir
    try:
        xypath = sorted(glob.glob(simoutdir + 'xyv/'))[0]
        vsaved = True
    except IndexError:
        xypath = sorted(glob.glob(simoutdir + 'xy/'))[0]
        vsaved = False
    # list files
    xyfiles = sorted(glob.glob(xypath + '*.txt'))
    # load setup
    NLfile = sorted(glob.glob(datadir + 'NL.txt'))[0]
    NL = np.loadtxt(NLfile, dtype='int', delimiter=',')
    xy0file = sorted(glob.glob(datadir + 'xy.txt'))[0]
    xy0 = np.loadtxt(xy0file, delimiter=',', usecols=(0, 1))

    if 'deform' in params:
        if params['deform']:
            deform_xy0 = True
            xy0path = sorted(glob.glob(simoutdir + 'xy0/'))[0]
            xy0files = sorted(glob.glob(xy0path + '*.txt'))
        else:
            deform_xy0 = False
            xy0files = []

    try:
        KLpath = sorted(glob.glob(simoutdir + 'KL/'))[0]
        KLfiles = sorted(glob.glob(KLpath + '*.txt'))
        if KLfiles:
            print 'found KLfiles --> update KL each timestep'
            update_KL_each_timestep = True
            KL = np.loadtxt(KLfiles[0], delimiter=',')
        else:
            print 'KLfiles =', KLfiles, '\n --> do not update KL'
            update_KL_each_timestep = False
            KL = np.loadtxt(datadir + 'KL.txt', dtype='int', delimiter=',')
            BM0 = le.NL2BM(xy0, NL, KL)
    except IndexError:
        print 'no KLfiles --> do not update KL'
        update_KL_each_timestep = False
        KL = np.loadtxt(datadir + 'KL.txt', dtype='int', delimiter=',')
        BM0 = le.NL2BM(xy0, NL, KL)

    if 'h' in params:
        hh = params['h']
    elif 'hh' in params:
        hh = params['hh']
    else:
        hfile = sorted(glob.glob(datadir + 'h.txt'))[0]
        hh = np.loadtxt(hfile)

    # get base name from xyfile
    name = 'still'
    if vsaved:
        # name = (xyfiles[0].split('/')[-1]).split('xyv')[0]
        try:
            x, y, vx, vy = np.loadtxt(xyfiles[0], delimiter=',', unpack=True)
        except:
            x, y, z, vx, vy, vz = np.loadtxt(xyfiles[0],
                                             delimiter=',',
                                             unpack=True)
    else:
        # name = (xyfiles[0].split('/')[-1]).split('xy')[0]
        try:
            '''Data is 2D'''
            x, y = np.loadtxt(xyfiles[0], delimiter=',', unpack=True)
        except:
            try:
                '''Data is 3D'''
                x, y, z = np.loadtxt(xyfiles[0], delimiter=',', unpack=True)
            except:
                '''Data is X,Y,dX,dY'''
                X, Y, dX, dY = np.loadtxt(xyfiles[0],
                                          delimiter=',',
                                          unpack=True)

    # get length of index string from xyfile
    index_sz = str(len((xyfiles[0].split('_')[-1]).split('.')[0]))
    # make output dir
    outdir = simoutdir + framedir_name + '/'
    dio.ensure_dir(outdir)
    # set range of window from first values
    xlimv = np.ceil(max(x) * 5. / 4.)
    ylimv = np.ceil(max(y) * 5. / 4.)

    # Initial bond list and
    # count initial bonds (double counted)
    # nzcount = np.count_nonzero(KL)
    BL0 = le.NL2BL(NL, KL)
    bo = le.bond_length_list(xy0, BL0)

    # make list of indices to plot-- first sparse then dense
    do1 = [0] + range(0, len(xyfiles), init_skip)

    # Set up figure
    if figsize == 'auto':
        fig = plt.gcf()
        plt.clf()
    else:
        plt.close('all')
        fig = plt.figure(figsize=figsize)

    print 'DOSexcite = ', DOSexcite
    if DOSexcite is not None:
        # Load DOS eigvals:
        eigvalpklglob = glob.glob(datadir + 'eigval.pkl')
        if eigvalpklglob:
            with open(datadir + 'eigval.pkl', "rb") as input_file:
                eigval = cPickle.load(input_file)
            eval_loaded = True
        else:
            print 'Did not find eigval in simulation dir (datadir), attempting to load based on supplied meshfn...'
            # If you want to load eigvals from a lattice other than the one being simulated, put a "pointer file"
            # txt file with the path to that meshfn in your simulation directory: for ex, put 'meshfn_eigvals.txt'
            # in the simdir, with contents '/Users/username/...path.../hexagonal_square_delta0p667_...000010_x_000010/'
            if dos_meshfn_dir is None or dos_meshfn_dir == 'none':
                dos_meshfn_dir = datadir

            meshfn_specfn = glob.glob(
                dio.prepdir(dos_meshfn_dir) + 'meshfn_eig*.txt')
            print 'dos_meshfn_dir = ', dos_meshfn_dir
            print 'meshfn_specfn = ', meshfn_specfn
            if meshfn_specfn:
                with open(meshfn_specfn[0], 'r') as myfile:
                    meshfn = myfile.read().replace('\n', '')
                if lp is not None:
                    # Build correct eigval to load based on lp (gyro lattice parameters) by grabbing lp[meshfn_exten]
                    import lepm.lattice_class
                    import lepm.gyro_lattice_class
                    # lp = {'LatticeTop': params['LatticeTop'], 'meshfn': params['meshfn']}
                    lat = lepm.lattice_class.Lattice(lp=lp)
                    lat.load()
                    mlat = lepm.magnetic_gyro_lattice_class.MagneticGyroLattice(
                        lat, lp)
                    eigvalfn = dio.prepdir(
                        meshfn) + 'eigval' + mlat.lp['meshfn_exten'] + '.pkl'
                else:
                    print 'since no lp supplied, assuming eigval is default in datadir...'
                    eigvalfn = dio.prepdir(meshfn) + 'eigval_magnetic.pkl'
                with open(eigvalfn, "rb") as fn:
                    eigval = cPickle.load(fn)
                eval_loaded = True
            else:
                print 'plotting.time_domain_magnetic: Did not find eigval or eigval pointer file in datadir, ' + \
                      'attempting to load based on lp...'
                if lp is not None:
                    print 'Loading based on lp...'
                    # No eigval saved in lattice GyroLattice's meshfn, seeking alternative
                    import lepm.lattice_class
                    import lepm.gyro_lattice_class
                    # lp = {'LatticeTop': params['LatticeTop'], 'meshfn': params['meshfn']}
                    lat = lepm.lattice_class.Lattice(lp=lp)
                    lat.load()
                    print 'lp = ', lp
                    print 'lp[Omk] = ', lp['Omk']
                    mlat = lepm.magnetic_gyro_lattice_class.MagneticGyroLattice(
                        lat, lp)
                    eigval = mlat.load_eigval()
                    if eigval is None:
                        eigval = mlat.get_eigval()
                        print 'Calculated eigval based on supplied GyroLattice instance, using lp dictionary.'
                    else:
                        print 'Loaded eigval from disk, from a location determined by the lp dictionary.'
                    eval_loaded = True
                else:
                    eval_loaded = False
                    raise RuntimeError(
                        'Did not supply lp and eigval is not in datadir!')

        if eval_loaded:
            # Attempt to load ipr for network
            iprglob = glob.glob(datadir + 'ipr.pkl')
            if iprglob:
                with open(datadir + 'ipr.pkl', "rb") as input_file:
                    ipr = cPickle.load(input_file)
                    colorV = 1. / ipr
                    linewidth = 0
                    cax_label = r'$p$'
                    colormap = 'viridis_r'
                    vmin_hdr = None
                    vmax_hdr = None
                    cbar_ticklabels = None
                    cbar_nticks = 4
            else:
                locglob = glob.glob(datadir + 'localization*.txt')
                if locglob:
                    localization = np.loadtxt(locglob[0], delimiter=',')
                    ill = localization[:, 2]
                    ill_full = np.zeros(len(eigval), dtype=float)
                    ill_full[0:int(len(eigval) * 0.5)] = ill[::-1]
                    ill_full[int(len(eigval) * 0.5):len(eigval)] = ill
                    colorV = ill_full
                    linewidth = 0
                    cax_label = r'$\lambda^{-1}$'
                    colormap = 'viridis'
                    vmin_hdr = 0.0
                    vmax_hdr = 1. / (np.max(np.abs(xy0.ravel())))
                    cbar_ticklabels = ['0', r'$1/L$', r'$2/L$']
                    cbar_nticks = 3
                else:
                    print 'plotting.time_domain_magnetic: Did not find ipr in simulation dir (datadir), ' +\
                          'attempting to load based on supplied meshfn...'
                    # First seek directly supplied files in the simulation datadir
                    meshfn_specfn = glob.glob(datadir + 'meshfn_*ipr.txt')
                    if meshfn_specfn:
                        with open(meshfn_specfn[0], 'r') as myfile:
                            meshfn = myfile.read().replace('\n', '')
                        with open(
                                dio.prepdir(meshfn) + 'ipr' +
                                lp['meshfn_exten'] + '.pkl', "rb") as fn:
                            ipr = cPickle.load(fn)
                        colorV = 1. / ipr
                        cax_label = r'$p$'
                        colormap = 'viridis_r'
                        linewidth = 0
                        vmin_hdr = None
                        vmax_hdr = None
                        cbar_ticklabels = None
                        cbar_nticks = 4
                    else:
                        print '\n\n\nComputing localization from supplied meshfn\n\n\n'
                        if dos_meshfn_dir is None or dos_meshfn_dir == 'none':
                            dos_meshfn_dir = datadir

                        meshfn_specfn = glob.glob(
                            dio.prepdir(dos_meshfn_dir) +
                            'meshfn_*localization.txt')
                        print 'meshfn_specfn = ', meshfn_specfn
                        if meshfn_specfn:
                            with open(meshfn_specfn[0], 'r') as myfile:
                                meshfn = myfile.read().replace('\n', '')
                            if lp is not None:
                                print 'Loading based on lp...'
                                import lepm.lattice_class
                                import lepm.gyro_lattice_class
                                # lp = {'LatticeTop': params['LatticeTop'], 'meshfn': params['meshfn']}
                                lat = lepm.lattice_class.Lattice(lp=lp)
                                lat.load()
                                mlat = lepm.magnetic_gyro_lattice_class.MagneticGyroLattice(
                                    lat, lp)
                                loczfn = dio.prepdir(
                                    meshfn) + 'localization' + mlat.lp[
                                        'meshfn_exten'] + '.txt'
                                specmeshfn_xy = lat.xy
                            else:
                                print 'plotting.time_domain_magnetic: no lp supplied, assuming default lattice ' +\
                                      'params to load localization in attempt to load localization...'
                                loczfn = dio.prepdir(
                                    meshfn) + 'localization_magnetic.txt'
                                try:
                                    specmeshfn_xy = np.loadtxt(meshfn +
                                                               '_xy.txt')
                                except:
                                    specmeshfn_xy = np.loadtxt(meshfn +
                                                               '_xy.txt',
                                                               delimiter=',')

                            localization = np.loadtxt(loczfn, delimiter=',')
                            ill = localization[:, 2]
                            ill_full = np.zeros(len(eigval), dtype=float)
                            ill_full[0:int(len(eigval) * 0.5)] = ill[::-1]
                            ill_full[int(len(eigval) * 0.5):len(eigval)] = ill
                            colorV = ill_full
                            linewidth = 0
                            cax_label = r'$\lambda^{-1}$'
                            colormap = 'viridis'
                            vmin_hdr = 0.0
                            vmax_hdr = 1. / (np.max(
                                np.abs(specmeshfn_xy.ravel())))
                            cbar_ticklabels = ['0', r'$1/L$', r'$2/L$']
                            cbar_nticks = 3
                        else:
                            print 'plotting.time_domain_magnetic: Did not find ipr or localization in datadirs,' +\
                                  ' attempting to load based on lp...'
                            if lp is not None:
                                print 'Loading based on lp...'
                                import lepm.lattice_class
                                import lepm.gyro_lattice_class
                                # lp = {'LatticeTop': params['LatticeTop'], 'meshfn': params['meshfn']}
                                lat = lepm.lattice_class.Lattice(lp=lp)
                                lat.load()
                                mlat = lepm.magnetic_gyro_lattice_class.MagneticGyroLattice(
                                    lat, lp)
                                if mlat.lp['periodicBC']:
                                    localization = mlat.get_localization()
                                    ill = localization[:, 2]
                                    ill_full = np.zeros(len(eigval),
                                                        dtype=float)
                                    ill_full[0:int(len(eigval) *
                                                   0.5)] = ill[::-1]
                                    ill_full[int(len(eigval) *
                                                 0.5):len(eigval)] = ill
                                    colorV = ill_full
                                    cax_label = r'$\lambda^{-1}$'
                                    vmin_hdr = 0.0
                                    vmax_hdr = 1. / (np.max(np.abs(
                                        xy0.ravel())))
                                else:
                                    ipr = mlat.get_ipr()
                                    colorV = 1. / ipr
                                    cax_label = r'$p$'
                                    colormap = 'viridis_r'
                                    vmin_hdr = None
                                    vmax_hdr = None
                                    cbar_ticklabels = None
                                    cbar_nticks = 4
                                linewidth = 0
                            else:
                                print 'Did not supply lp and neither ipr nor localization are in datadir!'
                                colorV = None
                                linewidth = 1
                                cax_label = ''
                                colormap = 'viridis'
                                vmin_hdr = None
                                vmax_hdr = None
                                cbar_ticklabels = None
                                cbar_nticks = 4

            plt.close('all')
            if np.max(xy0[:, 0]) - np.min(
                    xy0[:, 0]) > 2.0 * (np.max(xy0[:, 1]) - np.min(xy0[:, 1])):
                # Plot will be very wide, so initialize a wide plot (landscape 16:9)
                orientation = 'landscape'
                # Note: header axis is [0.30, 0.80, 0.45, 0.18]
                if title == '' or title is None:
                    ax_pos = [0.1, 0.05, 0.8, 0.54]
                    cbar_pos = [0.79, 0.80, 0.012, 0.15]
                else:
                    ax_pos = [0.1, 0.03, 0.8, 0.50]
                    cbar_pos = [0.79, 0.70, 0.012, 0.15]
            else:
                # Plot will be roughly square or tall, so initialize a portfolio-style plot
                orientation = 'portrait'
                if title == '' or title is None:
                    ax_pos = [0.1, 0.10, 0.8, 0.60]
                    cbar_pos = [0.79, 0.80, 0.012, 0.15]
                else:
                    ax_pos = [0.1, 0.03, 0.8, 0.60]
                    cbar_pos = [0.79, 0.75, 0.012, 0.15]

            # Determine line width
            if len(xy0) > 2000:
                lw = 1
            else:
                lw = 2

            if cax_label == r'$\lambda^{-1}$':
                if 'penrose' in lp['LatticeTop']:
                    dos_ylabel = 'Density of states, ' + r'$D(\omega)$' + '\nfor periodic approximant'
                else:
                    dos_ylabel = 'Density of states, ' + r'$D(\omega)$' + '\nfor periodic system'
                ylabel_pad = 30
                ylabel_rot = 90
            else:
                dos_ylabel = r'$D(\omega)$'
                ylabel_pad = 20
                ylabel_rot = 0

            print 'plt.get_fignums() = ', plt.get_fignums()
            fig, DOS_ax, ax = \
                leplt.initialize_eigvect_DOS_header_plot(eigval, xy0, sim_type='gyro',
                                                         page_orientation=orientation,
                                                         ax_pos=ax_pos, cbar_pos=cbar_pos,
                                                         colorV=colorV, vmin=vmin_hdr, vmax=vmax_hdr,
                                                         DOSexcite=DOSexcite, linewidth=linewidth,
                                                         cax_label=cax_label, colormap=colormap,
                                                         cbar_nticks=cbar_nticks,
                                                         cbar_tickfmt='%0.2f', cbar_ticklabels=cbar_ticklabels,
                                                         cbar_labelpad=17,
                                                         yaxis_ticks=[], ylabel=dos_ylabel,
                                                         ylabel_rot=ylabel_rot, ylabel_pad=ylabel_pad,
                                                         nbins=120, xlabel_pad=15)
            # DOSexcite = (frequency, sigma_time)
            # amp(x) = exp[- acoeff * time**2]
            # amp(k) = sqrt(pi/acoeff) * exp[- pi**2 * k**2 / acoeff]
            # So 1/(2 * sigma_freq**2) = pi**2 /acoeff
            # So sqrt(acoeff/(2 * pi**2)) = sigma_freq

            # sigmak = 1./DOSexcite[1]
            # xlims = DOS_ax.get_xlim()
            # ktmp = np.linspace(xlims[0], xlims[1], 300)
            # gaussk = 0.8 * DOS_ax.get_ylim()[1] * np.exp(-(ktmp - DOSexcite[0])**2 / (2. * sigmak))
            # DOS_ax.plot(ktmp, gaussk, 'r-')
            # plt.sca(ax)
        else:
            print 'Could not find eigval.pkl to load for DOS portion of data2stills plots!'
            ax = plt.gca()
    else:
        ax = plt.gca()

    # Check for evolving rest lengths in params
    if 'prestrain' in params:
        prestrain = params['prestrain']
    else:
        prestrain = 0.

    if 'shrinkrate' in params:
        shrinkrate = params['shrinkrate']
    else:
        shrinkrate = 0.0

    if roughmov:
        print 'creating rough gyro movie...'
        tdgyros.stills2mov_gyro(fig,
                                ax,
                                do1,
                                xyfiles,
                                KLfiles,
                                xy0files,
                                xy0,
                                NL,
                                KL,
                                BM0,
                                params,
                                hh,
                                numbering,
                                index_sz,
                                outdir,
                                name,
                                simoutdir,
                                update_KL_each_timestep,
                                deform_xy0,
                                exaggerate,
                                xlimv,
                                ylimv,
                                climv,
                                resolution,
                                color_particles,
                                shrinkrate,
                                prestrain,
                                framerate=float(framerate) / 5.,
                                mov_exten='_rough',
                                linewidth=lw,
                                startind=0,
                                title=title,
                                show_bonds=False,
                                **kwargs)

    # Now do detailed movie if rough is False
    if not rough:
        print 'creating fine gyro movie (not skipping any frames)...'
        doall = [0] + range(0, len(xyfiles))
        # do2 = list(set(doall)-set(do1))
        # ftodo = do1 + do2

        print 'tdmagnetic: exiting here since it is broken here'
        # sys.exit()
        tdgyros.stills2mov_gyro(fig,
                                ax,
                                doall,
                                xyfiles,
                                KLfiles,
                                xy0files,
                                xy0,
                                NL,
                                KL,
                                BM0,
                                params,
                                hh,
                                numbering,
                                index_sz,
                                outdir,
                                name,
                                simoutdir,
                                update_KL_each_timestep,
                                deform_xy0,
                                exaggerate,
                                xlimv,
                                ylimv,
                                climv,
                                resolution,
                                color_particles,
                                shrinkrate,
                                prestrain,
                                framerate=framerate,
                                mov_exten=mov_exten,
                                linewidth=lw,
                                startind=0,
                                title=title,
                                movname=movname,
                                show_bonds=False,
                                **kwargs)

        if rm_stills:
            # Delete the original images
            print 'Deleting folder ' + simoutdir + 'stills/'
            subprocess.call(['rm', '-r', simoutdir + 'stills/'])
Пример #3
0
def build_accordionkag_isocent(lp):
    """Create an accordion-bonded kagomized amorphous network from a loaded jammed point set.

    Parameters
    ----------
    lp

    Returns
    -------

    """
    shape = lp['shape']
    check = lp['check']
    NH = lp['NH']
    NV = lp['NV']
    print('Loading isostatic to build kagome-decorated lattice...')
    import lepm.build.build_jammed as build_jammed
    use_hexner = (lp['source'] == 'hexner')
    if use_hexner:
        # Use Daniel Hexner's lattices
        points, BL, LLv, numberstr, sizestr, lp = build_jammed.load_hexner_jammed(
            lp, BL_load=False)
        LL = (LLv, LLv)
    else:
        number = '{0:03d}'.format(int(lp['loadlattice_number']))
        zindex = '{0:03d}'.format(int(lp['loadlattice_z']))
        points = np.loadtxt(lp['rootdir'] + 'networks/' +
                            'isostatic_source/isostatic_homog_z' + zindex +
                            '_conf' + number + '_nodes.txt')
        # LL = NH

    points -= np.mean(points, axis=0)

    # Separate procedure if not using entire lattice
    if lp['NP_load'] == 0:
        # Do initial (generous) cropping if not using entire lattice
        if check:
            plt.plot(points[:, 0], points[:, 1], 'b.')
            plt.title('Point set before initial cutting')
            plt.show()
        xytmp, trash1, trash2, trash3 = blf.mask_with_polygon(shape,
                                                              NH * 1.2 + 8,
                                                              NV * 1.2 + 8,
                                                              points, [],
                                                              eps=0.)
        polygon = blf.auto_polygon(shape, NH, NV, eps=0.00)
        if check:
            plt.plot(xytmp[:, 0], xytmp[:, 1], 'b.')
            plt.title('Point set after initial cutting')
            plt.show()

        xy, NL, KL, BL = le.delaunay_centroid_lattice_from_pts(
            xytmp, polygon=polygon, trimbound=False, check=lp['check'])

        #################################################################
        # nzag controlled by lp['intparam'] below
        xyacc, BLacc, LVUC, UC, xyvertices, lattice_exten_add = \
            blf.accordionize_network(xy, BL, lp, PVxydict=None, PVx=None, PVy=None, PV=None)

        print 'BL = ', BL

        # need indices of xy that correspond to xyvertices
        # note that xyvertices gives the positions of the vertices, not their indices
        inRx = np.in1d(xyacc[:, 0], xyvertices[:, 0])
        inRy = np.in1d(xyacc[:, 1], xyvertices[:, 1])
        vxind = np.where(np.logical_and(inRx, inRy))[0]
        print 'vxind = ', vxind

        # Note: beware, do not provide NL and KL to decorate_bondneighbors_elements() since NL,KL need
        # to be recalculated
        xy, BL = blf.decorate_bondneighbors_elements(xyacc,
                                                     BLacc,
                                                     vxind,
                                                     PVxydict=None,
                                                     viewmethod=False,
                                                     check=lp['check'])
        NL, KL = le.BL2NLandKL(BL, NP=len(xy))

        #################################################################

        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict = {}
        PVx = []
        PVy = []
        periodicBCstr = ''
    else:
        polygon = 0.5 * np.array([[-LL[0], -LL[1]], [LL[0], -LL[1]],
                                  [LL[0], LL[1]], [-LL[0], LL[1]]])
        xy, NL, KL, BL, PVxydict = blf.kagomecentroid_periodic_network_from_pts(
            points, LL, BBox='auto', check=lp['check'])
        PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
        periodicBCstr = '_periodic'

    # Rescale so that median bond length is unity
    bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
    scale = 1. / np.median(bL)
    xy *= scale
    polygon *= scale
    LL = (LL[0] * scale, LL[1] * scale)
    if lp['periodicBC']:
        PVx *= scale
        PVy *= scale
        PVxydict.update((key, val * scale) for key, val in PVxydict.items())

    lattice_exten = 'accordionkag_isocent_' + shape + periodicBCstr + '_d{0:02d}'.format(int(lp['conf'])) + \
                    lattice_exten_add

    if use_hexner:
        lattice_exten = 'accordionkag_isocent_' + shape + periodicBCstr + '_hexner_size' + sizestr + '_conf' + \
                        numberstr + lattice_exten_add
    else:
        lattice_exten = 'accordionkag_isocent_' + shape + periodicBCstr + '_ulrich_homog_zindex' + zindex + \
                        lattice_exten_add
    LV = 'none'
    LVUC = 'none'
    UC = 'none'
    BBox = polygon
    return xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten
Пример #4
0
def build_iscentroid(lp):
    """Build centroidal (honeycomb-like) network from isostatic point set generated by Daniel Hexner.

    """
    NH = lp['NH']
    NV = lp['NV']
    # First check that if periodic, NP_load is defined as nonzero
    if lp['periodicBC']:
        if lp['NP_load'] == 0:
            RuntimeError(
                'For iscentroid lattices, if periodicBC, then must specify NP_load instead of NH, NV.'
            )

    use_hexner = (lp['source'] == 'hexner')
    if use_hexner:
        # Use Daniel Hexner's lattices
        points, BL, LLv, numberstr, sizestr, lp = build_jammed.load_hexner_jammed(
            lp, BL_load=False)
        LL = (LLv, LLv)
    else:
        # Use Stephan Ulrich's lattices
        if lp['periodicBC']:
            RuntimeError('Not sure if Stephan Ulrich lattices are periodic!')
        number = '{0:03d}'.format(int(lp['loadlattice_number']))
        zindex = '{0:03d}'.format(int(lp['loadlattice_z']))
        points = np.loadtxt(lp['rootdir'] + 'networks/' +
                            'isostatic_source/isostatic_homog_z' + zindex +
                            '_conf' + number + '_nodes.txt')
        LL = (NH, NV)

    points -= np.mean(points, axis=0)

    # Do initial (generous) cropping if not using entire lattice
    if lp['NP_load'] == 0:
        if lp['check']:
            plt.plot(points[:, 0], points[:, 1], 'b.')
            plt.title('Point set before initial cutting')
            plt.show()
        xytmp, trash1, trash2, trash3 = \
            blf.mask_with_polygon(lp['shape'], NH * 2. + 5, NV * 2. + 5, points, [], eps=0.00)
        polygon = blf.auto_polygon(lp['shape'], NH, NV, eps=0.00)
        if lp['check']:
            plt.plot(xytmp[:, 0], xytmp[:, 1], 'b.')
            plt.title('Point set after initial cutting')
            plt.show()
        xy, NL, KL, BL = le.delaunay_centroid_lattice_from_pts(
            xytmp, polygon=polygon, trimbound=False, check=lp['check'])
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict = {}
        PVx = []
        PVy = []
        periodicBCstr = ''
    else:
        polygon = 0.5 * np.array([[-LL[0], -LL[1]], [LL[0], -LL[1]],
                                  [LL[0], LL[1]], [-LL[0], LL[1]]])
        xy, NL, KL, BL, PVxydict = le.delaunay_centroid_rect_periodic_network_from_pts(
            points, LL, BBox='auto', check=lp['check'])
        PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
        periodicBCstr = '_periodic'
    if lp['check']:
        plt.plot(xy[:, 0], xy[:, 1], 'b.')
        plt.title('Point set after decoration and cropping')
        plt.show()

    # Rescale so that median bond length is unity
    bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
    scale = 1. / np.median(bL)
    xy *= scale
    polygon *= scale
    LL = (LL[0] * scale, LL[1] * scale)
    if lp['NP_load'] != 0:
        PVx *= scale
        PVy *= scale
        PVxydict.update((key, val * scale) for key, val in PVxydict.items())

    if use_hexner:
        lattice_exten = 'iscentroid_' + lp[
            'shape'] + periodicBCstr + '_hexner_size' + sizestr + '_conf' + numberstr
    else:
        lattice_exten = 'iscentroid_' + lp[
            'shape'] + periodicBCstr + '_homog_zindex' + zindex + '_conf' + number[
                1:]
    BBox = polygon
    LV = 'none'
    LVUC = 'none'
    UC = 'none'
    return xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten
Пример #5
0
def build_kagome_isocent(lp):
    """

    Parameters
    ----------
    lp

    Returns
    -------

    """
    shape = lp['shape']
    check = lp['check']
    NH = lp['NH']
    NV = lp['NV']
    print('Loading isostatic to build kagome-decorated lattice...')
    import lepm.build.build_jammed as build_jammed
    use_hexner = (lp['source'] == 'hexner')
    if use_hexner:
        # Use Daniel Hexner's lattices
        points, BL, LLv, numberstr, sizestr, lp = build_jammed.load_hexner_jammed(
            lp, BL_load=False)
        LL = (LLv, LLv)
    else:
        number = '{0:03d}'.format(int(lp['loadlattice_number']))
        zindex = '{0:03d}'.format(int(lp['loadlattice_z']))
        points = np.loadtxt(lp['rootdir'] + 'networks/' +
                            'isostatic_source/isostatic_homog_z' + zindex +
                            '_conf' + number + '_nodes.txt')
        # LL = NH

    points -= np.mean(points, axis=0)

    # Separate procedure if not using entire lattice
    if lp['NP_load'] == 0:
        # Do initial (generous) cropping if not using entire lattice
        if check:
            plt.plot(points[:, 0], points[:, 1], 'b.')
            plt.title('Point set before initial cutting')
            plt.show()
        xytmp, trash1, trash2, trash3 = blf.mask_with_polygon(shape,
                                                              NH * 1.2 + 8,
                                                              NV * 1.2 + 8,
                                                              points, [],
                                                              eps=0.)
        polygon = blf.auto_polygon(shape, NH, NV, eps=0.00)
        if check:
            plt.plot(xytmp[:, 0], xytmp[:, 1], 'b.')
            plt.title('Point set after initial cutting')
            plt.show()

        xy, NL, KL, BL = blf.kagomecentroid_lattice_from_pts(xytmp,
                                                             polygon=polygon,
                                                             trimbound=False,
                                                             thres=2.0,
                                                             check=lp['check'])
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict = {}
        PVx = []
        PVy = []
        periodicBCstr = ''
    else:
        polygon = 0.5 * np.array([[-LL[0], -LL[1]], [LL[0], -LL[1]],
                                  [LL[0], LL[1]], [-LL[0], LL[1]]])
        xy, NL, KL, BL, PVxydict = blf.kagomecentroid_periodic_network_from_pts(
            points, LL, BBox='auto', check=lp['check'])
        PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
        periodicBCstr = '_periodic'

    if check:
        plt.plot(xy[:, 0], xy[:, 1], 'b.')
        plt.title('Point set after decoration and cropping')
        plt.show()

    # Rescale so that median bond length is unity
    bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
    scale = 1. / np.median(bL)
    xy *= scale
    polygon *= scale
    LL = (LL[0] * scale, LL[1] * scale)
    if lp['NP_load'] != 0:
        PVx *= scale
        PVy *= scale
        PVxydict.update((key, val * scale) for key, val in PVxydict.items())

    if use_hexner:
        lattice_exten = 'kagome_isocent_' + shape + periodicBCstr + '_hexner_size' + sizestr + '_conf' + numberstr
    else:
        lattice_exten = 'kagome_isocent_' + shape + periodicBCstr + '_ulrich_homog_zindex' + zindex +\
                        '_conf' + number[1:]
    BBox = polygon
    LV = 'none'
    UC = 'none'
    LVUC = 'none'
    return xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten
Пример #6
0
def build_lattice(lattice):
    """Build the lattice based on the values stored in the lp dictionary attribute of supplied lattice instance.

    Returns
    -------
    lattice : lattice_class lattice instance
        The instance of the lattice class, with the following attributes populated:
        lattice.xy = xy
        lattice.NL = NL
        lattice.KL = KL
        lattice.BL = BL
        lattice.PVx = PVx
        lattice.PVy = PVy
        lattice.PVxydict = PVxydict
        lattice.PV = PV
        lattice.lp['BBox'] : #vertices x 2 float array
            BBox is the polygon used to crop the lattice or defining the extent of the lattice; could be hexagonal, for instance.
        lattice.lp['LL'] : tuple of 2 floats
            LL are the linear extent in each dimension of the lattice. For ex:
            ( np.max(xy[:,0])-np.min(xy[:,0]), np.max(xy[:,1])-np.min(xy[:,1]) )
        lattice.lp['LV'] = LV
        lattice.lp['UC'] = UC
        lattice.lp['lattice_exten'] : str
            A string specifier for the lattice built
        lattice.lp['slit_exten'] = slit_exten
    """
    # Define some shortcut variables
    lattice_type = lattice.lp['LatticeTop']
    shape = lattice.lp['shape']
    NH = lattice.lp['NH']
    NV = lattice.lp['NV']
    lp = lattice.lp
    networkdir = lattice.lp['rootdir'] + 'networks/'
    check = lattice.lp['check']
    if lattice_type == 'hexagonal':
        from build_hexagonal import build_hexagonal
        xy, NL, KL, BL, PVxydict, PVx, PVy, PV, LL, LVUC, LV, UC, BBox, lattice_exten = build_hexagonal(
            lp)
    elif lattice_type == 'hexmeanfield':
        from build_hexagonal import build_hexmeanfield
        xy, NL, KL, BL, PVxydict, PVx, PVy, PV, LL, LVUC, LV, UC, BBox, lattice_exten = build_hexmeanfield(
            lp)
    elif lattice_type == 'hexmeanfield3gyro':
        from build_hexagonal import build_hexmeanfield3gyro
        xy, NL, KL, BL, PVxydict, PVx, PVy, PV, LL, LVUC, LV, UC, BBox, lattice_exten = build_hexmeanfield3gyro(
            lp)
    elif 'selregion' in lattice_type:
        # amorphregion_isocent or amorphregion_kagome_isocent, for ex
        # Example usage: python ./build/make_lattice.py -LT selregion_randorg_gammakick1p60_cent -spreadt 0.8 -NP 225
        #  python ./build/make_lattice.py -LT selregion_iscentroid -N 30
        #  python ./build/make_lattice.py -LT selregion_hyperuniform -N 80
        from lepm.build.build_select_region import build_select_region
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_select_region(
            lp)
    elif lattice_type == 'frame1dhex':
        from build_hexagonal import build_frame1dhex
        # keep only the boundary of the lattice, eliminate the bulk
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_frame1dhex(
            lp)
    elif lattice_type == 'square':
        import lepm.build.build_square as bs
        print '\nCreating square lattice...'
        xy, NL, KL, BL, lattice_exten = bs.generate_square_lattice(
            shape, NH, NV, lp['eta'], lp['theta'])
        print 'lattice_exten = ', lattice_exten
        PVx = []
        PVy = []
        PVxydict = {}
        LL = (NH + 1, NV + 1)
        LVUC = 'none'
        UC = 'none'
        LV = 'none'
        BBox = np.array([[-LL[0] * 0.5, -LL[1] * 0.5],
                         [LL[0] * 0.5,
                          -LL[1] * 0.5], [LL[0] * 0.5, LL[1] * 0.5],
                         [-LL[0] * 0.5, LL[1] * 0.5]])
    elif lattice_type == 'triangular':
        import lepm.build.build_triangular as bt
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = bt.build_triangular_lattice(
            lp)
    elif lattice_type == 'linear':
        from lepm.build.build_linear_lattices import build_zigzag_lattice
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_zigzag_lattice(
            lp)
        lp['NV'] = 1
    elif lattice_type == 'deformed_kagome':
        from lepm.build.build_kagome import generate_deformed_kagome
        xy, NL, KL, BL, PVxydict, PVx, PVy, PV, LL, LVUC, LV, UC, BBox, lattice_exten = generate_deformed_kagome(
            lp)
    elif lattice_type == 'deformed_martini':
        from lepm.build.build_martini import build_deformed_martini
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_deformed_martini(
            lp)
    elif lattice_type == 'twisted_kagome':
        from lepm.build.build_kagome import build_twisted_kagome
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_twisted_kagome(
            lp)
    elif lattice_type == 'hyperuniform':
        from lepm.build.build_hyperuniform import build_hyperuniform
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_hyperuniform(
            lp)
    elif lattice_type == 'hyperuniform_annulus':
        from lepm.build.build_hyperuniform import build_hyperuniform_annulus
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_hyperuniform_annulus(
            lp)
        lp['shape'] = 'annulus'
    elif lattice_type == 'isostatic':
        from lepm.build.build_jammed import build_isostatic
        # Manually tune coordination of jammed packing (lets you tune through isostatic point)
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_isostatic(
            lp)
    elif lattice_type == 'jammed':
        from lepm.build.build_jammed import build_jammed
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_jammed(
            lp)
    elif lattice_type == 'triangularz':
        from lepm.build.build_triangular import build_triangularz
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_triangularz(
            lp)
    elif lattice_type == 'hucentroid':
        from lepm.build.build_hucentroid import build_hucentroid
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_hucentroid(
            lp)
    elif lattice_type == 'hucentroid_annulus':
        from lepm.build.build_hucentroid import build_hucentroid_annulus
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_hucentroid_annulus(
            lp)
        lp['shape'] = 'annulus'
    elif lattice_type == 'huvoronoi':
        from lepm.build.build_voronoized import build_huvoronoi
        xy, NL, KL, BL, PVx, PVy, PVxydict, LL, BBox, lattice_exten = build_huvoronoi(
            lp)
        LVUC = 'none'
        LV = 'none'
        UC = 'none'
    elif lattice_type == 'kagome_hucent':
        from lepm.build.build_hucentroid import build_kagome_hucent
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_kagome_hucent(
            lp)
    elif lattice_type == 'kagome_hucent_annulus':
        from lepm.build.build_hucentroid import build_kagome_hucent_annulus
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_kagome_hucent_annulus(
            lp)
        lp['shape'] = 'annulus'
    elif lattice_type == 'kagome_huvor':
        from lepm.build.build_voronoized import build_kagome_huvor
        print('Loading hyperuniform to build lattice...')
        xy, NL, KL, BL, PVx, PVy, PVxydict, LL, BBox, lattice_exten = build_kagome_huvor(
            lp)
        LV, LVUC, UC = 'none', 'none', 'none'
    elif lattice_type == 'iscentroid':
        from lepm.build.build_iscentroid import build_iscentroid
        print('Loading isostatic to build lattice...')
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten = build_iscentroid(
            lp)
    elif lattice_type == 'kagome_isocent':
        from lepm.build.build_iscentroid import build_kagome_isocent
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten = build_kagome_isocent(
            lp)
    elif lattice_type == 'overcoordinated1':
        from lepm.build.build_overcoordinated import generate_overcoordinated1_lattice
        xy, NL, KL, BL, SBL, LV, UC, LVUC, lattice_exten = generate_overcoordinated1_lattice(
            NH, NV)
        PVxydict = {}
        PVx = []
        PVy = []
        if lp['check']:
            le.display_lattice_2D(xy, BL)
    elif lattice_type == 'circlebonds':
        from lepm.build.build_linear_lattices import generate_circle_lattice
        xy, NL, KL, BL, LV, UC, LVUC, lattice_exten = generate_circle_lattice(
            NH)
        PVxydict = {}
        PVx = []
        PVy = []
        lp['NV'] = 1
        minx = np.min(xy[:, 0])
        maxx = np.max(xy[:, 0])
        miny = np.min(xy[:, 1])
        maxy = np.max(xy[:, 1])
        BBox = np.array([[minx, miny], [minx, maxy], [maxx, maxy],
                         [maxx, miny]])
        LL = (maxx - minx, maxy - miny)
    elif lattice_type == 'dislocatedRand':
        from lepm.build.build_dislocatedlattice import build_dislocated_lattice
        xy, NL, KL, BL, PVx, PVy, PVxydict, LL, BBox, lattice_exten = build_dislocated_lattice(
            lp)
    elif lattice_type == 'dislocated':
        if lp['dislocation_xy'] != 'none':
            dislocX = lp['dislocation_xy'].split('/')[0]
            dislocY = lp['dislocation_xy'].split('/')[1]
            dislocxy_exten = '_dislocxy_' + dislocX + '_' + dislocY
            pt = np.array([[float(dislocX), float(dislocY)]])
        else:
            pt = np.array([[0., 0.]])
            dislocxy_exten = ''
        if lp['Bvec'] == 'random':
            Bvecs = 'W'
        else:
            Bvecs = lp['Bvec']
        xy, NL, KL, BL, lattice_exten = generate_dislocated_hexagonal_lattice(
            shape, NH, NV, pt, Bvecs=Bvecs, check=lp['check'])
        lattice_exten += dislocxy_exten
        PVx = []
        PVy = []
        PVxydict = {}
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        BBox = np.array([[np.min(xy[:, 0]), np.min(xy[:, 1])],
                         [np.max(xy[:, 0]), np.min(xy[:, 1])],
                         [np.max(xy[:, 0]), np.max(xy[:, 1])],
                         [np.min(xy[:, 0]), np.max(xy[:, 1])]])
        LV = 'none'
        UC = 'none'
        LVUC = 'none'
    elif lattice_type == 'penroserhombTri':
        if lp['periodicBC']:
            from lepm.build.build_quasicrystal import generate_periodic_penrose_rhombic
            xy, NL, KL, BL, PVxydict, BBox, PV, lattice_exten = generate_periodic_penrose_rhombic(
                lp)
            LL = (PV[0, 0], PV[1, 1])
            PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
        else:
            from lepm.build.build_quasicrystal import generate_penrose_rhombic_lattice
            xy, NL, KL, BL, lattice_exten, Num_sub = generate_penrose_rhombic_lattice(
                shape, NH, NV, check=lp['check'])
            LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
                  np.max(xy[:, 1]) - np.min(xy[:, 1]))
            BBox = blf.auto_polygon(shape, NH, NV, eps=0.00)
            PVx = []
            PVy = []
            PVxydict = {}

        LVUC = 'none'
        LV = 'none'
        UC = 'none'
    elif lattice_type == 'penroserhombTricent':
        from lepm.build.build_quasicrystal import generate_penrose_rhombic_centroid_lattice
        xy, NL, KL, BL, PVxydict, PV, LL, BBox, lattice_exten = generate_penrose_rhombic_centroid_lattice(
            lp)
        # deepcopy PVxydict to generate new pointers
        PVxydict = copy.deepcopy(PVxydict)
        if lp['periodicBC']:
            PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
        else:
            PVx, PVy = [], []

        # Rescale so that median bond length is unity
        bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
        scale = 1. / np.median(bL)
        xy *= scale
        PV *= scale
        print 'PV = ', PV
        BBox *= scale
        LL = (LL[0] * scale, LL[1] * scale)

        print 'after updating other things: PVxydict = ', PVxydict
        if lp['periodicBC']:
            PVx *= scale
            PVy *= scale
            PVxydict.update(
                (key, val * scale) for key, val in PVxydict.items())
        else:
            PVx = []
            PVy = []

        LVUC = 'none'
        LV = 'none'
        UC = 'none'
    elif lattice_type == 'kagome_penroserhombTricent':
        from build.build_quasicrystal import generate_penrose_rhombic_centroid_lattice
        xy, NL, KL, BL, lattice_exten = generate_penrose_rhombic_centroid_lattice(
            shape, NH + 5, NV + 5, check=lp['check'])

        # Decorate lattice as kagome
        print('Decorating lattice as kagome...')
        xy, BL, PVxydict = blf.decorate_as_kagome(xy, BL)
        lattice_exten = 'kagome_' + lattice_exten

        xy, NL, KL, BL = blf.mask_with_polygon(shape,
                                               NH,
                                               NV,
                                               xy,
                                               BL,
                                               eps=0.00,
                                               check=False)

        # Rescale so that median bond length is unity
        bL = le.bond_length_list(xy, BL)
        xy *= 1. / np.median(bL)

        minx = np.min(xy[:, 0])
        miny = np.min(xy[:, 1])
        maxx = np.max(xy[:, 0])
        maxy = np.max(xy[:, 1])
        BBox = np.array([[minx, miny], [minx, maxy], [maxx, maxy],
                         [maxx, miny]])
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVx = []
        PVy = []
        PVxydict = {}
        LVUC = 'none'
        LV = 'none'
        UC = 'none'
    elif lattice_type == 'random':
        xx = np.random.uniform(low=-NH * 0.5 - 10,
                               high=NH * 0.5 + 10,
                               size=(NH + 20) * (NV + 20))
        yy = np.random.uniform(low=-NV * 0.5 - 10,
                               high=NV * 0.5 + 10,
                               size=(NH + 20) * (NV + 20))
        xy = np.dstack((xx, yy))[0]
        Dtri = Delaunay(xy)
        TRI = Dtri.vertices
        BL = le.Tri2BL(TRI)
        NL, KL = le.BL2NLandKL(BL, NN='min')

        # Crop to polygon (instead of trimming boundaries)
        # NL, KL, BL, TRI = le.delaunay_cut_unnatural_boundary(xy, NL, KL, BL, TRI, thres=lp['trimbound_thres'])
        shapedict = {shape: [NH, NV]}
        keep = blf.argcrop_lattice_to_polygon(shapedict, xy, check=check)
        xy, NL, KL, BL = le.remove_pts(keep, xy, BL, NN='min')

        lattice_exten = lattice_type + '_square_thres' + sf.float2pstr(
            lp['trimbound_thres'])
        polygon = blf.auto_polygon(shape, NH, NV, eps=0.00)
        BBox = polygon
        LL = (np.max(BBox[:, 0]) - np.min(BBox[:, 0]),
              np.max(BBox[:, 1]) - np.min(BBox[:, 1]))
        PVx = []
        PVy = []
        PVxydict = {}
        LVUC = 'none'
        LV = 'none'
        UC = 'none'
    elif lattice_type == 'randomcent':
        from lepm.build.build_random import build_randomcent
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_randomcent(
            lp)
    elif lattice_type == 'kagome_randomcent':
        from lepm.build.build_random import build_kagome_randomcent
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_kagome_randomcent(
            lp)
    elif lattice_type == 'randomspreadcent':
        from lepm.build.build_randomspread import build_randomspreadcent
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_randomspreadcent(
            lp)
    elif lattice_type == 'kagome_randomspread':
        from lepm.build.build_randomspread import build_kagome_randomspread
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_kagome_randomspread(
            lp)
    elif 'randorg_gammakick' in lattice_type and 'kaghi' not in lattice_type:
        # lattice_type is like 'randorg_gamma0p20_cent' and uses Hexner pointsets
        # NH is width, NV is height, NP_load is total number of points. This is different than other conventions.
        from build_randorg_gamma import build_randorg_gamma_spread
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_randorg_gamma_spread(
            lp)
    elif 'randorg_gamma' in lattice_type and 'kaghi' not in lattice_type:
        # lattice_type is like 'randorg_gamma0p20_cent' and uses Hexner pointsets
        from build_randorg_gamma import build_randorg_gamma_spread_hexner
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = \
            build_randorg_gamma_spread_hexner(lp)
    elif 'random_organization' in lattice_type:
        try:
            if isinstance(lp['relax_timesteps'], str):
                relax_tag = lp['relax_timesteps']
            else:
                relax_tag = '{0:02d}'.format(lp['relax_timesteps'])
        except:
            raise RuntimeError(
                'lattice parameters dictionary lp needs key relax_timesteps')

        points = np.loadtxt(
            networkdir +
            'random_organization_source/random_organization/random/' +
            'random_kick_' + relax_tag + 'relax/out_d' +
            '{0:02d}'.format(int(lp['conf'])) + '_xy.txt')
        points -= np.mean(points, axis=0)
        xytmp, trash1, trash2, trash3 = blf.mask_with_polygon(shape,
                                                              NH,
                                                              NV,
                                                              points, [],
                                                              eps=0.00)

        xy, NL, KL, BL = le.delaunay_centroid_lattice_from_pts(xytmp,
                                                               polygon='auto',
                                                               check=check)
        polygon = blf.auto_polygon(shape, NH, NV, eps=0.00)

        if check:
            le.display_lattice_2D(xy, BL)

        # Rescale so that median bond length is unity
        bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
        xy *= 1. / np.median(bL)
        polygon *= 1. / np.median(bL)

        lattice_exten = lattice_type + '_relax' + relax_tag + '_' + shape + '_d' + \
                        '{0:02d}'.format(int(lp['loadlattice_number']))
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict = {}
        PVx = []
        PVy = []
        BBox = polygon
    elif lattice_type == 'flattenedhexagonal':
        from lepm.build.build_hexagonal import generate_flattened_honeycomb_lattice
        xy, NL, KL, BL, LVUC, LV, UC, PVxydict, PVx, PVy, lattice_exten = \
            generate_flattened_honeycomb_lattice(shape, NH, NV, lp['aratio'], lp['delta'], lp['phi'], eta=0., rot=0.,
                                                 periodicBC=False, check=check)
    elif lattice_type == 'cairo':
        from lepm.build.build_cairo import build_cairo
        xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = build_cairo(
            lp)
    elif lattice_type == 'kagper_hucent':
        from lepm.build.build_hucentroid import build_kagper_hucent
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kagper_hucent(
            lp)
    elif lattice_type == 'hex_kagframe':
        from lepm.build.build_kagcentframe import build_hex_kagframe
        # Use lp['alph'] to determine the beginning of the kagomized frame, surrounding hexagonal lattice
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_hex_kagframe(
            lp)
    elif lattice_type == 'hex_kagcframe':
        from lepm.build.build_kagcentframe import build_hex_kagcframe
        # Use lp['alph'] to determine the beginning of the kagomized frame, surrounding hexagonal lattice
        # as circlular annulus
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_hex_kagcframe(
            lp)
    elif lattice_type in ['hucent_kagframe', 'hucent_kagcframe']:
        from lepm.build.build_kagcentframe import build_hucent_kagframe
        # Use lp['alph'] to determine the beginning of the kagomized frame, surrounding hucentroid decoration
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_hucent_kagframe(
            lp)
    elif lattice_type == 'kaghu_centframe':
        from lepm.build.build_kagcentframe import build_kaghu_centframe
        # Use lp['alph'] to determine the beginning of the centroid frame, surrounding kagomized decoration
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kaghu_centframe(
            lp)
    elif lattice_type in ['isocent_kagframe', 'isocent_kagcframe']:
        from lepm.build.build_kagcentframe import build_isocent_kagframe
        # Use lp['alph'] to determine the beginning of the kagomized frame, surrounding hucentroid decoration
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_isocent_kagframe(
            lp)
    elif lattice_type == 'kagsplit_hex':
        from lepm.build.build_kagome import build_kagsplit_hex
        # Use lp['alph'] to determine what fraction (on the right) is kagomized
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kagsplit_hex(
            lp)
    elif lattice_type == 'kagper_hex':
        from lepm.build.build_kagome import build_kagper_hex
        # Use lp['alph'] to determine what fraction of the radius/width (in the center) is kagomized
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kagper_hex(
            lp)
    elif lattice_type == 'hex_kagperframe':
        from lepm.build.build_kagcentframe import build_hex_kagperframe
        # Use lp['alph'] to determine what fraction of the radius/width (in the center) is partially kagomized
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_hex_kagperframe(
            lp)
    elif lattice_type == 'kagome':
        from lepm.build.build_kagome import build_kagome
        # lets you make a square kagome
        xy, NL, KL, BL, PVx, PVy, PVxydict, PV, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kagome(
            lp)
    elif 'uofc' in lattice_type:
        from lepm.build.build_kagcent_words import build_uofc
        # ['uofc_hucent', 'uofc_kaglow_hucent', 'uofc_kaghi_hucent', 'uofc_kaglow_isocent']:
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_uofc(
            lp)
    elif 'chicago' in lattice_type:
        from lepm.build.build_kagcent_words import build_chicago
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_chicago(
            lp)
    elif 'chern' in lattice_type:
        from lepm.build.build_kagcent_words import build_kagcentchern
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kagcentchern(
            lp)
    elif 'csmf' in lattice_type:
        from lepm.build.build_kagcent_words import build_kagcentcsmf
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kagcentcsmf(
            lp)
    elif 'thanks' in lattice_type:
        # example:
        # python ./build/make_lattice.py -LT kaghi_isocent_thanks -skip_gyroDOS -NH 300 -NV 70 -thres 5.5 -skip_polygons
        from lepm.build.build_kagcent_words import build_kagcentthanks
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kagcentthanks(
            lp)
    elif 'curvys' in lattice_type:
        # for lattice_type in ['kaghi_isocent_curvys', 'kaglow_isocent_curvys',
        #                      'kaghi_hucent_curvys', 'kaglow_hucent_curvys', kaghi_randorg_gammakick1p60_cent_curvys',
        #                      'kaghi_randorg_gammakick0p50_cent_curvys', ... ]
        # example usage:
        # python ./build/make_lattice.py -LT kaghi_isocent_curvys -NH 100 -NV 70 -thres 5.5 -skip_polygons -skip_gyroDOS
        from lepm.build.build_kagcent_words import build_kagcentcurvys
        xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kagcentcurvys(
            lp)
    elif 'hexannulus' in lattice_type:
        from lepm.build.build_conformal import build_hexannulus
        xy, NL, KL, BL, lattice_exten, lp = build_hexannulus(lp)
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict = {}
        PVx = []
        PVy = []
        UC = np.array([0, 0])
        LV = 'none'
        LVUC = 'none'
        minx = np.min(xy[:, 0])
        miny = np.min(xy[:, 1])
        maxx = np.max(xy[:, 0])
        maxy = np.max(xy[:, 1])
        BBox = np.array([[minx, miny], [minx, maxy], [maxx, maxy],
                         [maxx, miny]])
    elif 'accordion' in lattice_type:
        # accordionhex accordiony accordionkagy
        # Example usage:
        # python ./build/make_lattice.py -LT accordionkag -alph 0.9 -intparam 2 -N 6 -skip_polygons -skip_gyroDOS
        # nzag controlled by lp['intparam'], and the rotation of the kagome element is controlled by lp['alph']
        if lattice_type == 'accordionhex':
            from lepm.build.build_hexagonal import build_accordionhex
            xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp, xyvx = build_accordionhex(
                lp)
        elif lattice_type == 'accordionkag':
            from lepm.build.build_kagome import build_accordionkag
            xy, NL, KL, BL, PVx, PVy, PVxydict, PV, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_accordionkag(
                lp)
        elif lattice_type == 'accordionkag_hucent':
            from lepm.build.build_hucentroid import build_accordionkag_hucent
            xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = \
                build_accordionkag_hucent(lp)
        elif lattice_type == 'accordionkag_isocent':
            from lepm.build.build_iscentroid import build_accordionkag_isocent
            xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten = \
                build_accordionkag_isocent(lp)
    elif 'spindle' in lattice_type:
        if lattice_type == 'spindle':
            from lepm.build.build_spindle import build_spindle
            xy, NL, KL, BL, PVxydict, PVx, PVy, PV, LL, LVUC, LV, UC, BBox, lattice_exten = build_spindle(
                lp)
    elif lattice_type == 'stackedrhombic':
        from lepm.build.build_rhombic import build_stacked_rhombic
        xy, NL, KL, BL, PVxydict, PVx, PVy, PV, LL, LVUC, LV, UC, BBox, lattice_exten = build_stacked_rhombic(
            lp)
    elif 'junction' in lattice_type:
        # accordionhex accordiony accordionkagy
        if lattice_type == 'hexjunction':
            from lepm.build.build_hexagonal import build_hexjunction
            xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp, xyvx = build_hexjunction(
                lp)
        elif lattice_type == 'kagjunction':
            from lepm.build.build_kagome import build_kagjunction
            xy, NL, KL, BL, PVx, PVy, PVxydict, LVUC, BBox, LL, LV, UC, lattice_exten, lp = build_kagjunction(
                lp)

    ###########

    # For reference: this is how to change z
    # le.cut_bonds_z(BL,lp['target_z'])
    # ##cut N bonds for z
    # N2cut = int(round((z_start-target_z)*len(BL)/z_start))
    # allrows = range(len(BL))
    # inds = random.sample(allrows, N2cut)
    # keep = np.setdiff1d(allrows,inds)
    # bnd_z = BL[keep]

    # Cut slit
    if lp['make_slit']:
        print('Cuting notch or slit...')
        L = max(xy[:, 0]) - min(xy[:, 0])
        cutL = L * lp['cutLfrac']
        x0 = -L * 0. + cutL * 0.5 - 1.  # 0.25*L+0.5
        BL, xy = blf.cut_slit(BL, xy, cutL + 1e-3, x0, y0=0.2)
        slit_exten = '_cutL' + str(cutL / L) + 'L_x0_' + str(x0)

        print('Rebuilding NL,KL...')
        NP = len(xy)
        if latticetop == 'deformed_kagome':
            nn = 4
        elif lattice_type == 'linear':
            if NP == 1:
                nn = 0
            else:
                nn = 2
        else:
            nn = 'min'

        NL, KL = le.BL2NLandKL(BL, NP=NP, NN=nn)

        # remake BL too
        BL = le.NL2BL(NL, KL)
    else:
        slit_exten = ''
        NP = len(xy)

    if lp['check']:
        print 'make_lattice: Showing lattice before saving...'
        # print 'PVx = ', PVx
        # print 'PVy = ', PVy
        le.display_lattice_2D(xy, BL, PVxydict=PVxydict)
    ################

    lattice.xy = xy
    lattice.NL = NL
    lattice.KL = KL
    lattice.BL = BL
    lattice.PVx = PVx
    lattice.PVy = PVy
    lattice.PVxydict = PVxydict
    lattice.LVUC = LVUC
    lattice.lp = lp
    lattice.lp['BBox'] = BBox
    lattice.lp['LL'] = LL
    lattice.lp['LV'] = LV
    lattice.lp['UC'] = UC
    lattice.lp['lattice_exten'] = lattice_exten
    lattice.lp['slit_exten'] = slit_exten
    lattice.lp['Nparticles'] = NP
    return lattice
Пример #7
0
def build_huvoronoi(lp):
    if lp['NP_load'] == 0:
        points = np.loadtxt(
            lp['rootdir'] +
            'networks/hyperuniform_source/hyperuniform_N400/out_d' +
            str(int(lp['conf'])) + '_xy.txt')
        points -= np.mean(points, axis=0) + lp['origin']
        keep = np.logical_and(
            abs(points[:, 0]) < (8 + lp['NH'] * 0.5),
            abs(points[:, 1]) < (8 + lp['NV'] * 0.5))
        xytmp = points[keep]
        if lp['check']:
            plt.plot(points[:, 0], points[:, 1], 'b.')
            plt.title('Point set before initial cutting')
            plt.show()
        polygon = blf.auto_polygon(lp['shape'], lp['NH'], lp['NV'], eps=0.00)

        xy, NL, KL, BL = le.voronoi_lattice_from_pts(xytmp,
                                                     polygon=polygon,
                                                     NN=3,
                                                     kill_outliers=True,
                                                     check=lp['check'])
        if lp['check']:
            le.display_lattice_2D(
                xy,
                BL,
                NL=NL,
                KL=KL,
                title='Cropped centroid lattice, before dilation')

        # Form output bounding box and extent measurement
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict = {}
        PVx = []
        PVy = []
        BBox = polygon

        # make string from origin values
        print 'lp[origin] = ', lp['origin']
        print 'type(lp[origin]) = ', type(lp['origin'])
        if (np.abs(lp['origin']) < 1e-7).all():
            originstr = ''
        else:
            originstr = '_originX' + '{0:0.2f}'.format(lp['origin'][0]).replace('.', 'p') + \
                        'Y' + '{0:0.2f}'.format(lp['origin'][1]).replace('.', 'p')
        periodicstr = ''
    else:
        lp['periodicBC'] = True
        sizestr = '{0:03d}'.format(lp['NP_load'])
        print 'sizestr = ', sizestr
        points = np.loadtxt(lp['rootdir'] +
                            'networks/hyperuniform_source/hyperuniform_N' +
                            sizestr + '/out_d' + str(int(lp['conf'])) +
                            '_xy.txt')
        print 'points = ', points
        points -= np.mean(points, axis=0)
        # Ensuring that origin param is centered (since using entire lattice)
        lp['origin'] = np.array([0.0, 0.0])
        LL = (lp['NP_load'], lp['NP_load'])
        polygon = 0.5 * np.array([[-LL[0], -LL[1]], [LL[0], -LL[1]],
                                  [LL[0], LL[1]], [-LL[0], LL[1]]])
        BBox = polygon
        xy, NL, KL, BL, PVxydict = le.voronoi_rect_periodic_from_pts(
            points, LL, BBox='auto', check=lp['check'])
        PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
        originstr = ''
        periodicstr = '_periodic'

    # Rescale so that median bond length is unity
    bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
    scale = 1. / np.median(bL)
    xy *= scale
    polygon *= scale
    BBox *= scale
    LL = (LL[0] * scale, LL[1] * scale)
    if lp['NP_load'] != 0:
        PVx *= scale
        PVy *= scale
        PVxydict.update((key, val * scale) for key, val in PVxydict.items())

    lattice_exten = 'huvoronoi_' + lp[
        'shape'] + periodicstr + '_d' + '{0:02d}'.format(int(
            lp['conf'])) + originstr
    return xy, NL, KL, BL, PVx, PVy, PVxydict, LL, BBox, lattice_exten
Пример #8
0
def build_kagome_randomcent(lp):
    """Build uniformly random point set, and construct voronoized network from that.

    lp : dict
        lattice parameters dictionary
    """
    NH = lp['NH']
    NV = lp['NV']
    LL = (NH, NV)
    if lp['periodicBC']:
        xx = np.random.uniform(low=-NH * 0.5, high=NH * 0.5, size=NH * NV)
        yy = np.random.uniform(low=-NV * 0.5, high=NV * 0.5, size=NH * NV)
        xy = np.dstack((xx, yy))[0]
        xy, NL, KL, BL, PVxydict = \
            kagomecentroid_periodic_network_from_pts(xy, LL, BBox='auto', check=lp['check'])
        PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)

        # check that all points are inside BBox
        shapedict = {lp['shape']: [NH, NV]}
        keep = argcrop_lattice_to_polygon(shapedict, xy, check=lp['check'])
        if len(np.where(keep)[0]) != len(xy):
            raise RuntimeError('Some points were spuriously outside the allowed BBox.')
        polygon = auto_polygon(lp['shape'], NH, NV, eps=0.00)
        perstr = '_periodic'
    else:
        xx = np.random.uniform(low=-NH * 0.5 - 10, high=NH * 0.5 + 10, size=(NH + 20) * (NV + 20))
        yy = np.random.uniform(low=-NV * 0.5 - 10, high=NV * 0.5 + 10, size=(NH + 20) * (NV + 20))
        xy = np.dstack((xx, yy))[0]

        xy, NL, KL, BL = kagomecentroid_lattice_from_pts(xy, polygon=None, trimbound=False, check=lp['check'])

        # Crop to polygon
        shapedict = {lp['shape']: [NH, NV]}
        keep = argcrop_lattice_to_polygon(shapedict, xy, check=lp['check'])
        xy, NL, KL, BL = le.remove_pts(keep, xy, BL, NN='min')
        polygon = auto_polygon(lp['shape'], NH, NV, eps=0.00)
        PVxydict = {}
        PVx = []
        PVy = []
        perstr = ''

    # If the meshfn going to overwrite a previous realization?
    mfok = le.meshfn_is_used(le.build_meshfn(lp)[0])
    print 'mfok = ', mfok
    while mfok:
        lp['conf'] += 1
        mfok = le.meshfn_is_used(le.build_meshfn(lp)[0])

    lattice_exten = lp['LatticeTop'] + '_' + lp['shape'] + perstr + '_r' + '{0:02d}'.format(int(lp['conf']))

    # Rescale so that median bond length is unity
    bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
    scale = 1. / np.median(bL)
    xy *= scale
    polygon *= scale
    LL = (LL[0] * scale, LL[1] * scale)
    if lp['periodicBC']:
        PVx *= scale
        PVy *= scale
        PVxydict.update((key, val * scale) for key, val in PVxydict.items())
    LVUC = 'none'
    LV = 'none'
    UC = 'none'
    BBox = polygon
    PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)

    return xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten
Пример #9
0
def build_kagome_huvor(lp):
    """Construct a kagomized network from hyperuniform point set and voronoize it with Wigner-Seitz

    Parameters
    ----------
    lp : dict
        Lattice parameters dictionary, with keys:
        rootdir, conf, origin, shape, NH, NV, check, NP_load (if periodic)
    """
    if lp['NP_load'] == 0:
        points = np.loadtxt(
            dio.prepdir(lp['rootdir']) +
            'networks/hyperuniform_source/hyperuniform_N400/out_d' +
            str(int(lp['conf'])) + '_xy.txt')
        points -= np.mean(points, axis=0) + lp['origin']
        addpc = .05
        xytmp, trash1, trash2, trash3 = \
            blf.mask_with_polygon(lp['shape'], lp['NH'] + 7, lp['NV'] + 7, points, [], eps=addpc)
        polygon = blf.auto_polygon(lp['shape'], lp['NH'], lp['NV'], eps=0.00)

        xy, NL, KL, BL = blf.kagomevoronoi_network_from_pts(xytmp,
                                                            polygon=polygon,
                                                            kill_outliers=True,
                                                            check=lp['check'])

        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict, PVx, PVy = {}, [], []
        BBox = polygon
        if lp['check']:
            le.display_lattice_2D(
                xy,
                BL,
                NL=NL,
                KL=KL,
                title='Cropped centroid lattice, before dilation')

        # make string from origin values
        print 'lp[origin] = ', lp['origin']
        print 'type(lp[origin]) = ', type(lp['origin'])
        if (np.abs(lp['origin']) < 1e-7).all():
            originstr = ''
        else:
            originstr = '_originX' + '{0:0.2f}'.format(lp['origin'][0]).replace('.', 'p') + \
                        'Y' + '{0:0.2f}'.format(lp['origin'][1]).replace('.', 'p')
        periodicBCstr = ''
    else:
        # Ensuring that origin param is centered (since using entire lattice)
        lp['origin'] = np.array([0.0, 0.0])
        LL = (lp['NP_load'], lp['NP_load'])
        polygon = 0.5 * np.array([[-LL[0], -LL[1]], [LL[0], -LL[1]],
                                  [LL[0], LL[1]], [-LL[0], LL[1]]])
        BBox = polygon

        lp['periodicBC'] = True
        sizestr = '{0:03d}'.format(lp['NP_load'])
        points = np.loadtxt(
            dio.prepdir(lp['rootdir']) +
            'networks/hyperuniform_source/hyperuniform_N' + sizestr +
            '/out_d' + str(int(lp['conf'])) + '_xy.txt')
        points -= np.mean(points, axis=0)
        xy, NL, KL, BL, PVxydict = blf.kagomevoronoi_periodic_network_from_pts(
            points, LL, BBox=BBox, check=lp['check'])
        PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
        originstr = ''
        periodicBCstr = '_periodic'

    # Rescale so that median bond length is unity
    bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
    scale = 1. / np.median(bL)
    xy *= scale
    polygon *= scale
    BBox *= scale
    LL = (LL[0] * scale, LL[1] * scale)
    if lp['periodicBC']:
        PVx *= scale
        PVy *= scale
        PVxydict.update((key, val * scale) for key, val in PVxydict.items())

    lattice_exten = 'kagome_huvor_' + lp[
        'shape'] + periodicBCstr + '_d{0:02d}'.format(int(
            lp['conf'])) + originstr
    return xy, NL, KL, BL, PVx, PVy, PVxydict, LL, BBox, lattice_exten
Пример #10
0
def stills2mov_util(todo,
                    xyfiles,
                    KLfiles,
                    params,
                    h,
                    numbering,
                    index_sz,
                    framedir_name,
                    name,
                    update_KL_each_timestep,
                    exaggerate,
                    xlimv,
                    ylimv,
                    climv,
                    framerate=10,
                    mov_exten=''):
    """Make a sequence of images and save it as a movie. This funciton is a utility function called by data2stills_2D()

    Parameters
    ----------
    todo : int array or list
        The indices of the stills to plot and save in a movie
    xyfiles : list of strings
        paths of xy data to load
    KLfiles : list of strings
        paths of connectivity files to load, if connectivity changes during sequence
    params : dict
        parameters for the simulation
    h : float
        timestep
    numbering : string specifier ('natural' or other)
        Whether to place the index of the frame as the index of the output timestep or of the frame index
    index_sz : int
        How many digits in the index (with leading zeros)
    framedir_name : str
        path for the frames
    name : str
        non-index part of the frame names
    update_KL_each_timestep : bool
        Whether connectivity is changing during simulation
    exaggerate : float
        Exaggeration of the displacement
    xlimv : tuple of floats
        limits for x axis
    ylimv : tuple of floats
        limits for y axis
    climv : tuple of floats
        limits for color axis
    mov_exten : str (optional, default is '')
        an extension to the movie name describing the movie
    """
    # Go through data and save as stills
    for i in todo:
        if np.mod(i, 50) == 0:
            print 'Saving still:' + str(i) + '/' + str(len(todo))

        xy = np.loadtxt(xyfiles[i], delimiter=',', usecols=(0, 1))

        iterind = (xyfiles[i].split('_')[-1]).split('.')[0]

        if numbering == 'natural':
            index = ('{0:0' + index_sz + 'd}').format(i)
        else:
            index = iterind

        outname = datadir + framedir_name + '/' + name + index + '.png'

        # Recalculate bo for each timestep if KL is evolving
        if update_KL_each_timestep:
            KL = np.loadtxt(KLfiles[i], delimiter=',')

            BL = le.NL2BL(NL, KL)

            # Calc rest bond lengths
            # --> have to do this if bonds are cut so that BL and bo are same size
            # --> can't do if statement if rough is False
            # if np.count_nonzero(KL)!=nzcount: #can only do this is rough is true (or if in order)
            bo = le.bond_length_list(xy0, BL)

        if 'prestrain' in params:
            prestrain = params['prestrain']
        else:
            prestrain = 0.

        if 'shrinkrate' in params:
            shrinkrate = params['shrinkrate']
            title = 't = ' + '%09.4f' % (float(iterind) * h) + '  a = ' + \
                    '%07.5f' % (1. - shrinkrate * float(iterind) * h - prestrain)
        elif 'prestrain' in params:
            shrinkrate = 0.0
            title = 't = ' + '%09.4f' % (
                float(iterind) * h) + '  a = ' + '%07.5f' % (1. - prestrain)
        else:
            shrinkrate = 0.0
            title = 't = ' + '%09.4f' % (float(iterind) * h)

        print 'Calculating bond strain... '
        # calculate strain
        bs = le.bond_strain_list(
            xy, BL, bo * (1. - shrinkrate * (float(iterind) * h) - prestrain))
        # if bond lengths are all unity, then simple:
        # bs = bond_strain_list(xy,BL, np.ones_like(BL[:,0]))

        if exaggerate == 1.0:
            movie_plot_2D(xy,
                          BL,
                          bs,
                          outname,
                          title,
                          xlimv=xlimv,
                          ylimv=ylimv,
                          climv=climv)
        else:
            print 'making frame in movie plot'
            xye = xy0 + (xy - xy0) * exaggerate
            movie_plot_2D(xye,
                          BL,
                          bs,
                          outname,
                          title,
                          xlimv=xlimv,
                          ylimv=ylimv,
                          climv=climv)

    # MAKE MOVIE
    hostdir = datadir + 'stills/'
    fname, index_sz = dio.get_fname_and_index_size(hostdir)
    print 'index_sz = ', index_sz
    print 'hostdir = ', hostdir
    fps = 15
    imgname = hostdir + fname
    paths = datadir.split('/')
    datedir = ''
    for ii in range(len(paths) - 2):
        pn = paths[ii]
        datedir += pn + '/'
    movname = datedir + datadir.split('/')[-2]

    subprocess.call([
        './ffmpeg', '-framerate',
        str(framerate), '-i', imgname + '%' + str(index_sz) + 'd.png',
        movname + mov_exten + '.mov', '-vcodec', 'libx264', '-profile:v',
        'main', '-crf', '12', '-threads', '0', '-r', '30', '-pix_fmt',
        'yuv420p'
    ])
Пример #11
0
def build_accordionkag_hucent(lp):
    """Create an accordion-bonded kagomized amorphous network from a loaded hyperuniform point set.

    Parameters
    ----------
    lp

    Returns
    -------

    """
    print('Loading hyperuniform to build lattice...')
    networkdir = lp['rootdir'] + 'networks/'
    shape = lp['shape']
    NH = lp['NH']
    NV = lp['NV']
    check = lp['check']
    if lp['NP_load'] == 0:
        points = np.loadtxt(networkdir +
                            'hyperuniform_source/hyperuniform_N400/out_d' +
                            str(int(lp['conf'])) + '_xy.txt')
        points -= np.mean(points, axis=0) + lp['origin']
        addpc = .05
        xytmp, trash1, trash2, trash3 = blf.mask_with_polygon(shape,
                                                              NH + 4,
                                                              NV + 4,
                                                              points, [],
                                                              eps=addpc)
        polygon = blf.auto_polygon(shape, NH, NV, eps=0.00)

        xy, NL, KL, BL = le.delaunay_centroid_lattice_from_pts(
            xytmp, polygon=polygon, trimbound=False)  # check=check)
        #################################################################
        # nzag controlled by lp['intparam'] below
        xyacc, BLacc, LVUC, UC, xyvertices, lattice_exten_add = \
            blf.accordionize_network(xy, BL, lp, PVxydict=None, PVx=None, PVy=None, PV=None)

        print 'BL = ', BL

        # need indices of xy that correspond to xyvertices
        # note that xyvertices gives the positions of the vertices, not their indices
        inRx = np.in1d(xyacc[:, 0], xyvertices[:, 0])
        inRy = np.in1d(xyacc[:, 1], xyvertices[:, 1])
        vxind = np.where(np.logical_and(inRx, inRy))[0]
        print 'vxind = ', vxind

        # Note: beware, do not provide NL and KL to decorate_bondneighbors_elements() since NL,KL need
        # to be recalculated
        xy, BL = blf.decorate_bondneighbors_elements(xyacc,
                                                     BLacc,
                                                     vxind,
                                                     PVxydict=None,
                                                     viewmethod=False,
                                                     check=lp['check'])
        NL, KL = le.BL2NLandKL(BL, NP=len(xy))

        #################################################################
        polygon = blf.auto_polygon(shape, NH, NV, eps=0.00)

        if check:
            le.display_lattice_2D(
                xy,
                BL,
                NL=NL,
                KL=KL,
                title='Cropped centroid lattice, before dilation')

        # Form output bounding box and extent measurement
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict = {}
        PVx = []
        PVy = []
        BBox = polygon

        # make string from origin values
        print 'lp[origin] = ', lp['origin']
        print 'type(lp[origin]) = ', type(lp['origin'])
        if (np.abs(lp['origin']) < 1e-7).all():
            originstr = ''
        else:
            originstr = '_originX' + '{0:0.2f}'.format(lp['origin'][0]).replace('.', 'p') + \
                        'Y' + '{0:0.2f}'.format(lp['origin'][1]).replace('.', 'p')
        periodicBCstr = ''
    else:
        # Ensuring that origin param is centered (since using entire lattice)
        lp['origin'] = np.array([0.0, 0.0])
        LL = (lp['NP_load'], lp['NP_load'])
        polygon = 0.5 * np.array([[-LL[0], -LL[1]], [LL[0], -LL[1]],
                                  [LL[0], LL[1]], [-LL[0], LL[1]]])
        BBox = polygon

        lp['periodicBC'] = True
        sizestr = '{0:03d}'.format(lp['NP_load'])
        points = np.loadtxt(networkdir + 'hyperuniform_source/hyperuniform_N' + sizestr + '/out_d' + \
                            str(int(lp['conf'])) + '_xy.txt')
        points -= np.mean(points, axis=0)
        xy, NL, KL, BL, PVxydict = blf.kagomecentroid_periodic_network_from_pts(
            points, LL, BBox=BBox, check=lp['check'])
        PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
        originstr = ''
        periodicBCstr = '_periodic'

    # Rescale so that median bond length is unity
    bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
    scale = 1. / np.median(bL)
    xy *= scale
    polygon *= scale
    BBox *= scale
    LL = (LL[0] * scale, LL[1] * scale)
    if lp['periodicBC']:
        PVx *= scale
        PVy *= scale
        PVxydict.update((key, val * scale) for key, val in PVxydict.items())

    lattice_exten = 'accordionkag_hucent_' + shape + periodicBCstr + '_d{0:02d}'.format(int(lp['conf'])) + originstr + \
                    lattice_exten_add
    LV = 'none'
    LVUC = 'none'
    UC = 'none'
    return xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten
Пример #12
0
def build_kagome_hucent(lp):
    print('Loading hyperuniform to build lattice...')
    networkdir = lp['rootdir'] + 'networks/'
    shape = lp['shape']
    NH = lp['NH']
    NV = lp['NV']
    check = lp['check']
    if lp['NP_load'] == 0:
        points = np.loadtxt(networkdir +
                            'hyperuniform_source/hyperuniform_N400/out_d' +
                            str(int(lp['conf'])) + '_xy.txt')
        points -= np.mean(points, axis=0) + lp['origin']
        addpc = .05
        xytmp, trash1, trash2, trash3 = blf.mask_with_polygon(shape,
                                                              NH + 4,
                                                              NV + 4,
                                                              points, [],
                                                              eps=addpc)
        polygon = blf.auto_polygon(shape, NH, NV, eps=0.00)

        xy, NL, KL, BL = blf.kagomecentroid_lattice_from_pts(xytmp,
                                                             polygon=polygon,
                                                             trimbound=False,
                                                             check=check)

        polygon = blf.auto_polygon(shape, NH, NV, eps=0.00)

        if check:
            le.display_lattice_2D(
                xy,
                BL,
                NL=NL,
                KL=KL,
                title='Cropped centroid lattice, before dilation')

        # Form output bounding box and extent measurement
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict = {}
        PVx = []
        PVy = []
        BBox = polygon

        # make string from origin values
        print 'lp[origin] = ', lp['origin']
        print 'type(lp[origin]) = ', type(lp['origin'])
        if (np.abs(lp['origin']) < 1e-7).all():
            originstr = ''
        else:
            originstr = '_originX' + '{0:0.2f}'.format(lp['origin'][0]).replace('.', 'p') + \
                        'Y' + '{0:0.2f}'.format(lp['origin'][1]).replace('.', 'p')
        periodicBCstr = ''
    else:
        # Ensuring that origin param is centered (since using entire lattice)
        lp['origin'] = np.array([0.0, 0.0])
        LL = (lp['NP_load'], lp['NP_load'])
        polygon = 0.5 * np.array([[-LL[0], -LL[1]], [LL[0], -LL[1]],
                                  [LL[0], LL[1]], [-LL[0], LL[1]]])
        BBox = polygon

        lp['periodicBC'] = True
        sizestr = '{0:03d}'.format(lp['NP_load'])
        points = np.loadtxt(networkdir + 'hyperuniform_source/hyperuniform_N' + sizestr + '/out_d' + \
                            str(int(lp['conf'])) + '_xy.txt')
        points -= np.mean(points, axis=0)
        xy, NL, KL, BL, PVxydict = blf.kagomecentroid_periodic_network_from_pts(
            points, LL, BBox=BBox, check=lp['check'])
        PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
        originstr = ''
        periodicBCstr = '_periodic'

    # Rescale so that median bond length is unity
    bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
    scale = 1. / np.median(bL)
    xy *= scale
    polygon *= scale
    BBox *= scale
    LL = (LL[0] * scale, LL[1] * scale)
    if lp['periodicBC']:
        PVx *= scale
        PVy *= scale
        PVxydict.update((key, val * scale) for key, val in PVxydict.items())

    lattice_exten = 'kagome_hucent_' + shape + periodicBCstr + '_d{0:02d}'.format(
        int(lp['conf'])) + originstr
    LV = 'none'
    LVUC = 'none'
    UC = 'none'
    return xy, NL, KL, BL, PVxydict, PVx, PVy, LL, LVUC, LV, UC, BBox, lattice_exten
Пример #13
0
def build_hucentroid(lp):
    """Load the proper hyperuniform point set, given the parameters in dict lp

    Parameters
    ----------
    lp : dict
        lattice parameters dictionary

    Returns
    -------
    xy, NL, KL, BL, PVxydict, PVx, PVy, LVUC, BBox, LL, LV, UC, lattice_exten
    """
    check = lp['check']
    networkdir = lp['rootdir'] + 'networks/'
    print('Loading hyperuniform to build lattice...')
    if lp['NP_load'] == 0:
        points = np.loadtxt(networkdir +
                            'hyperuniform_source/hyperuniform_N400/out_d' +
                            str(int(lp['conf'])) + '_xy.txt')
        points -= np.mean(points, axis=0) + lp['origin']
        addpc = .05
        # Note: below we crop a large region so that if the network has shape==circle, we dont cut off the sides
        if lp['shape'] == 'circle':
            keep = np.logical_and(
                abs(points[:, 0]) < (10 + lp['NH'] * (1 + addpc)),
                abs(points[:, 1]) < (10 + lp['NV'] * (1 + addpc)))
        else:
            # it will speed things up to crop more, so do so if the shape is not a circle
            keep = np.logical_and(
                abs(points[:, 0]) < (5 + lp['NH'] * (1 + addpc) * 0.5),
                abs(points[:, 1]) < (5 + lp['NV'] * (1 + addpc)) * 0.5)
        xytmp = points[keep]
        if check:
            plt.plot(points[:, 0], points[:, 1], 'b.')
            plt.title('Point set before initial cutting')
            plt.show()
        polygon = blf.auto_polygon(lp['shape'], lp['NH'], lp['NV'], eps=0.00)
        xy, NL, KL, BL = le.delaunay_centroid_lattice_from_pts(xytmp,
                                                               polygon=polygon,
                                                               trimbound=False,
                                                               check=check)
        if check:
            le.display_lattice_2D(
                xy,
                BL,
                NL=NL,
                KL=KL,
                title='Cropped centroid lattice, before dilation')

        # Form output bounding box and extent measurement
        LL = (np.max(xy[:, 0]) - np.min(xy[:, 0]),
              np.max(xy[:, 1]) - np.min(xy[:, 1]))
        PVxydict = {}
        PVx = []
        PVy = []
        BBox = polygon

        # make string from origin values
        print 'lp[origin] = ', lp['origin']
        print 'type(lp[origin]) = ', type(lp['origin'])
        if (np.abs(lp['origin']) < 1e-7).all():
            originstr = ''
        else:
            originstr = '_originX' + '{0:0.2f}'.format(lp['origin'][0]).replace('.', 'p') + \
                        'Y' + '{0:0.2f}'.format(lp['origin'][1]).replace('.', 'p')
        periodicstr = ''
        stripstr = ''
    else:
        if lp['periodic_strip']:
            lp['periodicBC'] = True
            sizestr = '{0:03d}'.format(lp['NP_load'])
            print 'sizestr = ', sizestr
            points = np.loadtxt(networkdir +
                                'hyperuniform_source/hyperuniform_N' +
                                sizestr + '/out_d' + str(int(lp['conf'])) +
                                '_xy.txt')
            print 'points = ', points
            points -= 0.5 * np.array([lp['NH'], lp['NV']])
            # Ensuring that origin param is centered (since using entire lattice)
            lp['origin'] = np.array([0.0, 0.0])
            if lp['NH'] != lp['NP_load']:
                raise RuntimeError(
                    'NP_load should be equal to NH for a periodicstrip geometry!'
                )
            LL = (lp['NH'], lp['NV'])
            polygon = 0.5 * np.array([[-LL[0], -LL[1]], [LL[0], -LL[1]],
                                      [LL[0], LL[1]], [-LL[0], LL[1]]])
            BBox = polygon
            keep = dh.inds_in_polygon(points, polygon)
            points = points[keep]
            xy, NL, KL, BL, PVxydict = le.delaunay_centroid_periodicstrip_from_pts(
                points, LL, BBox='auto', check=check)
            PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
            originstr = ''
            periodicstr = '_periodicstrip'
            stripstr = '_NH{0:06d}'.format(lp['NH']) + '_NV{0:06d}'.format(
                lp['NV'])
        else:
            lp['periodicBC'] = True
            sizestr = '{0:03d}'.format(lp['NP_load'])
            print 'sizestr = ', sizestr
            points = np.loadtxt(networkdir +
                                'hyperuniform_source/hyperuniform_N' +
                                sizestr + '/out_d' + str(int(lp['conf'])) +
                                '_xy.txt')
            print 'points = ', points
            points -= np.mean(points, axis=0)
            # Ensuring that origin param is centered (since using entire lattice)
            lp['origin'] = np.array([0.0, 0.0])
            LL = (lp['NP_load'], lp['NP_load'])
            polygon = 0.5 * np.array([[-LL[0], -LL[1]], [LL[0], -LL[1]],
                                      [LL[0], LL[1]], [-LL[0], LL[1]]])
            BBox = polygon
            xy, NL, KL, BL, PVxydict = le.delaunay_centroid_rect_periodic_network_from_pts(
                points, LL, BBox='auto', check=check)
            PVx, PVy = le.PVxydict2PVxPVy(PVxydict, NL)
            originstr = ''
            periodicstr = '_periodic'
            stripstr = ''

    # Rescale so that median bond length is unity
    bL = le.bond_length_list(xy, BL, NL=NL, KL=KL, PVx=PVx, PVy=PVy)
    scale = 1. / np.median(bL)
    xy *= scale
    polygon *= scale
    BBox *= scale
    LL = (LL[0] * scale, LL[1] * scale)
    if lp['NP_load'] != 0:
        PVx *= scale
        PVy *= scale
        PVxydict.update((key, val * scale) for key, val in PVxydict.items())

    lattice_exten = 'hucentroid_' + lp['shape'] + periodicstr + '_d' +\
                    '{0:02d}'.format(int(lp['conf'])) + stripstr + originstr
    LVUC = 'none'
    LV = 'none'
    UC = 'none'
    return xy, NL, KL, BL, PVxydict, PVx, PVy, LVUC, BBox, LL, LV, UC, lattice_exten