Supporting information for: On the Reaction Coordinates

1 downloads 79 Views 1017KB Size Report
4 Reaction path following force displaced stationary points (FDSP) script S7 ... for the toy 2D potential plotted against its contour plot. b) One dimensional PES profiles ... Below we provide the python scripts as used for calculating various.
Supporting information for: On the Reaction Coordinates and Pathways of Mechanochemical Transformations. Stanislav M. Avdoshenko† and Dmitrii E. Makarov∗,†,‡ Institute for Computational Engineering and Sciences, University of Texas at Austin, Austin, Texas 78712, and Department of Chemistry, University of Texas at Austin, Austin, Texas 78712 E-mail: [email protected]

Contents 1 Reaction paths for a toy 2D potential

S2

2 Distinguished coordinate path (DCP) script

S4

3 Steepest descent path (SDP) script

S6

4 Reaction path following force displaced stationary points (FDSP) script

S7

5 External force explicitly included path (EFEIP) script

S8

6 HL class description

S9

7 Trans-1,2-dimethylcyclobutane molecule (RS, mol.xyz)

S11

8 Trans-1,2-dimethylcyclobutane molecule (TS, ts.xyz)

S11



To whom correspondence should be addressed Institute for Computational Engineering and Sciences, University of Texas at Austin ‡ Department of Chemistry, University of Texas at Austin †

S1

1

Reaction paths for a toy 2D potential

Here, we construct SDP, DCP and FDSP paths (defined, respectively, by Eqs. 3, 4, and 6 in the main text) for the symmetric double-well potential 1 2



R2 √ 2

R1 √ 2



R1 √ 2

R2 √ 2

2  2



R1 √ 2

R2 √ 2

2

2

+ −1 + + √ √ whose minima are located at (- 2,0) and (0, 2) and whose saddle’s (TS) location is at the V (R1 , R2 ) =





coordinate origin. A force of magnitude F is assumed to act along R1 , f =(F,0). The results are shown in Figure S1. Depending on the value of the pulling coordinate R1 , the potential V (R1 , R2 ) is found to have one or two local minima, resulting in two separate DCP branches denoted M1 and M2 (see Figure S1). The branch M1 originating from the reactant state minimum follows FDSP until it terminates at the turning point TP (see also Fig. 2 in the main text). A COGEF-type constrained optimization calculation would therefore result in discontinuous behavior with a jump from M1 to M2. Indeed, such a jump is observed in Fig. 2 in the main text.

S2

Figure S1: a) SDP(red solid line), DCP (green and red dots) and FDSP (blue solid line) for the toy 2D potential plotted against its contour plot. b) One dimensional PES profiles along the pulling coordinate computed using SDP (red), FDSP (blue) and DCP (green and red dotted lines). The turning point (TP), the catastrophe point (CP) and the transition state (TS) are highlighted.

S3

In the calculations reported in this paper the Atomistic Simulation Environment(ASE version 3.8) was used. Below we provide the python scripts as used for calculating various reaction paths as well as for COGEF and EFEI calculations. These scripts can be used with standard ASE calculators (see https://wiki.fysik.dtu.dk/ase/ ASE home ).

2

Distinguished coordinate path (DCP) script

from ase.io import write from ase. optimize import BFGS from ase. constraints import HookeanL from ase.io.xyz import ∗ from ase. vibrations import Vibrations from ase.io.xyz import ∗ import numpy as np # H o t b i t module s h o u l d be a v a i l a b l e from hotbit import ∗

#S y s t e m s # Read t h e m o l e c u l e atoms = read_xyz (’./ mol.xyz ’) # box s i z e d=20. # S e t t h e box and p u t m o l e c u l e i n t h e c e n t e r atoms . set_cell ((d,d,d)); atoms. set_pbc (( False )); atoms. center () # S e t u p c a l c u l a t o r TDDFT as implement i n H o t b i t c ode calc= Hotbit (SCC=True ,txt=’out.cal ’); atoms. set_calculator (calc) # Pre−o p t i m i z e w i t h BFGS o p t i m i z a t i o n module dyn = BFGS(atoms=atoms , trajectory =’emt.traj ’); dyn.run(fmax =0.001) # I d e n t i f i c a t i o n of pulling s i t e s i=0; j=8 # Data a r r a y f o r d i s t a n c e s ( r r ) , e n e r g y (EE) and f o r c e (FF) rr =[]; EE =[]; FF =[] # Get p o s t i o n s e n e r g y and f o r c e s pos = atoms. get_positions (); E=atoms. get_potential_energy (); F=atoms. get_for # Force norm MF=abs(np. linalg .norm(F. reshape ((3∗ len(pos ) ,1)))) # Distance between p u l l i n g p o i n t s r=np.sum (( pos[i]−pos[j ])∗∗2)∗∗0.5 # Original data FF. append (MF); rr. append (r); EE. append (E) # Step s i z e S4

step =0.025 #MEP l o o p : for k in range (1 ,50): # Increase d i s t a n c e between p u l l i n g s i t e s pos = atoms. get_positions () r=np.sum (( pos[i]−pos[j ])∗∗2)∗∗0.5 ee =( pos[j]−pos[i])/r pos[i]= pos[i]−ee ∗ step pos[j]= pos[j]+ee∗ step atoms . positions =pos # S e t u p t h e bond c o n s t r a i n c = FixBondLength (i, j) atoms . set_constraint (c) atoms . set_calculator (calc) # Optimization with constrains BFGS(atoms , trajectory =’mep%d.traj ’ % k). run(fmax =0.01) write (’mol_%d.xyz ’ % k,atoms) EE. append (atoms. get_potential_energy ()) F= atoms. get_forces ( apply_constraint =False) MF=abs(np. linalg .norm(F. reshape ((3∗ len(pos ) ,1)))) FF. append (MF) rr. append (r) #Check dF/dR−>I n f ( t u r n i n g p o i n t ) if k >10: dx=np. gradient (rr) y2 =np.array(FF )/(2∗∗.5) df=np. gradient (y2 , dx) print df if abs(df[len(df)−1])>10: break

# Plotting the r e s u l t s s c r i p t import matplotlib . pyplot as plt from pylab import ∗

font = {’family ’ : ’sans−serif ’, ’weight ’ : ’bold ’, ’size ’ : 16}

plt.rc(’font ’ ,∗∗ font) S5

subplot (221) plt. xlabel (’R, a.u.’,fontsize =20) plt. ylabel (’Potential energy , a.u.’,fontsize =20) plt.plot(rr , EE , ’ko−’) subplot (222) plt. xlabel (’force norm , a.u.’,fontsize =20) plt. ylabel (’Potential Energy , a.u.’,fontsize =20) plt.plot(FF , EE , ’ko−’) subplot (223) plt. xlabel (’R, a.u.’,fontsize =20) plt. ylabel (’Force norm , a.u.’,fontsize =20) dx=np. gradient (rr) y =np. array(EE) y2 =np. array(FF) plt.plot(rr , np.array(FF )/(2∗∗.5) , ’bo−’) plt.plot(rr ,np. gradient (y2 , dx), ’ro−−’) subplot (224) plt. xlabel (’Force , a.u.’,fontsize =20) plt. ylabel (’R, a.u.’,fontsize =20) plt.plot(FF , rr , ’ko−’) plt.grid(True) plt. savefig (" out_energy .png",transparent = True) plt.show () data = np. column_stack ((rr , EE)) np. savetxt (’en_r.txt ’, data , delimiter =" ")

3

Steepest descent path (SDP) script

#The s y s t e m i n f o r m a t i o n as b e f o r e i n t h e s c r i p t MEP # E x e p t we r e a d t r a n s d i t i o n s t a t e g e o m e t r y and no pre−o p t i m i z a t i o n i s ne eded atoms = read_xyz (’./ ts_shift_along_um .xyz ’)) # SD l o o p : for k in range (1 ,300): pos = atoms. get_positions () r=np.sum (( pos[i]−pos[j ])∗∗2)∗∗0.5 S6

pos = pos + step ∗F atoms . positions =pos E = atoms. get_potential_energy () F = atoms. get_forces () F[i]=F[i] F[j]=F[j] print F MF=abs(np. linalg .norm(F. reshape ((3∗ len(pos ) ,1)))) print k, r, E, MF kk. append (k); rr. append (r); EE. append (E); FF. append (MF) atoms . forces =F write (’sd_%d.xyz ’ % k,atoms) # The r e s u l t s p l o t i n g s c r i p t as b e f o r e #. . . .

4

Reaction path following force displaced stationary points (FDSP) script

#The s y s t e m i n f o r m a t i o n as b e f o r e i n t h e s c r i p t MEP #FDSP l o o p : for k in range (1 ,50 ,1): print k pos = atoms. get_positions () ee =( pos[i]−pos[j])/ dist r=np.sum (( pos[i]−pos[j ])∗∗2)∗∗0.5 F[i]=+ ee F[j]=−ee # C o n t r o l s how many t i m e s H e s s i a n w i l l be u p d a t e d if k %1==0: os. system ("rm ∗. pckl") vib = Vibrations (atoms ,delta =0.01 , nfree =2) vib.run () vib. summary () aa=np.real(vib. get_energies ()) hess=vib.read () w, v = np. linalg .eig(vib.read ()) nvib. append (aa) ihess =np. linalg .pinv(hess ,rcond =0.001) S7

dr=np.dot(ihess ,F. reshape ((3∗ len(pos ) ,1)))∗ df npos=pos+dr. reshape (len(dr )/3 ,3) fforce = fforce +df atoms . positions =npos write (’mol_ ’+str(k)+’.xyz ’,atoms) FP= atoms. get_forces ( apply_constraint =False) MF=abs(np. linalg .norm(FP. reshape ((3∗ len(pos ) ,1)))) FF. append (MF /(2∗∗.5)); rr. append (dist) EE. append (atoms. get_potential_energy ()); kk. append (k) #Check dF/dR−>0 ( c a t a s t r o p h e p o i n t ) if k >10: dx=np. gradient (rr) y2 =np.array(FF )/(2∗∗.5) df=np. gradient (y2 , dx) print df if abs(df[len(df)−1])>10: break # The r e s u l t s p l o t i n g s c r i p t as b e f o r e #. . . .

5

External force explicitly included path (EFEIP) script

#The s y s t e m i n f o r m a t i o n as b e f o r e i n t h e s c r i p t MEP # l o a d HL from ase. constraints import HL #EFEI l o o p : for k in range (1 ,100): # D e f i n e t h e f o r c e c o n s t r a i n u s i n g HL c l a s s ( s e e c l a s s d e t a i l s ) c = HL(a1=i, a2=j, rt =0.0 , k=k/20.) atoms . set_constraint (c) atoms . set_calculator (calc) # Optimization with the force constrain BFGS(atoms , trajectory =’mep%d.traj ’ % k). run(fmax =0.001) pos = atoms. get_positions () r=np.sum (( pos[i]−pos[j ])∗∗2)∗∗0.5 F= atoms. get_forces ( apply_constraint =False) MF=abs(np. linalg .norm(F. reshape ((3∗ len(pos ) ,1)))) EE. append (atoms. get_potential_energy ()); FF. append (MF /(2∗∗.5)) rr. append (r) # S8

if k >25: dx=np. gradient (rr) y =np.array(EE) y2 =np.array(FF )/(2∗∗.5) df=np. gradient (y2 , dx) print df if abs(df[len(df)−1]) 0: return 0.5 ∗ self. spring ∗ d ∗∗2 else: return 0. if self._type == ’two atoms ’: p1 , p2 = positions [self. indices ] elif self._type == ’point ’: p1 = positions [self.index] p2 = self. origin displace = p2 − p1 bondlength = np. linalg .norm( displace ) if bondlength > self. threshold : return self. spring ∗ ( bondlength − self. threshold ) else: return 0. def __repr__ (self ): if self._type == ’two atoms ’: return ’HL(%d, %d)’ % tuple(self. indices ) elif self._type == ’point ’: return ’HL(%d) to cartesian ’ % self.index else: return ’HL(%d) to plane ’ % self.index

S10

7

Trans-1,2-dimethylcyclobutane molecule (RS, mol.xyz)

16 C C H H H C C C C H H H H H H H

8

9.320127 9.531587 8.809684 8.689622 10.298658 8.305697 8.743694 10.039438 11.339405 11.364460 12.206368 11.488093 10.054263 10.163800 7.379014 8.319840

8.329637 9.589085 7.550769 8.517507 7.907203 10.424105 11.524198 10.883709 11.506254 11.667931 10.852231 12.498082 10.735895 9.358385 10.194880 12.543650

10.49861740 9.69799445 9.87666588 11.40369066 10.84171946 9.34802577 9.97068931 10.45382326 10.01286653 8.90597521 10.28548418 10.51108179 11.56829463 8.79730374 8.78009528 10.09260245

Trans-1,2-dimethylcyclobutane molecule (TS, ts.xyz)

16 C C H H H C C C C H H H

9.467137 9.598851 9.136779 8.720661 10.450673 8.537780 9.168115 10.393174 11.679219 11.775248 12.550067 11.771523

8.017845 9.302797 7.192994 8.084944 7.704979 10.215117 11.439931 11.181113 11.874638 12.169878 11.220037 12.807937 S11

10.417329 9.680924 9.726884 11.248400 10.853552 9.439012 9.431892 10.101823 9.826499 8.751483 10.089348 10.448223

H H H H

10.313509 10.423505 7.450638 8.882209

10.808925 9.292809 9.977460 12.381049

S12

11.151817 8.927794 9.412670 8.910740