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
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))
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))