28 votos

¿Cómo funcionan los paquetes de software Quantum?

Si uno quiere calcular un alcano de tamaño moderado (con digamos 10-15 carbonos , suponiendo 100 electrones , con métodos basados en Hartree Fock restringido) podemos decir simplemente que la parte electrón-electrón será $100^4 = 100$ millones de integrales. Si eliminamos las que no son únicas se convertirá en $\frac{100M}{8}= 12.5 M$ Integrales. Si hacemos una preselección puede llegar a ser de unos 6 millones. Incluso si vamos por DFT será alrededor de $\frac{100^3}{8} =125,000$ .

He calculado un pequeño sistema como el Metano con sólo 10 electrones (alrededor de 400 integrales únicas/precintadas) con un código C++ eficiente (basado en la Integración Rys que está entre los métodos más eficientes) y me llevó alrededor de 1 hora. ¡Cuando 400 ciclos tardan 1 hora puedo suponer que 6 millones de ciclos pueden tardar años! Pero los paquetes de software lo hacen en segundos.

¡¡¡Mi pregunta es que si solo quiero hacer una matemática simple como 2+2 por 6 millones de veces me lleva mucho más tiempo que lo que hacen estos paquetes con integrales tan complicadas!!! ¿Alguien sabe cuál es su truco? ¿Tienen una base de datos precalculada o algún método de aproximación?

ACTUALIZACIÓN: hay muchos buenos consejos en esta pregunta y gracias a todos por ello. Una combinación de simetría, búsqueda de integrales despreciables y uso de métodos optimizados funciona bien. La única parte sin respuesta es un algoritmo para encontrar las situaciones simétricas.

20voto

Dylan Beattie Puntos 23222

Hay muchos trucos. Como no soy desarrollador, no estoy al tanto de todos ellos, pero hay algunas cosas sencillas para empezar.

  • Algunas integrales son previsiblemente cercanas a cero : Incluso en los cálculos de primeras primarias, hay partes del código que eliminan integrales que son claramente despreciables. Esto ahorra mucho trabajo. Consideremos, por ejemplo, las integrales de solapamiento o de Coulomb entre átomos que están muy alejados.
  • Orbitales gaussianos : Utilizando Orbitales de tipo gaussiano son increíblemente rápidas, porque la mayoría de las integrales cuánticas pueden derivarse como simples relaciones de recurrencia . Es decir, casi nunca hay que hacer la integración. Véase, por ejemplo, Obara y Saika y el reciente algoritmo PRISM de Gill y Pople .

Creo que hay algunos desarrolladores cuánticos reales aquí y tal vez estarían dispuestos a compartir otros trucos. Pero estos son grandes - elimina cualquier integral que no necesites, y no tomes las integrales en primer lugar. ;-)

Sí, hay trucos numéricos (usando BLAS, LAPACK, etc.) y el uso del procesamiento multinúcleo. Pero en realidad son optimizaciones menores.

ACTUALIZACIÓN

Me he dado cuenta de que se me ha olvidado hablar de la convergencia del campo autoconsistente que también está optimizado. Hay varias estrategias de convergencia, sobre todo DIIS que ayuda a extrapolar los coeficientes orbitales finales y la densidad electrónica.

10voto

Rob Wells Puntos 361

Para reducir aún más los requisitos de almacenamiento, las integrales pueden calcularse sobre la marcha, empleando diferentes estrategias de almacenamiento en caché. Para algunos métodos, almacenar todas las integrales es sencillamente imposible.

10voto

Kris Erickson Puntos 16204

Lo primero es lo primero, yo revisaría tu código: no hay ninguna razón para que 400 integrales únicas tarden una hora, incluso con la implementación más ingenua. Estás calculando a un ritmo de una integral cada diez segundos. Aunque estoy de acuerdo con todos los comentarios que apuntan a aumentar la paralelización, creo que un código escalar eficiente es más importante. ¿Por qué aumentar el código ineficiente? Considerar las GPUs es toda una bestia, y por los problemas que mis compañeros han expresado al intentar programarlas yo recomendaría evitarlas por el momento.

Lo mejor que puedes hacer es explotar la simetría molecular. Pero atención: esto no lo arreglará todo, porque muchas moléculas interesantes carecen de simetría. Pero para el metano, como has intentado, esto debería ayudar mucho. Por supuesto, esto no es tan sencillo como buscar algún algoritmo, porque dependiendo de tu programa necesitas rotar las orientaciones nucleares para que sean simétricas, o desarrollar rutinas para detectar la simetría de los grupos de puntos, etc. Dicho esto, hay -hasta donde yo sé- dos formas principales de explotar la simetría de grupo de puntos para las integrales. La primera es crear funciones de base adaptadas a la simetría, de modo que tu conjunto de bases sea simétrico, lo que significa que tu función de onda/integrales/matriz de Fock/lo que sea también será simétrica. Ernie Davidson hizo esto en los setenta . Una referencia algo más moderna de Helgaker y Taylor es la siguiente aquí . Daniel Crawford's tutorial de estructura electrónica explora esto también (está realmente bien escrito --- una gran introducción).

La otra forma de hacerlo, y creo que es más popular, es crear integrales únicas de simetría y luego construir una matriz de Fock parcial sólo para ocuparse de la simetrización más tarde. Si ves algo como "generando una lista petite" en la salida de tu programa de estructura electrónica favorito, esto es probablemente lo que está haciendo. Creo que este método permite el cribado integral de forma más eficiente. Dupuis y King lo hizo a finales de los setenta, basándose en un trabajo anterior de Dacre y Elder . Estas son las referencias estándar que encontrará. Es posible que haya algún trabajo más reciente que desconozco. El problema de la simetría de los grupos de puntos se había resuelto efectivamente en 1980.

Por supuesto, muchas moléculas interesantes no tienen simetría que aprovechar, así que la simetría no solucionará todos sus problemas. La igualdad de Schwarz está bien tratada en Teoría de la estructura electrónica molecular (en realidad, más La teoría de la estructura electrónica está bien tratada en ese precioso libro rosa). Si no lo has consultado, hazlo. Creo que responderá a muchas de tus preguntas sobre el funcionamiento de los códigos modernos.

No quiero repetir las otras respuestas (Geoff te dio los documentos que yo también habría sugerido), así que terminaré con dos referencias menos consideradas. En primer lugar, hay un libro impresionante (¡pero diminuto!) llamado Computación paralela en química cuántica que establece los fundamentos para un código eficiente, incluyendo la evaluación integral. No es demasiado difícil de leer, y me pareció bastante interesante el trabajo sobre el MP2 local. Me sorprende que más gente no haya oído hablar de él. El otro sitio que yo visitaría es el de Ed Valeev Paquete LibInt . Es un programador con bastante talento, y se utiliza en muchos paquetes modernos como Psi y MPQC y ORCA, por no decir que es gratuito para que cualquiera pueda descargarlo y utilizarlo. Algunos de mis compañeros de trabajo han jugado con él para su propio código de estructura electrónica "casero", y hablan muy bien de él. El manual de usuario es realmente bastante útil para entender la evaluación integral. También ha escrito varios ejercicios y tutoriales que puede resultarle útil.

6voto

anju Puntos 6

Hay dos cosas aquí:

  1. Problema de química cuántica
  2. Problema de optimización

La química cuántica o la ecuación de Schrodinger se simplifican mediante DFT y algunas otras técnicas:

a) ECP o potenciales de núcleo efectivo y pseudopotenciales: En lugar de resolver para todos los electrones sólo se resuelven los electrones de la capa exterior y se consideran los electrones del núcleo utilizando integrales precalculadas
b) aproximación de ri: Resolución de la identidad, trata el término de dos electrones como un producto de la función orbital de una sola partícula, lo que reduce en gran medida el coste computacional

Y como se mencionó anteriormente hay algunas otras buenas técnicas se utilizan para hacer frente a la parte de la química cuántica.

Problema de optimización: En la optimización, normalmente se utiliza la segunda derivada (matriz hessiana) para encontrar los mínimos o los máximos, pero en el código de química computacional sólo se utiliza la primera derivada o jacobiana, por lo que es muy sensible a la estimación inicial y a la configuración computacional.

El cálculo del hessiano es la operación más costosa del código de química computacional, o bien se utiliza el hessiano aproximado o no se utiliza el hessiano en este tipo de problemas de optimización. Si quieres asegurarte de que tienes la geometría correcta puedes calcular el hessiano con tu geometría optimizada y para la optimización de la geometría todas las frecuencias deben ser positivas y para el estado de transición sólo una frecuencia debe ser negativa, pero verás que cumplir con este requisito es muy exigente.

Además, para reducir el coste computacional, podemos aplicar una condición de contorno periódica. Esto nos permite resolver el problema para una celda unitaria mínima no repetitiva (puntos K irreductibles). Encontrar la simetría es también una parte crucial de este tipo de problemas.

La energía de corte se utiliza para reducir el número de conjuntos de bases considerados. Además, las técnicas de optimización también tienen un gran efecto en el coste computacional, ya que se puede utilizar un algoritmo rápido pero agresivo, pero que puede no ser capaz de encontrar los mínimos o los máximos.

Puedes leer el manual de VASP o TURBOMOLE (disponible gratuitamente en Internet), allí encontrarás algunas buenas técnicas para reducir el coste computacional. Y sobre todo, como se ha mencionado anteriormente, una implementación eficiente de la paralelización puede ayudar a reducir el coste computacional de forma drástica. Otro método potencial es el uso de la GPU, pero todavía está en su fase inicial.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X