10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-07-11 13:53:36 +02:00
QCaml/SCF/Fock.ml

114 lines
2.9 KiB
OCaml
Raw Normal View History

2018-02-23 18:44:31 +01:00
open Lacaml.D
open Simulation
2018-03-13 18:24:00 +01:00
open Constants
2018-06-27 13:13:59 +02:00
open Util
2018-02-23 18:44:31 +01:00
2018-03-26 16:47:08 +02:00
2018-05-30 18:07:05 +02:00
type t =
{
fock : Mat.t ;
core : Mat.t ;
coulomb : Mat.t ;
exchange : Mat.t ;
}
2018-02-23 18:44:31 +01:00
2018-06-13 17:49:58 +02:00
module Ao = AOBasis
2018-06-29 16:04:40 +02:00
2018-06-13 17:49:58 +02:00
let make ~density ao_basis =
2018-02-23 18:44:31 +01:00
let m_P = density
2018-06-13 19:03:42 +02:00
and m_T = Lazy.force ao_basis.Ao.kin_ints |> KinInt.matrix
and m_V = Lazy.force ao_basis.Ao.eN_ints |> NucInt.matrix
and m_G = Lazy.force ao_basis.Ao.ee_ints
2018-02-23 18:44:31 +01:00
in
let nBas = Mat.dim1 m_T
in
2018-05-30 18:07:05 +02:00
let m_Hc = Mat.add m_T m_V
2018-05-31 18:50:34 +02:00
and m_J = Array.make_matrix nBas nBas 0.
and m_K = Array.make_matrix nBas nBas 0.
2018-05-30 18:07:05 +02:00
in
2018-07-04 18:08:38 +02:00
(*
2018-06-29 16:04:40 +02:00
let permutations i j k l =
2018-07-04 18:08:38 +02:00
[ [ i ; j ; k ; l ] ;
[ k ; j ; i ; l ] ;
[ i ; l ; k ; j ] ;
[ k ; l ; i ; j ] ;
[ j ; i ; l ; k ] ;
[ j ; k ; l ; i ] ;
[ l ; i ; j ; k ] ;
[ l ; k ; j ; i ]
]
2018-06-29 16:04:40 +02:00
in
ERI.to_stream m_G
|> Stream.iter (fun { ERI.i_r1 ; j_r2 ; k_r1 ; l_r2 ; value } ->
permutations i_r1 j_r2 k_r1 l_r2
|> List.iter ( fun ijkl ->
2018-07-04 18:08:38 +02:00
match ijkl with
| mu :: lambda :: nu :: sigma :: [] ->
let p = m_P.{lambda,sigma} in
if abs_float p > epsilon then
let m_Jnu = m_J.(nu-1) in
m_Jnu.(mu-1) <- m_Jnu.(mu-1) +. p *. value
| _ -> assert false
));
*)
2018-02-23 18:44:31 +01:00
for sigma = 1 to nBas do
for nu = 1 to nBas do
2018-05-31 18:50:34 +02:00
let m_Jnu = m_J.(nu-1) in
2018-06-28 14:43:24 +02:00
for lambda = 1 to sigma do
let p =
if lambda < sigma then
2. *. m_P.{lambda,sigma}
else
m_P.{lambda,sigma}
in
2018-03-13 18:24:00 +01:00
if abs_float p > epsilon then
for mu = 1 to nu do
2018-05-31 18:50:34 +02:00
m_Jnu.(mu-1) <- m_Jnu.(mu-1) +. p *.
2018-05-30 18:07:05 +02:00
ERI.get_phys m_G mu lambda nu sigma
done
done
done
done;
2018-06-29 16:04:40 +02:00
for nu = 1 to nBas do
for mu = 1 to nu-1 do
m_J.(mu-1).(nu-1) <- m_J.(nu-1).(mu-1);
done
done;
2018-05-30 18:07:05 +02:00
for nu = 1 to nBas do
2018-05-31 18:50:34 +02:00
let m_Knu = m_K.(nu-1) in
2018-05-30 18:07:05 +02:00
for sigma = 1 to nBas do
for lambda = 1 to nBas do
2018-06-28 14:43:24 +02:00
let p =
0.5 *. m_P.{lambda,sigma}
in
2018-05-30 18:07:05 +02:00
if abs_float p > epsilon then
for mu = 1 to nu do
2018-06-28 14:43:24 +02:00
m_Knu.(mu-1) <- m_Knu.(mu-1) -. p *.
2018-05-30 18:07:05 +02:00
ERI.get_phys m_G mu lambda sigma nu
2018-03-13 18:24:00 +01:00
done
2018-02-23 18:44:31 +01:00
done
2018-06-29 16:04:40 +02:00
done;
2018-05-31 18:50:34 +02:00
for mu = 1 to nu-1 do
2018-06-29 16:04:40 +02:00
m_K.(mu-1).(nu-1) <- m_Knu.(mu-1);
2018-02-23 18:44:31 +01:00
done
done;
2018-05-31 18:50:34 +02:00
let m_J = Mat.of_array m_J
and m_K = Mat.of_array m_K
in
2018-06-27 13:13:59 +02:00
{ fock = Mat.add m_Hc (Mat.add m_J m_K) ;
2018-05-30 18:07:05 +02:00
core = m_Hc ; coulomb = m_J ; exchange = m_K }
2018-02-23 18:44:31 +01:00
2018-06-27 13:13:59 +02:00
let pp_fock ppf a =
Format.fprintf ppf "@[<2>";
Format.fprintf ppf "@[ Fock matrix:@[<2>@[%a@]@.]@]" pp_matrix a.fock;
Format.fprintf ppf "@[ Core Hamiltonian:@[<2>@[%a@]@.]@]" pp_matrix a.core;
Format.fprintf ppf "@[ Coulomb matrix:@[<2>@[%a@]@.]@]" pp_matrix a.coulomb;
Format.fprintf ppf "@[ Exchange matrix:@[<2>@[%a@]@.]@]" pp_matrix a.exchange;
Format.fprintf ppf "@]"