7 votos

¿Cómo hacer Lowdin orthonormalisation simétrico?

Löwdin simétrica orthonormalisation parece ser una práctica común en la química cuántica. Yo vengo de un fondo diferente y aunque tiene que entender y posiblemente implementar en un ordenador de código. Aquí está la definición de la transformación;

$$ |{\phi'}\rangle = S^{-1/2}|\phi\rangle, $$

donde $S$ es la superposición de la matriz entre el no-ortogonal de base,

$$ S = \left< \phi|\phi \right> . $$

  1. Mi primera pregunta es cómo obtener el $S^{-1/2}$ analíticamente?

  2. Existen algoritmos paralelos disponibles para calcular numéricamente?

11voto

AnxiousReseter Puntos 23

Usted obtener la diagonalización de $S$ como se define $$ S = U \cdot s \cdot U^{\daga} $$ (que vale para el caso de los simétrica $S$, la cual es) y aplicar la energía necesaria $$ S^{-\frac{1}{2}} = U \cdot s^{-\frac{1}{2}} \cdot U^{\daga} $$

Para más antecedentes, trate de la aplicación de la sección del artículo de Wikipedia sobre diagonalizable matrices. Tan lejos como la comprensión de que va, me temo que no mucho más allá de hacer algunos cálculos del modelo en 2D o 3D vectores se puede hacer.

No tengo una gran experiencia en computación paralela, pero todas las operaciones involucradas son bien conocidos y su álgebra lineal marco (BLAS, ¿alguien?) se documentan cómo ejecutar cualquiera de este en paralelo y de almacenamiento que pueden ser necesarios para la misma. Tenga en cuenta que, normalmente, diagonalización no es el más caro, el paso de un auto-consistente campo de cálculo (Hartree-Fock o DFT) de todos modos, por lo que la paralelización puede no ser crítico para este paso.

9voto

Adam Haile Puntos 12576

Su primera pregunta ya ha sido contestada, pero en palabras: para encontrar $f(A)$ para algunos matriz $A$, diagonalize para obtener los autovalores $a$ y vectores propios $U$, se aplican $f$ a la diagonalized de la matriz (autovalores), luego de vuelta-transformar $f(a)$ el uso de los vectores propios a la original no diagonal de la base.

Para la segunda pregunta, sí. La mayoría giran en torno a llamar a la LAPACK rutina dsyev (real de doble precisión simétrica eigen descomposición) o sus variantes, ssyev real de simple precisión, {c,z}heev para el complejo de simple y doble precisión Hermitian de descomposición. La gran mayoría de la química cuántica utiliza la totalidad de los coeficientes reales y de doble precisión.

Supongamos que ya han calcular la superposición de la matriz $S$ por algún método, normalmente llamando a un programa integral de motor. Aquí es un ejemplo de implementación en Python usando NumPy:

print("Overlap matrix")
print(S)

lam_s, l_s = np.linalg.eigh(S)
lam_s = lam_s * np.eye(len(lam_s))
lam_sqrt_inv = np.sqrt(np.linalg.inv(lam_s))
symm_orthog = np.dot(l_s, np.dot(lam_sqrt_inv, l_s.T))

print("Symmetric orthogonalization matrix")
print(symm_orthog)

A partir de la documentación de numpy.linalg.eigh:

Los autovalores/vectores propios son calculados usando las rutinas de LAPACK _syevd, _heevd

Aquí es un ejemplo de implementación en C++ utilizando el Armadillo:

S.print("Overlap matrix");

arma::vec lam_s_vec;
arma::mat l_s;
arma::eig_sym(lam_s_vec, l_s, S);
arma::mat lam_s_mat = arma::diagmat(lam_s_vec);
arma::mat lam_sqrt_inv = arma::sqrt(arma::inv(lam_s_mat));
arma::mat symm_orthog = l_s * lam_sqrt_inv * l_s.t();

symm_orthog.print("Symmetric orthogonalization matrix");

Ambos ejemplos se pueden encontrar aquí; compruebe el Makefile de cómo ejecutar.

En el Armadillo árbol del código fuente de los archivos include/armadillo_bits/{def,wrapper}_lapack.hpp contienen más información acerca de las rutinas de LAPACK son llamados para que tipos.

Con respecto a la paralelización, tu BLAS + LAPACK aplicación (MKL, OpenBLAS, ATLAS, ...) es más probable rosca y puede ser controlado por <something>_NUM_THREADS=4, donde <something> podría ser OMP, MKL, OpenBLAS, o posiblemente algo más, pero usted debe comprobar la documentación. Esto significa que el tiempo que su entorno está configurado correctamente, matemáticas llamadas a la biblioteca con NumPy o C++ plantilla de las bibliotecas como el Armadillo o Eigen se ejecutará en paralelo sin necesidad explícita de OpenMP anotaciones o MPI código. Distribuida de la paralelización (MPI), hay ScaLAPACK, que comparte una interfaz similar a regular LAPACK.

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