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.