def update_qm_region_H(atoms): """ Set quantum region around the Hydrogen. Also records crackpos. """ mm_pot = Potential(mm_init_args, param_filename = param_file, cutoff_skin = cutoff_skin) crack_pos = find_crack_tip_stress_field(atoms, calc=mm_pot) #set quantum region to first hydrogen atom in list. h_pos = atoms[h_list[0]].position old_qm_list = atoms.hybrid_vec.nonzero()[0] new_qm_list = update_hysteretic_qm_region(atoms, old_qm_list, h_pos, qm_inner_radius, qm_outer_radius, update_marks=False) #lets try setting the atoms object properties by hand? atoms.hybrid[:] = 0 atoms.hybrid[new_qm_list] = 1 #Distributed Force Mixing Properties: atoms.hybrid_vec[:] = 0 atoms.hybrid_vec[new_qm_list] = 1 atoms.hybrid_1[:] = atoms.hybrid_vec[:] atoms.params['core'] = h_pos atoms.params['CrackPos'] = crack_pos return
def update_qm_region(atoms): crack_pos = find_crack_tip_stress_field(atoms, calc=mm_pot, avg_sigma=avg_sigma) qm_list = qmmm_pot.get_qm_atoms(atoms) qm_list = update_hysteretic_qm_region(atoms, qm_list, crack_pos, qm_inner_radius, qm_outer_radius) qmmm_pot.set_qm_atoms(qm_list, atoms)
def update_qm_region(atoms=dynamics.atoms): #crack_pos = find_crack_tip_stress_field(atoms, calc=mm_pot, avg_sigma=avg_sigma) #print crack_pos crack_pos = atoms.info['CrackPos'] qm_list = qmmm_pot.get_qm_atoms(atoms) qm_list = update_hysteretic_qm_region(atoms, qm_list, crack_pos, qm_inner_radius, qm_outer_radius) qmmm_pot.set_qm_atoms(qm_list, atoms)
def update_qm_region(atoms): crack_pos = find_crack_tip_stress_field(atoms, calc=mm_pot) qm_list = qmmm_pot.get_qm_atoms() qm_list = update_hysteretic_qm_region(atoms, qm_list, crack_pos, qm_inner_radius, qm_outer_radius, update_marks=True) qmmm_pot.set_qm_atoms(qm_list) #lets try setting the atoms object properties by hand? atoms.hybrid[:] = HYBRID_NO_MARK atoms.hybrid[qm_list] = HYBRID_ACTIVE_MARK
def update_qm_region(atoms): crack_pos = find_crack_tip_stress_field(atoms, calc=mm_pot) qm_list = qmmm_pot.get_qm_atoms() qm_list = update_hysteretic_qm_region(atoms, qm_list, crack_pos, qm_inner_radius, qm_outer_radius, update_marks=True) qmmm_pot.set_qm_atoms(qm_list) #lets try setting the atoms object properties by hand? atoms.hybrid[:] = HYBRID_NO_MARK atoms.hybrid[qm_list] = HYBRID_ACTIVE_MARK
def update_qm_region(atoms, dis_type='edge', cut=3.0, rr=10.0, qr=1): """ Routine for updating qm region of dislocation. Args: dis_type: Dislocation type can be edge or screw. rr: determines radius of quantum sphere. qr: is the number of quantum regions. """ core[:] = atoms.params['core'] fixed_mask = (np.sqrt((atoms.positions[:,0]-core[0])**2 + (atoms.positions[:,1]-core[1])**2) < rr) cl = atoms.select(mask=fixed_mask, orig_index=True) print 'Number of Atoms in Cluster', cl.n cl.set_cutoff(cut) cl.calc_connect() cl = Atoms(cl) x0 = Atoms('ref_slab.xyz') x0.set_cutoff(cut) x0.calc_connect() alpha = calc_nye_tensor(cl, x0, 3, 3, cl.n) cl.screw = alpha[2,2,:] cl.edge = alpha[2,0,:] if dis_type == 'screw': defect_pos = cl.screw elif dis_type == 'edge': defect_pos = cl.edge total_def = 0.0 c = np.array([0.,0.,0.]) mom = [3.0 for at in range(len(atoms))] atoms.set_initial_magnetic_moments(mom) for i in range(cl.n): defect_pos = defect_pos + cl.edge[i] c[1] = c[1] + cl.positions[i,0]*defect_pos[i] c[2] = c[2] + cl.pos[i,0]*defect_pos[i] c[0] = c[0]/total_def c[1] = c[1]/total_def c[2] = atoms.lattice[2,2]/2. core[:] = c.copy() old_qm_list = atoms.hybrid_vec.nonzero()[0] new_qm_list = update_hysteretic_qm_region(atoms, old_qm_list, core[:], qm_inner_radius, qm_outer_radius, update_marks=False) #Force Mixing Potential requires hybrid property: atoms.hybrid[:] = 0 atoms.hybrid[new_qm_list] = 1 #Distributed Force Mixing Properties: atoms.hybrid_vec[:] = 0 atoms.hybrid_vec[new_qm_list] = 1 atoms.hybrid_1[:] = atoms.hybrid_vec[:] atoms.params['core'] = core[:] return
def update_qm_region_crack(atoms): mm_pot = Potential(params.mm_init_args, param_filename=params.param_file, cutoff_skin=params.cutoff_skin) crack_pos = find_crack_tip_stress_field(atoms, calc=mm_pot) old_qm_list = atoms.hybrid_vec.nonzero()[0] new_qm_list = update_hysteretic_qm_region(atoms, old_qm_list, crack_pos, params.qm_inner_radius, params.qm_outer_radius, update_marks=False) #lets try setting the atoms object properties by hand? atoms.hybrid[:] = 0 atoms.hybrid[new_qm_list] = 1 #Distributed Force Mixing Properties: atoms.hybrid_vec[:] = 0 atoms.hybrid_vec[new_qm_list] = 1 atoms.hybrid_1[:] = atoms.hybrid_vec[:] atoms.params['core'] = crack_pos atoms.params['CrackPos'] = crack_pos return
def update_qm_region(atoms): crack_pos = find_crack_tip_stress_field(atoms, calc=mm_pot, avg_sigma=avg_sigma) qm_list = qmmm_pot.get_qm_atoms(atoms) qm_list = update_hysteretic_qm_region(atoms, qm_list, crack_pos, qm_inner_radius, qm_outer_radius) qmmm_pot.set_qm_atoms(qm_list, atoms)
lotf_spring_hops=3, terminate=False, calc_connect=True, buffer_hops=3, hysteretic_buffer=True, cluster_vacuum = 5.0, cluster_hopping = True, single_cluster=True, hysteretic_buffer_inner_radius=qm_inner_radius, hysteretic_buffer_outer_radius=qm_outer_radius, cluster_hopping_nneighb_only=True, min_images_only=True) atoms.set_calculator(qmmm_pot) qmmm_pot.atoms = atoms qm_list = update_hysteretic_qm_region(atoms, [], crack_pos, qm_inner_radius, qm_outer_radius) atoms.hybrid[qm_list] = HYBRID_ACTIVE_MARK dynamics = LOTFDynamics(atoms, timestep, extrapolate_steps, check_force_error=args.check_force) if args.check_force: pred_corr_logfile = open('pred-corr-error.txt','w') dynamics.attach(log_pred_corr_errors, 1, dynamics, pred_corr_logfile) # array to store time averaged stress field avg_sigma = np.zeros((len(atoms), 3, 3)) def update_qm_region(atoms): crack_pos = find_crack_tip_stress_field(atoms, calc=mm_pot, avg_sigma=avg_sigma) qm_list = qmmm_pot.get_qm_atoms(atoms) qm_list = update_hysteretic_qm_region(atoms, qm_list, crack_pos, qm_inner_radius, qm_outer_radius) qmmm_pot.set_qm_atoms(qm_list, atoms)
'carve_cluster terminate randomise_buffer=F') # Construct the QM/MM potential, which mixes QM and MM forces qmmm_pot = ForceMixingPotential(pot1=mm_pot, pot2=qm_pot, qm_args_str=qm_args_str, fit_hops=4, lotf_spring_hops=3, buffer_hops=4) # Use the force mixing potential as the Atoms' calculator atoms.set_calculator(qmmm_pot) # *** Set up the initial QM region **** qm_list = update_hysteretic_qm_region(atoms, [], orig_crack_pos, qm_inner_radius, qm_outer_radius) qmmm_pot.set_qm_atoms(qm_list) # *** Milestone 3.1 -- exit early - we don't want to run the classical MD! *** import sys sys.exit(0) # **** no changes compared to run_crack_classical.py below here yet **** # ********* Setup and run MD *********** # Set the initial temperature to 2*simT: it will then equilibriate to # simT, by the virial theorem MaxwellBoltzmannDistribution(atoms, 2.0*sim_T)
if not params.continuation and not params.classical: print 'Finding initial Quantum Core positions...' if geom =='disloc': atoms = set_quantum_disloc(atoms) elif geom=='crack': mom = [3.0 for at in range(len(atoms))] atoms.set_initial_magnetic_moments(mom) atoms.add_property('hybrid', 0, overwrite=True) atoms.add_property('hybrid_vec', 0, overwrite=True) atoms.add_property('hybrid_1', 0) atoms.add_property('hybrid_mark_1', 0) crackpos = atoms.info['CrackPos'] qm_list_old = [] qm_list = update_hysteretic_qm_region(atoms, [], crackpos, params.qm_inner_radius, params.qm_outer_radius, update_marks=False) atoms.hybrid[qm_list] = HYBRID_ACTIVE_MARK atoms.hybrid_vec[qm_list] = HYBRID_ACTIVE_MARK atoms.hybrid_1[qm_list] = HYBRID_ACTIVE_MARK atoms.hybrid_mark_1[qm_list] = HYBRID_ACTIVE_MARK atoms.params['core'] = crackpos print HYBRID_ACTIVE_MARK print 'Core Found. No. Quantum Atoms:', sum(atoms.hybrid[:]) else: print 'No cell geometry given, specifiy either disloc or crack', 1/0 # ********* Setup and run MD *********** # Set the initial temperature to 2*simT: it will then equilibriate to # simT, by the virial theorem if params.test_mode: