mirror of
https://github.com/LCPQ/quantum_package
synced 2024-12-23 04:43:50 +01:00
Added qp_create_guess
This commit is contained in:
parent
e521ea9beb
commit
2a53df423f
141
ocaml/qp_create_guess.ml
Normal file
141
ocaml/qp_create_guess.ml
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
open Qputils
|
||||||
|
open Qptypes
|
||||||
|
open Core.Std
|
||||||
|
|
||||||
|
let run ~multiplicity ezfio_file =
|
||||||
|
if (not (Sys.file_exists_exn ezfio_file)) then
|
||||||
|
failwith ("EZFIO directory "^ezfio_file^" not found");
|
||||||
|
Ezfio.set_file ezfio_file;
|
||||||
|
let d =
|
||||||
|
Input.Determinants_by_hand.read ()
|
||||||
|
in
|
||||||
|
let m =
|
||||||
|
Multiplicity.of_int multiplicity
|
||||||
|
in
|
||||||
|
let ne =
|
||||||
|
Ezfio.get_electrons_elec_alpha_num () +
|
||||||
|
Ezfio.get_electrons_elec_beta_num ()
|
||||||
|
|> Elec_number.of_int
|
||||||
|
in
|
||||||
|
let alpha, beta =
|
||||||
|
let (a,b) =
|
||||||
|
Multiplicity.to_alpha_beta ne m
|
||||||
|
in
|
||||||
|
(Elec_alpha_number.to_int a, Elec_beta_number.to_int b)
|
||||||
|
in
|
||||||
|
let n_open_shells =
|
||||||
|
alpha - beta
|
||||||
|
in
|
||||||
|
let mo_tot_num =
|
||||||
|
Ezfio.get_mo_basis_mo_tot_num ()
|
||||||
|
in
|
||||||
|
let build_list_of_dets ne n_closed n_open =
|
||||||
|
let init =
|
||||||
|
Array.create ~len:n_closed Bit.One
|
||||||
|
|> Array.to_list
|
||||||
|
in
|
||||||
|
let rec set_electron accu = function
|
||||||
|
| 1 -> [ Bit.One :: accu ]
|
||||||
|
| i ->
|
||||||
|
assert (i>1);
|
||||||
|
let rest =
|
||||||
|
set_electron (Bit.Zero :: accu) (i-1)
|
||||||
|
in
|
||||||
|
(Bit.One::accu) :: rest
|
||||||
|
in
|
||||||
|
let rec extend accu = function
|
||||||
|
| 0 -> List.rev accu
|
||||||
|
| i -> extend (Bit.Zero::accu) (i-1)
|
||||||
|
in
|
||||||
|
let rec set_n_electrons accu imax = function
|
||||||
|
| 0 -> []
|
||||||
|
| 1 -> set_electron accu imax
|
||||||
|
| i ->
|
||||||
|
assert (i>1);
|
||||||
|
let l =
|
||||||
|
set_electron accu (imax-1)
|
||||||
|
in
|
||||||
|
List.map ~f:(fun x -> set_n_electrons x (imax-1) (i-1)) l
|
||||||
|
|> List.concat
|
||||||
|
in
|
||||||
|
set_n_electrons init n_open ne
|
||||||
|
|> List.filter ~f:(fun x -> List.length x <= n_closed+n_open)
|
||||||
|
|> List.map ~f:(fun x -> extend x (((mo_tot_num-1)/64+1)*64 - List.length x))
|
||||||
|
in
|
||||||
|
|
||||||
|
let alpha_new =
|
||||||
|
(Elec_number.to_int ne + 1)/2
|
||||||
|
and beta_new =
|
||||||
|
Elec_number.to_int ne/2
|
||||||
|
in
|
||||||
|
let l_alpha =
|
||||||
|
build_list_of_dets ((alpha-beta+1)/2) beta n_open_shells
|
||||||
|
in
|
||||||
|
let l_beta =
|
||||||
|
if alpha_new = beta_new then
|
||||||
|
l_alpha
|
||||||
|
else
|
||||||
|
build_list_of_dets ((alpha-beta)/2)beta n_open_shells
|
||||||
|
in
|
||||||
|
|
||||||
|
let n_int =
|
||||||
|
Bitlist.n_int_of_mo_tot_num mo_tot_num
|
||||||
|
in
|
||||||
|
let determinants =
|
||||||
|
List.map l_alpha ~f:(fun x -> List.map l_beta ~f:(fun y -> (x,y) ))
|
||||||
|
|> List.concat
|
||||||
|
|> List.map ~f:(fun pair -> Determinant.of_bitlist_couple ~n_int
|
||||||
|
~alpha:(Elec_alpha_number.of_int alpha_new)
|
||||||
|
~beta:(Elec_beta_number.of_int beta_new) pair )
|
||||||
|
in
|
||||||
|
let c =
|
||||||
|
Array.create ~len:(List.length determinants) (Det_coef.of_float 1.)
|
||||||
|
in
|
||||||
|
|
||||||
|
determinants
|
||||||
|
|> List.map ~f:(fun x -> Determinant.to_string ~mo_tot_num:(MO_number.of_int mo_tot_num) x)
|
||||||
|
|> List.iter ~f:(fun x -> Printf.printf "%s\n\n%!" x);
|
||||||
|
|
||||||
|
let l =
|
||||||
|
List.length determinants
|
||||||
|
in
|
||||||
|
if l > 0 then
|
||||||
|
begin
|
||||||
|
let d =
|
||||||
|
let s = (Float.of_int (alpha - beta)) *. 0.5 in
|
||||||
|
let open Input.Determinants_by_hand in
|
||||||
|
{ d with n_int ;
|
||||||
|
n_det = Det_number.of_int ~min:1 ~max:l l;
|
||||||
|
expected_s2 = Positive_float.of_float (s *. (s +. 1.)) ;
|
||||||
|
psi_coef = c;
|
||||||
|
psi_det = Array.of_list determinants;
|
||||||
|
}
|
||||||
|
in
|
||||||
|
Input.Determinants_by_hand.write d;
|
||||||
|
Ezfio.set_determinants_read_wf true
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Ezfio.set_determinants_read_wf false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let spec =
|
||||||
|
let open Command.Spec in
|
||||||
|
empty
|
||||||
|
+> flag "m" (required int)
|
||||||
|
~doc:"int Spin multiplicity"
|
||||||
|
+> anon ("ezfio_file" %: string)
|
||||||
|
|
||||||
|
let () =
|
||||||
|
Command.basic
|
||||||
|
~summary: "Quantum Package command"
|
||||||
|
~readme:( fun () -> "
|
||||||
|
Creates an open-shell multiplet initial guess\n\n" )
|
||||||
|
spec
|
||||||
|
(fun multiplicity ezfio_file () ->
|
||||||
|
run ~multiplicity ezfio_file
|
||||||
|
)
|
||||||
|
|> Command.run ~version: Git.sha1 ~build_info: Git.message
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -587,6 +587,7 @@ end subroutine
|
|||||||
N_ex_exists = 0
|
N_ex_exists = 0
|
||||||
|
|
||||||
n = 0
|
n = 0
|
||||||
|
!TODO Openmp
|
||||||
do i=1, N_det_ref
|
do i=1, N_det_ref
|
||||||
do l=1, N_det_non_ref
|
do l=1, N_det_non_ref
|
||||||
call get_excitation(psi_ref(1,1,i), psi_non_ref(1,1,l), exc, degree, phase, N_int)
|
call get_excitation(psi_ref(1,1,i), psi_non_ref(1,1,l), exc, degree, phase, N_int)
|
||||||
|
Loading…
Reference in New Issue
Block a user