示例#1
0
 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
示例#2
0
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)
示例#3
0
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)
示例#4
0
  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
示例#5
0
 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
示例#6
0
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 
示例#7
0
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
示例#8
0
 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)
示例#9
0
                                    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)
示例#10
0
               '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)
示例#11
0
 
 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: