def diamond_110_001(el, a0, n, crack_surface=[1,1,0], crack_front=[0,0,1], skin_x=1.0, skin_y=1.0, vac=5.0): nx, ny, nz = n third_dir = np.cross(crack_surface, crack_front) directions = [ third_dir, crack_surface, crack_front ] if np.linalg.det(directions) < 0: third_dir = -third_dir directions = [ third_dir, crack_surface, crack_front ] a = Diamond(el, latticeconstant = a0, size = [ nx,ny,nz ], directions = directions) sx, sy, sz = a.get_cell().diagonal() a.translate([a0/100,a0/100,a0/100]) a.set_scaled_positions(a.get_scaled_positions()) a.center() lx = skin_x*sx/nx ly = skin_y*sy/ny r = a.get_positions() g = np.where( np.logical_or( np.logical_or( np.logical_or( r[:, 0] < lx, r[:, 0] > sx-lx), r[:, 1] < ly), r[:, 1] > sy-ly), np.zeros(len(a), dtype=int), np.ones(len(a), dtype=int)) a.set_array('groups', g) a.set_cell([sx+2*vac, sy+2*vac, sz]) a.translate([vac, vac, 0.0]) a.set_pbc([False, False, True]) return a
def dia_100_2x1(sym, a0): sym = string2symbols(sym) if len(sym) == 1: a = Diamond(sym[0], size = [2*nx, nx, nz], latticeconstant = a0, directions=[ [1,-1,0], [1,1,0], [0,0,1] ] ) else: a = B3(sym, size = [2*nx, nx, nz], latticeconstant = a0, directions=[ [1,-1,0], [1,1,0], [0,0,1] ] ) sx, sy, sz = a.get_cell().diagonal() a.translate([sx/(8*nx), sy/(8*nx), sz/(8*nz)]) bulk = a.copy() for i in a: if i.z < sz/(4*nz) or i.z > sz-sz/(4*nz): if i.x < sx/2: i.x = i.x+0.5 else: i.x = i.x-0.5 return bulk, a
def dia_111(sym, a0): sym = string2symbols(sym) if len(sym) == 1: a = Diamond(sym[0], size=[nx, nx, nz], latticeconstant=a0, directions=[[1, -1, 0], [1, 1, -2], [1, 1, 1]]) else: a = B3(sym, size=[nx, nx, nz], latticeconstant=a0, directions=[[1, -1, 0], [1, 1, -2], [1, 1, 1]]) sx, sy, sz = a.get_cell().diagonal() a.translate([sx / (12 * nx), sy / (4 * nx), sz / (12 * nz)]) return a
def dia_111_pandey(sym, a0, nx=nx, ny=nx, nz=nz): """2x1 Pandey reconstructed (111) surface.""" sym = string2symbols(sym) if len(sym) == 1: a = Diamond(sym[0], size = [nx, ny, nz], latticeconstant = a0, directions=[ [1,-1,0], [1,1,-2], [1,1,1] ] ) else: a = B3(sym, size = [nx, ny, nz], latticeconstant = a0, directions=[ [1,-1,0], [1,1,-2], [1,1,1] ] ) sx, sy, sz = a.get_cell().diagonal() a.translate([sx/(12*nx), sy/(4*ny), sz/(6*nz)]) a.set_scaled_positions(a.get_scaled_positions()%1.0) bulk = a.copy() bondlen = a0*sqrt(3)/4 x, y, z = a.positions.T mask = np.abs(z-z.max()) < 0.1*a0 top1, top2 = np.arange(len(a))[mask].reshape(-1, 2).T mask = np.logical_and(np.abs(z-z.max()) < bondlen, np.logical_not(mask)) topA, topB = np.arange(len(a))[mask].reshape(-1, 2).T y[topA] += bondlen/3 y[topB] -= bondlen/3 y[top1] += bondlen x[top1] += a.cell[0,0]/(2*nx) x[top2] += a.cell[0,0]/(2*nx) mask = np.abs(z-z.min()) < 0.1*a0 bot1, bot2 = np.arange(len(a))[mask].reshape(-1, 2).T mask = np.logical_and(np.abs(z-z.min()) < bondlen, np.logical_not(mask)) botA, botB = np.arange(len(a))[mask].reshape(-1, 2).T y[botA] += bondlen/3 y[botB] -= bondlen/3 y[bot2] -= bondlen x[bot2] += a.cell[0,0]/(2*nx) x[bot1] += a.cell[0,0]/(2*nx) a.set_scaled_positions(a.get_scaled_positions()%1.0) return bulk, a
def dia_111(sym, a0): sym = string2symbols(sym) if len(sym) == 1: a = Diamond(sym[0], size = [nx, nx, nz], latticeconstant = a0, directions=[ [1,-1,0], [1,1,-2], [1,1,1] ] ) else: a = B3(sym, size = [nx, nx, nz], latticeconstant = a0, directions=[ [1,-1,0], [1,1,-2], [1,1,1] ] ) sx, sy, sz = a.get_cell().diagonal() a.translate([sx/(12*nx), sy/(4*nx), sz/(12*nz)]) return a
def diamond_110_110(el, a0, n, crack_surface=[1,1,0], crack_front=[1,-1,0], skin_x=0.5, skin_y=1.0, central_x=-1.0, central_y=-1.0, vac=5.0): nx, ny, nz = n third_dir = np.cross(crack_surface, crack_front) a = Diamond(el, latticeconstant = a0, size = [nx, ny, nz], directions = [third_dir, crack_surface, crack_front] ) sx, sy, sz = a.get_cell().diagonal() a.translate([sx/(8*nx), sy/(4*ny), sz/(4*nz)]) a.set_scaled_positions(a.get_scaled_positions()) skin_x = skin_x*sx/nx skin_y = skin_y*sy/ny r = a.get_positions() g = np.where( np.logical_or( np.logical_or( np.logical_or( r[:, 0] < skin_x, r[:, 0] > sx-skin_x), r[:, 1] < skin_y), r[:, 1] > sy-skin_y), np.zeros(len(a), dtype=int), np.ones(len(a), dtype=int)) g = np.where( np.logical_or( np.logical_or( np.logical_or( r[:, 0] < sx/2-central_x, r[:, 0] > sx/2+central_x), r[:, 1] < sy/2-central_y), r[:, 1] > sy/2+central_y), g, 2*np.ones(len(a), dtype=int)) a.set_array('groups', g) a.set_cell([sx+2*vac, sy+2*vac, sz]) a.translate([vac, vac, 0.0]) a.set_pbc([False, False, True]) return a