10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-12-22 04:13:33 +01:00

Improved Huckel guess

This commit is contained in:
Anthony Scemama 2019-03-05 00:39:23 +01:00
parent 0f2285b557
commit c9c039c2fe
2 changed files with 20 additions and 18 deletions

View File

@ -153,13 +153,12 @@ let fci_of_mo_basis ?(frozen_core=true) mo_basis =
let n_det_beta = Array.length det_beta in
let n_det_alfa = Array.length det_alfa in
(*
let ndet = n_det_alfa * n_det_beta in
Format.printf "Number of determinants : %d %d %d\n%!"
n_det_alfa n_det_beta ndet;
Spin (det_alfa, det_beta)
*)
(*
let det = Array.make n_det_alfa
(Array.init n_det_beta (fun i -> i))
in
@ -171,6 +170,7 @@ let fci_of_mo_basis ?(frozen_core=true) mo_basis =
Arbitrary {
det_alfa ; det_beta ; det ; index_start
}
*)
in
{ n_alfa ; n_beta ; mo_class ; mo_basis ; determinants }

View File

@ -21,29 +21,31 @@ let hcore_guess ao_basis =
let huckel_guess ao_basis =
let c = 0.5 *. 1.75 in
let ao_num = Ao.basis ao_basis |> Basis.size in
let eN_ints = Ao.eN_ints ao_basis |> NucInt.matrix
and kin_ints = Ao.kin_ints ao_basis |> KinInt.matrix
and overlap = Ao.overlap ao_basis |> Ov.matrix
and m_X = Ao.ortho ao_basis
in
let diag = Array.init (ao_num+1) (fun i -> if i=0 then 0. else
eN_ints.{i,i} +. kin_ints.{i,i})
let m_F =
Mat.add eN_ints kin_ints
in
let ao_num = Ao.basis ao_basis |> Basis.size
and overlap = Ao.overlap ao_basis |> Ov.matrix
in
let diag = Vec.init ao_num (fun i ->
m_F.{i,i} )
in
function
| 0 -> invalid_arg "Huckel guess needs a non-zero number of occupied MOs."
| nocc ->
let density = gemm ~alpha:2. ~transb:`T ~k:nocc m_X m_X in
let f = Fock.make_rhf ~density ao_basis in
let m_F = Fock.fock f in
for j=1 to ao_num do
for i=1 to ao_num do
if (i <> j) then
m_F.{i,j} <- c *. overlap.{i,j} *. (diag.(i) +. diag.(j)) (*TODO Pseudo *)
done;
done;
m_F
| nocc ->
Mat.init_cols ao_num ao_num (fun i j ->
if (i<>j) then
if (diag.{i} +. diag.{j}) < 5. then
c *. overlap.{i,j} *. (diag.{i} +. diag.{j}) +. m_F.{i,j} (*TODO Pseudo *)
else
m_F.{i,j} (*TODO Pseudo *)
else
diag.{i}
)
let make ?(nocc=0) ~guess ao_basis =