kim init sed_model_string metal unit_conversion_mode # Isolated atom energy for this species in eV (computed in a separate LAMMPS calculation) variable isolated_atom_energy_sum equal sed_isolated_atom_energy_sum # Periodic boundary conditions, z direction big enough so images don't interact boundary p p p # Create a hexagonal lattice with the lattice spacing and basis atoms supplied by the # user using a single primitive hexagonal unit cell. Insert a graphene-like or a TMD # basis. variable initLatConst equal sed_initial_lattice_constant_string*${_u_distance} lattice custom ${initLatConst} a1 1.0 0.0 0.0 & a2 -0.5 0.866025403784439 0.0 & a3 0.0 0.0 150.0 & spacing 1.0 0.866025403784439 150.0 & sed_basis_string region box prism 0 1 0 1 0 1 -0.5 0 0 units lattice create_box sed_number_species_string box create_atoms 1 box sed_basis_atoms_string # Mass unimportant since we're not doing time integration mass * 1.0 kim interactions sed_species1_string sed_species2_string # Variables used to rescale the positions and forces so that the quantities in the # dumpfile are in the original metal units (angstrom and eV/angstrom) even if we're # running with a Simulator Model that uses different units variable x_metal atom x/${_u_distance} variable y_metal atom y/${_u_distance} variable z_metal atom z/${_u_distance} variable fx_metal atom fx/${_u_force} variable fy_metal atom fy/${_u_force} variable fz_metal atom fz/${_u_force} # Set what information to write to dump file dump id all custom 100 output/lammps.dump id type v_x_metal v_y_metal v_z_metal & v_fx_metal v_fy_metal v_fz_metal dump_modify id format line "%d %d %16.7f %16.7f %16.7f %16.7f %16.7f %16.7f" # Set boundary conditions to be stress-free fix 1 all box/relax x 0.0 y 0.0 z 0.0 couple xy # fix atoms fix 2 all setforce 0.0 0.0 0.0 # For TMDs, need difference in z-position of layers sed_tmd_uncomm_string group transmetal type 1 sed_tmd_uncomm_string group chalcogen type 2 sed_tmd_uncomm_string compute upperZpos chalcogen reduce max z sed_tmd_uncomm_string compute middleZpos transmetal reduce max z # Consistent with the property definition, we are defining the z position in terms # of the 2D lattice constant sed_tmd_uncomm_string variable zpos equal "(c_upperZpos-c_middleZpos)/lx" # Variables used to rescale the energy and stress so that the quantities in the thermo # output are in the original metal units (eV and bars) even if we're running with a # Simulator Model that uses different units variable pe_metal equal "c_thermo_pe/v__u_energy" variable lx_metal equal lx/${_u_distance} variable lz_metal equal lz/${_u_distance} variable press_metal equal "c_thermo_press/v__u_pressure" variable pxx_metal equal pxx/${_u_pressure} variable pyy_metal equal pyy/${_u_pressure} variable pxy_metal equal pxy/${_u_pressure} # Set what thermodynamic information to print to log thermo_style custom step atoms v_pe_metal v_lx_metal v_lz_metal & press v_press_metal v_pxx_metal v_pyy_metal v_pxy_metal & sed_tmd_uncomm_string v_zpos thermo 100 # Print every 100 timesteps # Perform static minimization using the Polack-Ribiere conjugate gradient method. # Restart minimization after end with smaller allowed volume step size minimize 1e-12 1e-12 10000 50000 # Define auxiliary variables to contain cohesive energy and equilibrium lattice constant variable natoms equal "count(all)" variable ecohesive equal "-(v_pe_metal - v_isolated_atom_energy_sum)/v_natoms" variable surften equal "v_pxx_metal*v_lz_metal" variable a equal "v_lx_metal" # Output cohesive energy and equilibrium lattice constant sed_tmd_uncomm_string print "Free z parameter in layer group = ${zpos} angstrom" print "Final surface tension = ${surften} bar*angstrom" print "Cohesive energy = ${ecohesive} eV/atom" print "Equilibrium lattice constant = ${a} angstrom"