mirror of
https://github.com/QuantumPackage/qp2.git
synced 2024-11-19 20:42:36 +01:00
351 lines
10 KiB
OCaml
351 lines
10 KiB
OCaml
(* =~=~ *)
|
|
(* Init *)
|
|
(* =~=~ *)
|
|
|
|
open Qptypes;;
|
|
open Qputils;;
|
|
open Sexplib.Std;;
|
|
|
|
module Tc_h_clean : sig
|
|
(* Generate type *)
|
|
type t =
|
|
{
|
|
read_rl_eigv : bool;
|
|
comp_left_eigv : bool;
|
|
three_body_h_tc : bool;
|
|
pure_three_body_h_tc : bool;
|
|
double_normal_ord : bool;
|
|
core_tc_op : bool;
|
|
full_tc_h_solver : bool;
|
|
thresh_it_dav : Threshold.t;
|
|
max_it_dav : int;
|
|
thresh_psi_r : Threshold.t;
|
|
thresh_psi_r_norm : bool;
|
|
} [@@deriving sexp]
|
|
;;
|
|
val read : unit -> t option
|
|
val write : t-> unit
|
|
val to_string : t -> string
|
|
val to_rst : t -> Rst_string.t
|
|
val of_rst : Rst_string.t -> t option
|
|
end = struct
|
|
(* Generate type *)
|
|
type t =
|
|
{
|
|
read_rl_eigv : bool;
|
|
comp_left_eigv : bool;
|
|
three_body_h_tc : bool;
|
|
pure_three_body_h_tc : bool;
|
|
double_normal_ord : bool;
|
|
core_tc_op : bool;
|
|
full_tc_h_solver : bool;
|
|
thresh_it_dav : Threshold.t;
|
|
max_it_dav : int;
|
|
thresh_psi_r : Threshold.t;
|
|
thresh_psi_r_norm : bool;
|
|
} [@@deriving sexp]
|
|
;;
|
|
|
|
let get_default = Qpackage.get_ezfio_default "tc_h_clean";;
|
|
|
|
(* =~=~=~=~=~=~==~=~=~=~=~=~ *)
|
|
(* Generate Special Function *)
|
|
(* =~=~=~==~=~~=~=~=~=~=~=~=~ *)
|
|
|
|
(* Read snippet for comp_left_eigv *)
|
|
let read_comp_left_eigv () =
|
|
if not (Ezfio.has_tc_h_clean_comp_left_eigv ()) then
|
|
get_default "comp_left_eigv"
|
|
|> bool_of_string
|
|
|> Ezfio.set_tc_h_clean_comp_left_eigv
|
|
;
|
|
Ezfio.get_tc_h_clean_comp_left_eigv ()
|
|
;;
|
|
(* Write snippet for comp_left_eigv *)
|
|
let write_comp_left_eigv =
|
|
Ezfio.set_tc_h_clean_comp_left_eigv
|
|
;;
|
|
|
|
(* Read snippet for core_tc_op *)
|
|
let read_core_tc_op () =
|
|
if not (Ezfio.has_tc_h_clean_core_tc_op ()) then
|
|
get_default "core_tc_op"
|
|
|> bool_of_string
|
|
|> Ezfio.set_tc_h_clean_core_tc_op
|
|
;
|
|
Ezfio.get_tc_h_clean_core_tc_op ()
|
|
;;
|
|
(* Write snippet for core_tc_op *)
|
|
let write_core_tc_op =
|
|
Ezfio.set_tc_h_clean_core_tc_op
|
|
;;
|
|
|
|
(* Read snippet for double_normal_ord *)
|
|
let read_double_normal_ord () =
|
|
if not (Ezfio.has_tc_h_clean_double_normal_ord ()) then
|
|
get_default "double_normal_ord"
|
|
|> bool_of_string
|
|
|> Ezfio.set_tc_h_clean_double_normal_ord
|
|
;
|
|
Ezfio.get_tc_h_clean_double_normal_ord ()
|
|
;;
|
|
(* Write snippet for double_normal_ord *)
|
|
let write_double_normal_ord =
|
|
Ezfio.set_tc_h_clean_double_normal_ord
|
|
;;
|
|
|
|
(* Read snippet for full_tc_h_solver *)
|
|
let read_full_tc_h_solver () =
|
|
if not (Ezfio.has_tc_h_clean_full_tc_h_solver ()) then
|
|
get_default "full_tc_h_solver"
|
|
|> bool_of_string
|
|
|> Ezfio.set_tc_h_clean_full_tc_h_solver
|
|
;
|
|
Ezfio.get_tc_h_clean_full_tc_h_solver ()
|
|
;;
|
|
(* Write snippet for full_tc_h_solver *)
|
|
let write_full_tc_h_solver =
|
|
Ezfio.set_tc_h_clean_full_tc_h_solver
|
|
;;
|
|
|
|
(* Read snippet for max_it_dav *)
|
|
let read_max_it_dav () =
|
|
if not (Ezfio.has_tc_h_clean_max_it_dav ()) then
|
|
get_default "max_it_dav"
|
|
|> int_of_string
|
|
|> Ezfio.set_tc_h_clean_max_it_dav
|
|
;
|
|
Ezfio.get_tc_h_clean_max_it_dav ()
|
|
;;
|
|
(* Write snippet for max_it_dav *)
|
|
let write_max_it_dav =
|
|
Ezfio.set_tc_h_clean_max_it_dav
|
|
;;
|
|
|
|
(* Read snippet for pure_three_body_h_tc *)
|
|
let read_pure_three_body_h_tc () =
|
|
if not (Ezfio.has_tc_h_clean_pure_three_body_h_tc ()) then
|
|
get_default "pure_three_body_h_tc"
|
|
|> bool_of_string
|
|
|> Ezfio.set_tc_h_clean_pure_three_body_h_tc
|
|
;
|
|
Ezfio.get_tc_h_clean_pure_three_body_h_tc ()
|
|
;;
|
|
(* Write snippet for pure_three_body_h_tc *)
|
|
let write_pure_three_body_h_tc =
|
|
Ezfio.set_tc_h_clean_pure_three_body_h_tc
|
|
;;
|
|
|
|
(* Read snippet for read_rl_eigv *)
|
|
let read_read_rl_eigv () =
|
|
if not (Ezfio.has_tc_h_clean_read_rl_eigv ()) then
|
|
get_default "read_rl_eigv"
|
|
|> bool_of_string
|
|
|> Ezfio.set_tc_h_clean_read_rl_eigv
|
|
;
|
|
Ezfio.get_tc_h_clean_read_rl_eigv ()
|
|
;;
|
|
(* Write snippet for read_rl_eigv *)
|
|
let write_read_rl_eigv =
|
|
Ezfio.set_tc_h_clean_read_rl_eigv
|
|
;;
|
|
|
|
(* Read snippet for three_body_h_tc *)
|
|
let read_three_body_h_tc () =
|
|
if not (Ezfio.has_tc_h_clean_three_body_h_tc ()) then
|
|
get_default "three_body_h_tc"
|
|
|> bool_of_string
|
|
|> Ezfio.set_tc_h_clean_three_body_h_tc
|
|
;
|
|
Ezfio.get_tc_h_clean_three_body_h_tc ()
|
|
;;
|
|
(* Write snippet for three_body_h_tc *)
|
|
let write_three_body_h_tc =
|
|
Ezfio.set_tc_h_clean_three_body_h_tc
|
|
;;
|
|
|
|
(* Read snippet for thresh_it_dav *)
|
|
let read_thresh_it_dav () =
|
|
if not (Ezfio.has_tc_h_clean_thresh_it_dav ()) then
|
|
get_default "thresh_it_dav"
|
|
|> float_of_string
|
|
|> Ezfio.set_tc_h_clean_thresh_it_dav
|
|
;
|
|
Ezfio.get_tc_h_clean_thresh_it_dav ()
|
|
|> Threshold.of_float
|
|
;;
|
|
(* Write snippet for thresh_it_dav *)
|
|
let write_thresh_it_dav var =
|
|
Threshold.to_float var
|
|
|> Ezfio.set_tc_h_clean_thresh_it_dav
|
|
;;
|
|
|
|
(* Read snippet for thresh_psi_r *)
|
|
let read_thresh_psi_r () =
|
|
if not (Ezfio.has_tc_h_clean_thresh_psi_r ()) then
|
|
get_default "thresh_psi_r"
|
|
|> float_of_string
|
|
|> Ezfio.set_tc_h_clean_thresh_psi_r
|
|
;
|
|
Ezfio.get_tc_h_clean_thresh_psi_r ()
|
|
|> Threshold.of_float
|
|
;;
|
|
(* Write snippet for thresh_psi_r *)
|
|
let write_thresh_psi_r var =
|
|
Threshold.to_float var
|
|
|> Ezfio.set_tc_h_clean_thresh_psi_r
|
|
;;
|
|
|
|
(* Read snippet for thresh_psi_r_norm *)
|
|
let read_thresh_psi_r_norm () =
|
|
if not (Ezfio.has_tc_h_clean_thresh_psi_r_norm ()) then
|
|
get_default "thresh_psi_r_norm"
|
|
|> bool_of_string
|
|
|> Ezfio.set_tc_h_clean_thresh_psi_r_norm
|
|
;
|
|
Ezfio.get_tc_h_clean_thresh_psi_r_norm ()
|
|
;;
|
|
(* Write snippet for thresh_psi_r_norm *)
|
|
let write_thresh_psi_r_norm =
|
|
Ezfio.set_tc_h_clean_thresh_psi_r_norm
|
|
;;
|
|
|
|
(* =~=~=~=~=~=~=~=~=~=~=~=~ *)
|
|
(* Generate Global Function *)
|
|
(* =~=~=~=~=~=~=~=~=~=~=~=~ *)
|
|
|
|
(* Read all *)
|
|
let read() =
|
|
Some
|
|
{
|
|
read_rl_eigv = read_read_rl_eigv ();
|
|
comp_left_eigv = read_comp_left_eigv ();
|
|
three_body_h_tc = read_three_body_h_tc ();
|
|
pure_three_body_h_tc = read_pure_three_body_h_tc ();
|
|
double_normal_ord = read_double_normal_ord ();
|
|
core_tc_op = read_core_tc_op ();
|
|
full_tc_h_solver = read_full_tc_h_solver ();
|
|
thresh_it_dav = read_thresh_it_dav ();
|
|
max_it_dav = read_max_it_dav ();
|
|
thresh_psi_r = read_thresh_psi_r ();
|
|
thresh_psi_r_norm = read_thresh_psi_r_norm ();
|
|
}
|
|
;;
|
|
(* Write all *)
|
|
let write{
|
|
read_rl_eigv;
|
|
comp_left_eigv;
|
|
three_body_h_tc;
|
|
pure_three_body_h_tc;
|
|
double_normal_ord;
|
|
core_tc_op;
|
|
full_tc_h_solver;
|
|
thresh_it_dav;
|
|
max_it_dav;
|
|
thresh_psi_r;
|
|
thresh_psi_r_norm;
|
|
} =
|
|
write_read_rl_eigv read_rl_eigv;
|
|
write_comp_left_eigv comp_left_eigv;
|
|
write_three_body_h_tc three_body_h_tc;
|
|
write_pure_three_body_h_tc pure_three_body_h_tc;
|
|
write_double_normal_ord double_normal_ord;
|
|
write_core_tc_op core_tc_op;
|
|
write_full_tc_h_solver full_tc_h_solver;
|
|
write_thresh_it_dav thresh_it_dav;
|
|
write_max_it_dav max_it_dav;
|
|
write_thresh_psi_r thresh_psi_r;
|
|
write_thresh_psi_r_norm thresh_psi_r_norm;
|
|
;;
|
|
(* to_string*)
|
|
let to_string b =
|
|
Printf.sprintf "
|
|
read_rl_eigv = %s
|
|
comp_left_eigv = %s
|
|
three_body_h_tc = %s
|
|
pure_three_body_h_tc = %s
|
|
double_normal_ord = %s
|
|
core_tc_op = %s
|
|
full_tc_h_solver = %s
|
|
thresh_it_dav = %s
|
|
max_it_dav = %s
|
|
thresh_psi_r = %s
|
|
thresh_psi_r_norm = %s
|
|
"
|
|
(string_of_bool b.read_rl_eigv)
|
|
(string_of_bool b.comp_left_eigv)
|
|
(string_of_bool b.three_body_h_tc)
|
|
(string_of_bool b.pure_three_body_h_tc)
|
|
(string_of_bool b.double_normal_ord)
|
|
(string_of_bool b.core_tc_op)
|
|
(string_of_bool b.full_tc_h_solver)
|
|
(Threshold.to_string b.thresh_it_dav)
|
|
(string_of_int b.max_it_dav)
|
|
(Threshold.to_string b.thresh_psi_r)
|
|
(string_of_bool b.thresh_psi_r_norm)
|
|
;;
|
|
(* to_rst*)
|
|
let to_rst b =
|
|
Printf.sprintf "
|
|
If |true|, read the right/left eigenvectors from ezfio ::
|
|
|
|
read_rl_eigv = %s
|
|
|
|
If |true|, computes also the left-eigenvector ::
|
|
|
|
comp_left_eigv = %s
|
|
|
|
If |true|, three-body terms are included ::
|
|
|
|
three_body_h_tc = %s
|
|
|
|
If |true|, pure triple excitation three-body terms are included ::
|
|
|
|
pure_three_body_h_tc = %s
|
|
|
|
If |true|, contracted double excitation three-body terms are included ::
|
|
|
|
double_normal_ord = %s
|
|
|
|
If |true|, takes the usual Hamiltonian for core orbitals (assumed to be doubly occupied) ::
|
|
|
|
core_tc_op = %s
|
|
|
|
If |true|, you diagonalize the full TC H matrix ::
|
|
|
|
full_tc_h_solver = %s
|
|
|
|
Thresholds on the energy for iterative Davidson used in TC ::
|
|
|
|
thresh_it_dav = %s
|
|
|
|
nb max of iteration in Davidson used in TC ::
|
|
|
|
max_it_dav = %s
|
|
|
|
Thresholds on the coefficients of the right-eigenvector. Used for PT2 computation. ::
|
|
|
|
thresh_psi_r = %s
|
|
|
|
If |true|, you prune the WF to compute the PT1 coef based on the norm. If False, the pruning is done through the amplitude on the right-coefficient. ::
|
|
|
|
thresh_psi_r_norm = %s
|
|
|
|
"
|
|
(string_of_bool b.read_rl_eigv)
|
|
(string_of_bool b.comp_left_eigv)
|
|
(string_of_bool b.three_body_h_tc)
|
|
(string_of_bool b.pure_three_body_h_tc)
|
|
(string_of_bool b.double_normal_ord)
|
|
(string_of_bool b.core_tc_op)
|
|
(string_of_bool b.full_tc_h_solver)
|
|
(Threshold.to_string b.thresh_it_dav)
|
|
(string_of_int b.max_it_dav)
|
|
(Threshold.to_string b.thresh_psi_r)
|
|
(string_of_bool b.thresh_psi_r_norm)
|
|
|> Rst_string.of_string
|
|
;;
|
|
include Generic_input_of_rst;;
|
|
let of_rst = of_rst t_of_sexp;;
|
|
|
|
end |