def gen_edge_dislocation(self): screw_slab_unit = BodyCenteredCubic(directions = [self.x, self.y, self.z], size = (1,1,1), symbol='Fe', pbc=(1,1,1), latticeconstant = 2.83) screw_slab_unit = Atoms(screw_slab_unit) n_x = int(self.l_x/screw_slab_unit.get_cell()[0,0]) n_y = int(self.l_y/screw_slab_unit.get_cell()[1,1]) n_z = 1 screw_slab_super = supercell(screw_slab_unit, n_x, n_y, n_z) screw_slab_unit.write('ref_slab.xyz') b = screw_slab_unit.get_cell()[0,0] brg_vec = b*np.array([1,0,0]) vacuum = 70. screw_slab_super.lattice[1,1] += vacuum disloc_l = np.array([0,0,1]) screw_slab_super.set_lattice(screw_slab_super.get_cell(), scale_positions=False) super_slab = screw_slab_super.copy() L_x = screw_slab_super.lattice[0,0] L_y = screw_slab_super.lattice[1,1] L_z = screw_slab_super.lattice[2,2] #Maintain Periodicity along x and z for an edge dislocation: core = np.array([(L_x)/2., (L_y-vacuum)/2., (L_z)/2.]) screw_slab_super.set_cutoff(3.0) screw_slab_super.calc_connect() disloc_noam(screw_slab_super, core, disloc_l, brg_vec) screw_slab_super.info['core'] = core screw_slab_super.write('e{0}.xyz'.format(self.name))
POT_DIR = os.environ['POTDIR'] eam_pot = os.path.join(POT_DIR, 'PotBH.xml') r_scale = 1.00894848312 pot = Potential('IP EAM_ErcolAd do_rescale_r=T r_scale={0}'.format(r_scale), param_filename=eam_pot) #alat = 2.82893 #could just use the proper one as well.... alat = 2.837666 sup_cell = args.supercellsize tetra_pos = alat*np.array([0.5, 0.0, 0.75]) octa_pos = alat*np.array([0.5, 0.5, 0.0]) #Structures gb = BodyCenteredCubic(directions = [[1,0,0], [0,1,0], [0,0,1]], size = (sup_cell[0],sup_cell[1],sup_cell[2]), symbol='Fe', pbc=(1,1,1), latticeconstant = alat) mid_point = 0.5*(np.diag(gb.get_cell())) mid_point = [((sup_cell[0]-1)/2.)*alat for sp in sup_cell] gb = Atoms(gb) if args.tetra: print 'Tetrahedral Defect' tetra_pos += mid_point gb.add_atoms(tetra_pos, 1) gb.write('bcc_h.xyz') elif args.octa: print 'Octahedral Defect' octa_pos += mid_point gb.add_atoms(octa_pos, 1) gb.write('bcc_h.xyz') else: gb.write('bcc.xyz')
#screw_slab_unit.add_atoms(center_cell*0.76, 6) screw_slab_unit.set_atoms(screw_slab_unit.Z) print len(screw_slab_unit) tb.write_control_file('ctrl.fe', screw_slab_unit) pot = Potential('IP LMTO_TBE', param_str=""" <params> <LMTO_TBE_params n_types="2" control_file="ctrl.fe"> <per_type_data type="1" atomic_num="26"/> <per_type_data type="2" atomic_num="1"/> </LMTO_TBE_params> </params>""") #If there is an initial strain energy increment that here: pot.print_() screw_slab_unit.write('screw_unitcell.xyz') screw_slab_unit.set_calculator(pot) #Elastic constants are disabled until we have tight binding operational. if calc_elastic_constants and dyn_type != 'LOTF': cij = pot.get_elastic_constants(screw_slab_unit) print 'ELASTIC CONSTANTS' print((cij / units.GPa).round(2)) E = youngs_modulus(cij, y) nu = poisson_ratio(cij, y, x) print 'Youngs Modulus: ', E / units.GPa, 'Poisson Ratio: ', nu print 'Effective elastic modulus E: ', E / (1. - nu**2) print 'Loading Structure File:', '{0}.xyz'.format(input_file) defect = Atoms('{0}.xyz'.format(input_file)) top = defect.positions[:, 1].max() bottom = defect.positions[:, 1].min()
screw_slab_unit.add_atoms(center_cell,1) #screw_slab_unit.add_atoms(center_cell*0.76, 6) screw_slab_unit.set_atoms(screw_slab_unit.Z) print len(screw_slab_unit) tb.write_control_file('ctrl.fe', screw_slab_unit) pot = Potential('IP LMTO_TBE', param_str=""" <params> <LMTO_TBE_params n_types="2" control_file="ctrl.fe"> <per_type_data type="1" atomic_num="26"/> <per_type_data type="2" atomic_num="1"/> </LMTO_TBE_params> </params>""") #If there is an initial strain energy increment that here: pot.print_() screw_slab_unit.write('screw_unitcell.xyz') screw_slab_unit.set_calculator(pot) #Elastic constants are disabled until we have tight binding operational. if calc_elastic_constants and dyn_type != 'LOTF': cij = pot.get_elastic_constants(screw_slab_unit) print 'ELASTIC CONSTANTS' print ((cij / units.GPa).round(2)) E = youngs_modulus(cij, y) nu = poisson_ratio(cij, y, x) print 'Youngs Modulus: ', E/units.GPa,'Poisson Ratio: ', nu print 'Effective elastic modulus E: ', E/(1.-nu**2) print 'Loading Structure File:', '{0}.xyz'.format(input_file) defect = Atoms('{0}.xyz'.format(input_file)) top = defect.positions[:,1].max() bottom = defect.positions[:,1].min()
def calc_bulk_dissolution(args): """Calculate the bulk dissolution energy for hydrogen in a tetrahedral position in bcc iron. Args: args(list): determine applied strain to unit cell. """ POT_DIR = os.path.join(app.root_path, 'potentials') eam_pot = os.path.join(POT_DIR, 'PotBH.xml') r_scale = 1.00894848312 pot = Potential( 'IP EAM_ErcolAd do_rescale_r=T r_scale={0}'.format(r_scale), param_filename=eam_pot) alat = 2.83 gb = BodyCenteredCubic(directions=[[1, 0, 0], [0, 1, 0], [0, 0, 1]], size=(6, 6, 6), symbol='Fe', pbc=(1, 1, 1), latticeconstant=alat) cell = gb.get_cell() print 'Fe Cell', cell e1 = np.array([1, 0, 0]) e2 = np.array([0, 1, 0]) e3 = np.array([0, 0, 1]) if args.hydrostatic != 0.0: strain_tensor = np.eye(3) + args.hydrostatic * np.eye(3) cell = cell * strain_tensor gb.set_cell(cell, scale_atoms=True) print 'Hydrostatic strain', args.hydrostatic print 'strain tensor', strain_tensor print gb.get_cell() elif args.stretch != 0.0: strain_tensor = np.tensordot(e2, e2, axes=0) strain_tensor = np.eye(3) + args.stretch * strain_tensor cell = strain_tensor * cell print 'Stretch strain' print 'Cell:', cell gb.set_cell(cell, scale_atoms=True) elif args.shear != 0.0: strain_tensor = np.tensordot(e1, e2, axes=0) strain_tensor = np.eye(3) + args.shear * strain_tensor cell = strain_tensor.dot(cell) print 'Shear Strain', strain_tensor print 'Cell:', cell gb.set_cell(cell, scale_atoms=True) gb.write('sheared.xyz') else: print 'No strain applied.' tetra_pos = alat * np.array([0.25, 0.0, 0.5]) h2 = aseAtoms('H2', positions=[[0, 0, 0], [0, 0, 0.7]]) h2 = Atoms(h2) gb = Atoms(gb) gb_h = gb.copy() gb_h.add_atoms(tetra_pos, 1) #caclulators gb.set_calculator(pot) h2.set_calculator(pot) gb_h.set_calculator(pot) gb_h.write('hydrogen_bcc.xyz') #Calc Hydrogen molecule energy opt = BFGS(h2) opt.run(fmax=0.0001) E_h2 = h2.get_potential_energy() h2.write('h2mol.xyz') #strain_mask = [1,1,1,0,0,0] strain_mask = [0, 0, 0, 0, 0, 0] ucf = UnitCellFilter(gb_h, strain_mask) #opt = BFGS(gb_h) opt = FIRE(ucf) opt.run(fmax=0.0001) E_gb = gb.get_potential_energy() E_gbh = gb_h.get_potential_energy() E_dis = E_gbh - E_gb - 0.5 * E_h2 print 'E_gb', E_gb print 'E_gbh', E_gbh print 'H2 Formation Energy', E_h2 print 'Dissolution Energy', E_dis