def rotate_and_save(prototype,alpha,beta,gamma):
    rot_arr = calc_rot_array(alpha,beta,gamma)
    rotated = copy.deepcopy(prototype)
    rotate(rotated,rot_arr)
    rotated.write_real_xyz(rotated.filename[:-4] + '_rotated_{0}.{1}.{2}'.format(alpha,beta,gamma)
        + rotated.filename[-4:])
    return rotated
def generate_arrays(alpha,beta,gamma,start=0,stop=360,step=15):
    a = alpha; b = beta; c = gamma;
    arrays = []
    array_code = []
    print('set rotations /1*{0}/;'.format((stop/step)**3))
    for a in range(start,stop,step):
        for b in range(start,stop,step):
            for c in range(start,stop,step):
                rot = calc_rot_array(a,b,c)
                arrays.append(rot)
                gamsrot = [ [0 for i in range(len(rot[0])+1)] for j in range(len(rot)+1)]
                for i in range(1,len(gamsrot)):
                    for j in range(1,len(gamsrot[i])):
                        gamsrot[i][j] = rot[i-1][j-1]
                for i in range(len(gamsrot)):
                    gamsrot[i][0] = i
                for j in range(len(gamsrot[0])):
                    gamsrot[0][j] = j
                gamsrot[0][0] = '_'
                ptable = printTable(gamsrot)
                ptable = ptable.replace('_',' ')
                array_code.append( ['* Angle = {0}'.format(a), 'table rotation{0}(d1,d2)'.format(a/step+1), ptable+';'] )
                print('* Angles = {0},{1},{2}'.format(a,b,c))
                print('table rotation{0}(d1,d2)'.format(len(array_code)))
                print(ptable+';')
    print('parameter RotationMats(rotations,d1,d2);')
    i = 1
    for a in range(start,stop,step):
        for b in range(start,stop,step):
            for c in range(start,stop,step):
                print("RotationMats('{0}',d1,d2) = rotation{0}(d1,d2);".format(i))
                i += 1
    return arrays
Пример #3
0
def create_basic_models():
    lattice_param = 1
    a = 30
    b = 135
    c = 45
    rot_arr = calc_rot_array(a,b,c,deg=True)

    perfect = icosahedron(lattice_param,save=True,filename='icosahedron.perfect.xyz')
    convert(perfect,'prototype','icosahedron.perfect.txt')

    sm = copy.deepcopy(perfect)
    swap_atom(sm,2,3)
    sm.write_real_xyz('icosahedron.perfect.swap.xyz')
    convert(sm,'polyhedron','icosahedron.perfect.swap.txt')

    rm = copy.deepcopy(perfect)
    rotate(rm,rot_arr)
    rm.write_real_xyz('icosahedron.perfect.rot.xyz')
    convert(rm,'polyhedron','icosahedron.perfect.rot.txt')

    rm = copy.deepcopy(sm)
    rotate(rm,rot_arr)
    rm.write_real_xyz('icosahedron.perfect.swap.rot.xyz')
    convert(rm,'polyhedron','icosahedron.perfect.swap.rot.txt')

    imperfect = copy.deepcopy(perfect)
    perturb_atom(imperfect,1,0.1,0)
    imperfect.write_real_xyz('icosahedron.imperfect.xyz')
    convert(imperfect,'prototype','icosahedron.imperfect.txt')

    sim = copy.deepcopy(imperfect)
    swap_atom(sim,2,3)
    sim.write_real_xyz('icosahedron.imperfect.swap.xyz')
    convert(sim,'polyhedron','icosahedron.imperfect.swap.txt')

    rim = copy.deepcopy(imperfect)
    rotate(rim,rot_arr)
    rim.write_real_xyz('icosahedron.imperfect.rot.xyz')
    convert(rim,'polyhedron','icosahedron.imperfect.rot.txt')

    rim = copy.deepcopy(sim)
    rotate(rim,rot_arr)
    rim.write_real_xyz('icosahedron.imperfect.swap.rot.xyz')
    convert(rim,'polyhedron','icosahedron.imperfect.swap.rot.txt')
def main():
    prototype = Model(sys.argv[1])
    #polygon   = Model(sys.argv[2])
    alpha = 15
    beta = 45
    gamma = 135
    # Assume no permutation of the atoms
    polygon = rotate_and_save(prototype,alpha,beta,gamma)

    # Take the prototype and the polygon and rotate the polygon to the prototype
    # for every rotation matrix, and calculate the value of epsilon for that
    # rotation. Store the angle,epsilon values in two arrays for later analysis.
    start = 0
    stop = 360
    step = 15
    xdata = []
    ydata = []
    m = (100000,(1,2,3,),)
    #m = 5.9520869802
    count = 0
    for a in xrange(start,stop,step):
        for b in xrange(start,stop,step):
            for c in xrange(start,stop,step):
                rot = calc_rot_array(-a,-b,-c)
                rotpolygon   = copy.deepcopy(polygon)
                rotate(rotpolygon, rot)
                epsilon = sum( dist(prototype.atoms[i].coord,rotpolygon.atoms[i].coord) for i in range(prototype.natoms) )
                #if(epsilon < min[0]): m = (epsilon, (-a,-b,-c,),)
                #if(epsilon == m): print( count, (epsilon, (-a,-b,-c,),) )
                #print(round(epsilon,2))
                xdata.append(a)
                ydata.append(epsilon)
                count += 1
    print(min)

    # Do a fit to abs(sin(...)) based on the data recorded above
    xdata = np.array(xdata)
    ydata = np.array(ydata)
    popt, pcov = curve_fit(sin2, xdata, ydata,p0=[83.5,700,10,0])
    a,b,c,d = tuple(popt)
    #print(a,b,c,d)
    #print(pcov)
    for x,y in zip(xdata,ydata):
        print("{0}\t{1}".format(x,y))
Пример #5
0
def create_randomized_model(num,dir=dir):
    lattice_param = 1
    perfect = icosahedron(lattice_param,save=True,filename='icosahedron.perfect.xyz')
    perfect.write(perfect.filename)
    return 0
    for i in range(num):
        print(i)
        a = random.uniform(0,360)
        b = random.uniform(0,360)
        c = random.uniform(0,360)
        #a = random.randrange(0,345,15)
        #b = random.randrange(0,345,15)
        #c = random.randrange(0,345,15)
        rot_arr = calc_rot_array(a,b,c,deg=True)

        imperfect = copy.deepcopy(perfect)
        perturb_atom(imperfect,axis='all')
        #swap_atom(imperfect)
        imperfect.write_real_xyz(dir+'icosahedron.{0}.random.xyz'.format(i))
        convert(imperfect,'polyhedron',dir+'icosahedron.{0}.random.txt'.format(i))
        rotate(imperfect,rot_arr)
        imperfect.write_real_xyz(dir+'icosahedron.{0}.random.rot.xyz'.format(i))
        convert(imperfect,'polyhedron',dir+'icosahedron.{0}.random.rot.txt'.format(i))