Fijar el ángulo de unión a un valor determinado parece una solución extrema a este problema.
Lo es. Para ser sinceros, fijar los parámetros en un cálculo es casi siempre no solución en absoluto. La geometría resultante tiene poco o ningún significado y todas las propiedades derivadas son para un caso puramente hipotético. Si la geometría localizada no es un punto estacionario, ¿qué significa eso? Una solución errónea es peor que ninguna solución. Hay que tener mucho cuidado con lo que se fija y cuándo se fija, y siempre hay que confirmar lo que se ha encontrado con una optimización completa y un cálculo de la frecuencia. (En varios niveles de la teoría).
Creo que el consejo de Greg también es muy importante. La simetría puede ser una herramienta muy poderosa si se utiliza correctamente, pero hay que asegurarse de que la simetría implícita es correcta. También hay que comprobar si su metodología se ajusta al sistema que está calculando.
Dicho esto, no cabe duda de que hay algunos usos muy productivos para las optimizaciones parciales:
- encontrar mínimos locales más altos o inusuales
- exploración de la superficie de energía potencial
- modificación de las geometrías convergentes
- fijación de los modos de transición
- etc.
Hay algunas posibilidades de cómo hacer optimizaciones parciales en gaussian. Todas tienen algunas advertencias y todas pueden conducir a resultados no deseados. Ciertamente hay restricciones para todas ellas. Voy a dar una breve visión general de los más comunes con algunos ejemplos prácticos.
Ya se ha dado cuenta de que fijar un ángulo de unión de 180 grados es un reto. Esto se debe al hecho de que es un requisito tener variables linealmente independientes, lo que simplemente no es posible con tres puntos en una línea. Sin embargo, hay ciertas formas de evitar el problema. Alerta de spoiler: Sólo es posible con matrices z o simetría muy rígida (donde se fija la simetría, no el ángulo de enlace).
Optimizaciones parciales con matrices z
Empecemos con algo muy sencillo. Una optimización completa del metanol sin restricciones de simetría.
%chk=bp86svp.chk
#p BP86/def2SVP/W06
DenFit
opt
int(ultrafinegrid)
sym(none)
title card required
0 1
c
h 1 hc2
h 1 hc3 2 hch3
h 1 hc4 2 hch4 3 dih4
o 1 oc5 2 och5 3 dih5
h 5 ho6 1 hoc6 2 dih6
hc2 1.1
hc3 1.1
hch3 109.5
hc4 1.1
hch4 109.5
dih4 120.0
oc5 1.4
och5 109.5
dih5 -120.0
ho6 0.9
hoc6 109.5
dih6 180.0
El resultado será la siguiente geometría optimizada:
c
o 1 oc2
h 1 hc3 2 hco3
h 1 hc4 2 hco4 3 dih4
h 1 hc5 2 hco5 4 dih5
h 2 ho6 1 hoc6 3 dih6
oc2 1.414851
hc3 1.109697
hco3 107.476
hc4 1.118853
hco4 113.586
dih4 -118.329
hc5 1.118853
hco5 113.586
dih5 -123.342
ho6 0.974680
hoc6 107.408
dih6 179.999
Fijar un ángulo en una matriz z es sencillo. Hay que especificar que se está haciendo una optimización parcial ( popt
) y mover el parámetro fijo a la sección de constantes. Como ejemplo, estoy fijando el ángulo COH, y también invocar la simetría.
%chk=bp86svp.chk
#p BP86/def2SVP/W06
DenFit
popt
int(ultrafinegrid)
title card required
0 1
c
h 1 hc2
h 1 hc3 2 hch3
h 1 hc3 2 hch3 3 dih4
o 1 oc5 2 och5 3 dih5
h 5 ho6 1 coh 2 dih6
Variables:
hc2 1.100000
hc3 1.100000
hch3 109.5
dih4 120.000
oc5 1.400000
och5 109.5
dih5 -120.000
ho6 0.900000
dih6 180.000
Constants:
coh 90.0
Esto le dará la siguiente lista de parámetros optimizados:
hc2 1.1104
hc3 1.1173
hch3 107.0973
dih4 116.0195
oc5 1.4471
och5 108.92
dih5 -121.9694
ho6 0.9796
dih6 180.0092
coh 90.0
Ahora intentaremos lo mismo, pero haremos que el ángulo de unión sea de 180 grados. Aquí tenemos que introducir átomos ficticios:
%chk=bp86svp.chk
#p BP86/def2SVP/W06
DenFit
popt
int(ultrafinegrid)
title card required
0 1
c
h 1 hc2
h 1 hc3 2 hch3
h 1 hc3 2 hch3 3 dih4
o 1 oc5 2 och5 3 dih5
xx 5 xxo6 1 xxoc6 2 dih6
h 5 ho7 6 xxoc6 1 dih7
Variables
hc2 1.100000
hc3 1.100000
hch3 109.500
dih4 120.000
oc5 1.400000
och5 109.500
dih5 -120.000
dih6 180.000
ho7 0.950000
Constants
xxo6 1.000000
xxoc6 90.000
dih7 180.000
Lo que le dará de nuevo el siguiente conjunto de parámetros:
hc2 1.1209
hc3 1.1211
hch3 106.3981
dih4 113.09
oc5 1.3644
och5 112.3772
dih5 -123.4351
dih6 180.0
ho7 0.9465
xxo6 1.0
xxoc6 90.0
dih7 180.0
Y las siguientes coordenadas cartesianas:
6
scf done: -115.581115
C 0.000000 0.000000 0.000000
H 0.000000 0.000000 1.120932
H 1.075500 0.000000 -0.316498
H -0.421786 -0.989342 -0.316498
O -0.695163 1.052866 -0.519431
H -1.177401 1.783245 -0.879763
Fijación rápida y sucia con coordenadas cartesianas
Añadiendo -1
a un elemento de una fila en el bloque de coordenadas cartesianas lo arreglará. Este es un enfoque muy rápido y sucio, que puede llevar a un cálculo de fuerza bruta. Básicamente estás restringiendo el algoritmo para rotar la molécula, lo que lleva a cálculos menos efectivos. Fijar las coordenadas cartesianas también fija la longitud del enlace, pero es la única manera de forzar un ángulo de 180 grados con esta elección de entrada. Aquí hay un ejemplo de entrada:
%chk=bp86svp.chk
#p BP86/def2SVP/W06
DenFit
popt
int(ultrafinegrid)
symm(loose)
title card required
0 1
C -1 0.000000 0.000000 0.000000
H 0.000000 0.000000 1.300000
H 1.221600 0.000000 -0.444626
H -0.479083 -1.123738 -0.444626
O -1 -0.695162 1.052869 -0.519426
H -1 -1.177400 1.783250 -0.879755
El resultado será la siguiente geometría optimizada:
6
scf done: -115.581115
C -0.663620 -0.000005 0.000000
H -1.090591 0.003267 -1.036538
H -1.090556 0.896080 0.521076
H -1.090648 -0.899281 0.515456
O 0.700780 -0.000004 0.000001
H 1.647272 -0.000004 0.000001
Tenga en cuenta que este cálculo tarda unas cinco veces más.
Fijación de parámetros con modredundant
Esta opción se describe de forma bastante sencilla en el Manual en línea de Gaussian . Pero hagamos un ejemplo en el que intentemos restringir el ángulo COH a 90 grados.
%chk=bp86svp.chk
#p BP86/def2SVP/W06
DenFit
opt(modredundant)
int(ultrafinegrid)
title card required
0 1
C 0.000000 0.000000 0.000000
O -0.659966 1.143095 -0.466667
H -0.000000 0.000000 1.089000
H 1.026720 0.000002 -0.362997
H -0.513360 -0.889165 -0.363000
H -0.502133 0.869719 -1.359507
A 5 6 1 F
Con esta opción es imposible fijar el ángulo a 180 grados, ya que éste no es un valor permitido. Tampoco puede utilizar átomos ficticios, ya que éstos no existen en el sistema de coordenadas redundante. Puede ser una buena idea, matar esta variable completamente, para asegurar que el programa no fallará tratando de construirla, o cuando una optimización se acerque a ese valor.
También se puede restringir el ángulo mediante una curva lineal. Esta es la mejor opción, si se sabe que el ángulo es de 180,0 grados.
%chk=bp86svp.chk
#p BP86/def2SVP/W06
DenFit
opt(Modredundant)
int(ultrafinegrid)
sym(none)
title card required
0 1
C 0.000000000 0.000000000 0.736983516
H 1.037151577 0.000000000 1.103476471
H -0.518575789 -0.898199613 1.103476471
H -0.518575789 0.898199613 1.103476471
O 0.000000000 0.000000000 -0.663016475
H 0.000000000 0.000000000 -1.563016262
L 1 5 6 2 F
La última línea congela el ángulo lineal entre los átomos 1, 5 y 6. Es necesario especificar el átomo 2 para determinar el plano en el que se encuentra la curva lineal, o es ortogonal a ella.
Fijación de ángulos lineales con coordenadas internas generales (GIC)
Con Gaussian 16 se introdujo una nueva forma de manejar el sistema de coordenadas: coordenadas internas generalizadas . En muchos aspectos es superior a las versiones anteriores, pero también es un poco más difícil de aprender. No obstante, merece la pena probarlo.
Este es un ejemplo de entrada de oxoketeno $\ce{O=C=C=O}$ . En este caso he especificado el conjunto completo de coordenadas necesarias.
#p PM6
opt geom(AddGIC)
scf(xqc,MaxCycle=250)
int(ultrafinegrid)
symmetry(none)
Oxoketene (constrained)
0 1
O 0.000000000 0.000000000 -2.210000000
C 0.000000000 0.000000000 -0.770000000
C 0.000000000 0.000000000 0.770000000
O 0.000000000 0.000000000 2.210000000
BondC1O1(Active)=R(2,1)
BondC2O2(Active)=R(3,4)
BondC1C2(Active)=R(2,3)
LinBend1O1C1C2(Freeze)=L(1,2,3,0,-1)
LinBend2O1C1C2(Freeze)=L(1,2,3,0,-2)
LinBend1C1C2O2(Freeze)=L(2,3,4,0,-1)
LinBend2C1C2O2(Freeze)=L(2,3,4,0,-2)
El formato es
L( i, j, k, l, M)
L(Atom 1, Atom 2, Atom 3, <Atom 4 | Orthogonal to Plane>, component)
Por lo tanto, la curva lineal se define entre i
, j
, k
como Atom 1
, Atom 2
, Atom 3
y no deben ser átomos ficticios (y con GIC éstos ya casi no son necesarios). El cuarto valor l
puede ser otro átomo para determinar la ortogonalidad/plano a, o puede definirse como un plano donde l = 0, -1, -2, -3
de pie para el automático, $yz$ , $xz$ , $xy$ respectivamente. El último valor M
da el componente, de los cuales dos son necesarios, y debe ser M = -1, -2
.
El ejemplo del metanol es el siguiente:
#p PM6
DenFit
opt(AddGIC)
int(ultrafinegrid)
sym(none)
title card required
0 1
C 0.000000000 0.000000000 0.736983516
H 1.037151577 0.000000000 1.103476471
H -0.518575789 -0.898199613 1.103476471
H -0.518575789 0.898199613 1.103476471
O 0.000000000 0.000000000 -0.663016475
H 0.000000000 0.000000000 -1.563016262
L(1, 5, 6, 2, -1) Freeze
L(1, 5, 6, 2, -2) Freeze