# Increase epsilon_yy applied to all atoms at constant strain rate strain_atoms = ConstantStrainRate(orig_height, strain_rate*timestep) atoms.set_constraint([fix_atoms, strain_atoms]) # ******* Set up potentials and calculators ******** mm_pot = Potential(mm_init_args, param_filename=param_file, cutoff_skin=cutoff_skin) # Request Potential to compute per-atom stresses whenever we # compute forces, to save time when locating the crack tip mm_pot.set_default_quantities(['stresses']) # Density functional tight binding (DFTB) potential qm_pot = Potential(qm_init_args, param_filename=param_file) # Parameters which control how the QM calculation is carried out: # we use a single cluster, periodic in the z direction and terminated # with hydrogen atoms. The positions of the outer layer of buffer atoms # are not randomised. qm_args_str = ('single_cluster cluster_periodic_z '+ '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,
# Increase epsilon_yy applied to all atoms at constant strain rate strain_atoms = ConstantStrainRate(orig_height, strain_rate*timestep) atoms.set_constraint([fix_atoms, strain_atoms]) # ******* Set up potentials and calculators ******** mm_pot = Potential(mm_init_args, param_filename=param_file, cutoff_skin=cutoff_skin) # Request Potential to compute per-atom stresses whenever we # compute forces, to save time when locating the crack tip mm_pot.set_default_quantities(['stresses']) atoms.set_calculator(mm_pot) # ********* 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) # Initialise the dynamical system dynamics = VelocityVerlet(atoms, timestep) # Print some information every time step def printstatus(): if dynamics.nsteps == 1: