mirror of
https://github.com/LCPQ/quantum_package
synced 2025-04-18 22:40:33 +02:00
Less EZFIO I/O
This commit is contained in:
parent
ea1a4523c1
commit
6716a996cd
@ -106,14 +106,14 @@ let of_mo_number_list n_int l =
|
|||||||
|
|
||||||
let to_mo_number_list l =
|
let to_mo_number_list l =
|
||||||
let a = Array.of_list l in
|
let a = Array.of_list l in
|
||||||
let mo_tot_num = MO_number.get_mo_tot_num () in
|
let mo_tot_num = MO_number.get_max () in
|
||||||
let rec do_work accu = function
|
let rec do_work accu = function
|
||||||
| 0 -> accu
|
| 0 -> accu
|
||||||
| i ->
|
| i ->
|
||||||
begin
|
begin
|
||||||
let new_accu =
|
let new_accu =
|
||||||
match a.(i-1) with
|
match a.(i-1) with
|
||||||
| Bit.One -> (MO_number.of_int ~mo_tot_num:mo_tot_num i)::accu
|
| Bit.One -> (MO_number.of_int ~max:mo_tot_num i)::accu
|
||||||
| Bit.Zero -> accu
|
| Bit.Zero -> accu
|
||||||
in
|
in
|
||||||
do_work new_accu (i-1)
|
do_work new_accu (i-1)
|
||||||
|
@ -59,9 +59,10 @@ end = struct
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
let read_ao_nucl () =
|
let read_ao_nucl () =
|
||||||
|
let nmax = Nucl_number.get_max () in
|
||||||
(Ezfio.get_ao_basis_ao_nucl () ).Ezfio.data
|
(Ezfio.get_ao_basis_ao_nucl () ).Ezfio.data
|
||||||
|> Ezfio.flattened_ezfio_data
|
|> Ezfio.flattened_ezfio_data
|
||||||
|> Array.map ~f:Nucl_number.of_int
|
|> Array.map ~f:(fun x-> Nucl_number.of_int ~max:nmax x)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let read_ao_power () =
|
let read_ao_power () =
|
||||||
|
@ -177,10 +177,10 @@ end = struct
|
|||||||
let n_int = read_n_int () in
|
let n_int = read_n_int () in
|
||||||
if not (Ezfio.has_determinants_psi_det ()) then
|
if not (Ezfio.has_determinants_psi_det ()) then
|
||||||
begin
|
begin
|
||||||
let mo_tot_num = MO_number.get_mo_tot_num () in
|
let mo_tot_num = MO_number.get_max () in
|
||||||
let rec build_data accu = function
|
let rec build_data accu = function
|
||||||
| 0 -> accu
|
| 0 -> accu
|
||||||
| n -> build_data ((MO_number.of_int ~mo_tot_num:mo_tot_num n)::accu) (n-1)
|
| n -> build_data ((MO_number.of_int ~max:mo_tot_num n)::accu) (n-1)
|
||||||
in
|
in
|
||||||
let det_a = build_data [] (Ezfio.get_electrons_elec_alpha_num ())
|
let det_a = build_data [] (Ezfio.get_electrons_elec_alpha_num ())
|
||||||
|> Bitlist.of_mo_number_list n_int
|
|> Bitlist.of_mo_number_list n_int
|
||||||
@ -248,7 +248,7 @@ end = struct
|
|||||||
|
|
||||||
let to_rst b =
|
let to_rst b =
|
||||||
let mo_tot_num = Ezfio.get_mo_basis_mo_tot_num () in
|
let mo_tot_num = Ezfio.get_mo_basis_mo_tot_num () in
|
||||||
let mo_tot_num = MO_number.of_int mo_tot_num ~mo_tot_num:mo_tot_num in
|
let mo_tot_num = MO_number.of_int mo_tot_num ~max:mo_tot_num in
|
||||||
let det_text =
|
let det_text =
|
||||||
List.map2_exn ~f:(fun coef det ->
|
List.map2_exn ~f:(fun coef det ->
|
||||||
Printf.sprintf " %f\n%s\n"
|
Printf.sprintf " %f\n%s\n"
|
||||||
@ -315,7 +315,7 @@ Determinants ::
|
|||||||
|
|
||||||
let to_string b =
|
let to_string b =
|
||||||
let mo_tot_num = Ezfio.get_mo_basis_mo_tot_num () in
|
let mo_tot_num = Ezfio.get_mo_basis_mo_tot_num () in
|
||||||
let mo_tot_num = MO_number.of_int mo_tot_num ~mo_tot_num:mo_tot_num in
|
let mo_tot_num = MO_number.of_int mo_tot_num ~max:mo_tot_num in
|
||||||
Printf.sprintf "
|
Printf.sprintf "
|
||||||
n_int = %s
|
n_int = %s
|
||||||
bit_kind = %s
|
bit_kind = %s
|
||||||
|
@ -26,8 +26,8 @@ end = struct
|
|||||||
let get_default = Qpackage.get_ezfio_default "nuclei";;
|
let get_default = Qpackage.get_ezfio_default "nuclei";;
|
||||||
|
|
||||||
let read_nucl_num () =
|
let read_nucl_num () =
|
||||||
Ezfio.get_nuclei_nucl_num ()
|
let nmax = Nucl_number.get_max () in
|
||||||
|> Nucl_number.of_int
|
Nucl_number.of_int ~max:nmax nmax
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let read_nucl_label () =
|
let read_nucl_label () =
|
||||||
@ -75,15 +75,8 @@ end = struct
|
|||||||
else
|
else
|
||||||
extract_begin tail
|
extract_begin tail
|
||||||
in
|
in
|
||||||
(* Read the xyz data *)
|
|
||||||
let rec read_line = function
|
|
||||||
| [] -> []
|
|
||||||
| line::tail ->
|
|
||||||
if (String.strip line = "") then []
|
|
||||||
else
|
|
||||||
(read_line tail)
|
|
||||||
in
|
|
||||||
(* Create a list of Atom.t *)
|
(* Create a list of Atom.t *)
|
||||||
|
let nmax = Nucl_number.get_max () in
|
||||||
let atom_list =
|
let atom_list =
|
||||||
match (extract_begin l) with
|
match (extract_begin l) with
|
||||||
| _ :: nucl_num :: title :: lines ->
|
| _ :: nucl_num :: title :: lines ->
|
||||||
@ -91,7 +84,7 @@ end = struct
|
|||||||
let nucl_num = nucl_num
|
let nucl_num = nucl_num
|
||||||
|> String.strip
|
|> String.strip
|
||||||
|> Int.of_string
|
|> Int.of_string
|
||||||
|> Nucl_number.of_int
|
|> Nucl_number.of_int ~max:nmax
|
||||||
and lines = Array.of_list lines
|
and lines = Array.of_list lines
|
||||||
in
|
in
|
||||||
List.init (Nucl_number.to_int nucl_num) ~f:(fun i ->
|
List.init (Nucl_number.to_int nucl_num) ~f:(fun i ->
|
||||||
@ -101,7 +94,7 @@ end = struct
|
|||||||
in
|
in
|
||||||
(* Create the Nuclei.t data structure *)
|
(* Create the Nuclei.t data structure *)
|
||||||
{ nucl_num = List.length atom_list
|
{ nucl_num = List.length atom_list
|
||||||
|> Nucl_number.of_int;
|
|> Nucl_number.of_int ~max:nmax;
|
||||||
nucl_label = List.map atom_list ~f:(fun x ->
|
nucl_label = List.map atom_list ~f:(fun x ->
|
||||||
x.Atom.element) |> Array.of_list ;
|
x.Atom.element) |> Array.of_list ;
|
||||||
nucl_charge = List.map atom_list ~f:(fun x ->
|
nucl_charge = List.map atom_list ~f:(fun x ->
|
||||||
|
@ -25,7 +25,8 @@ let get_multiplicity m =
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
let get_nucl_num m =
|
let get_nucl_num m =
|
||||||
Nucl_number.of_int (List.length m.nuclei)
|
let nmax = (List.length m.nuclei) in
|
||||||
|
Nucl_number.of_int nmax ~max:nmax
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let name m =
|
let name m =
|
||||||
|
@ -74,9 +74,10 @@ let run ?o b c m xyz_file =
|
|||||||
|
|
||||||
(* Write Basis set *)
|
(* Write Basis set *)
|
||||||
let basis =
|
let basis =
|
||||||
|
let nmax = Nucl_number.get_max () in
|
||||||
let rec do_work (accu:(Atom.t*Nucl_number.t) list) (n:int) = function
|
let rec do_work (accu:(Atom.t*Nucl_number.t) list) (n:int) = function
|
||||||
| [] -> accu
|
| [] -> accu
|
||||||
| e::tail -> let new_accu = (e,(Nucl_number.of_int n))::accu in
|
| e::tail -> let new_accu = (e,(Nucl_number.of_int ~max:nmax n))::accu in
|
||||||
do_work new_accu (n+1) tail
|
do_work new_accu (n+1) tail
|
||||||
in
|
in
|
||||||
do_work [] 1 nuclei
|
do_work [] 1 nuclei
|
||||||
|
@ -37,34 +37,6 @@ let input_data = "
|
|||||||
assert (x <> \"\") ;
|
assert (x <> \"\") ;
|
||||||
|
|
||||||
|
|
||||||
* AO_number : int
|
|
||||||
assert (x > 0) ;
|
|
||||||
if (x > 1000) then
|
|
||||||
warning \"More than 1000 AOs\";
|
|
||||||
if (Ezfio.has_ao_basis_ao_num ()) then
|
|
||||||
assert (x <= (Ezfio.get_ao_basis_ao_num ()));
|
|
||||||
|
|
||||||
* Nucl_number : int
|
|
||||||
assert (x > 0) ;
|
|
||||||
if (x > 1000) then
|
|
||||||
warning \"More than 1000 atoms\";
|
|
||||||
if (Ezfio.has_nuclei_nucl_num ()) then
|
|
||||||
assert (x <= (Ezfio.get_nuclei_nucl_num ()));
|
|
||||||
|
|
||||||
* N_int_number : int
|
|
||||||
assert (x > 0) ;
|
|
||||||
if (x > 100) then
|
|
||||||
warning \"N_int > 100\";
|
|
||||||
if (Ezfio.has_determinants_n_int ()) then
|
|
||||||
assert (x = (Ezfio.get_determinants_n_int ()));
|
|
||||||
|
|
||||||
* Det_number : int
|
|
||||||
assert (x > 0) ;
|
|
||||||
if (x > 100000000) then
|
|
||||||
warning \"More than 100 million determinants\";
|
|
||||||
if (Ezfio.has_determinants_n_det ()) then
|
|
||||||
assert (x <= (Ezfio.get_determinants_n_det ()));
|
|
||||||
|
|
||||||
* Det_number_max : int
|
* Det_number_max : int
|
||||||
assert (x > 0) ;
|
assert (x > 0) ;
|
||||||
if (x > 100000000) then
|
if (x > 100000000) then
|
||||||
@ -131,38 +103,36 @@ let input_data = "
|
|||||||
"
|
"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
let input_ezfio = "
|
||||||
|
* MO_number : int
|
||||||
|
mo_basis_mo_tot_num
|
||||||
|
1 : 10000
|
||||||
|
More than 10000 MOs
|
||||||
|
|
||||||
|
* AO_number : int
|
||||||
|
ao_basis_ao_num
|
||||||
|
1 : 10000
|
||||||
|
More than 10000 AOs
|
||||||
|
|
||||||
|
* Nucl_number : int
|
||||||
|
nuclei_nucl_num
|
||||||
|
1 : 10000
|
||||||
|
More than 10000 nuclei
|
||||||
|
|
||||||
|
* N_int_number : int
|
||||||
|
determinants_n_int
|
||||||
|
1 : 30
|
||||||
|
N_int > 30
|
||||||
|
|
||||||
|
* Det_number : int
|
||||||
|
determinants_n_det
|
||||||
|
1 : 100000000
|
||||||
|
More than 100 million determinants
|
||||||
|
|
||||||
|
"
|
||||||
|
;;
|
||||||
|
|
||||||
let untouched = "
|
let untouched = "
|
||||||
module MO_number : sig
|
|
||||||
type t with sexp
|
|
||||||
val to_int : t -> int
|
|
||||||
val get_mo_tot_num : unit -> int
|
|
||||||
val of_int : ?mo_tot_num:int -> int -> t
|
|
||||||
val to_string : t -> string
|
|
||||||
end = struct
|
|
||||||
type t = int with sexp
|
|
||||||
let get_mo_tot_num () =
|
|
||||||
if (Ezfio.has_mo_basis_mo_tot_num ()) then
|
|
||||||
Ezfio.get_mo_basis_mo_tot_num ()
|
|
||||||
else
|
|
||||||
0
|
|
||||||
let to_int x = x
|
|
||||||
let of_int ?mo_tot_num x = ( assert (x > 0) ;
|
|
||||||
if (x > 1000) then
|
|
||||||
warning \"More than 1000 MOs\";
|
|
||||||
let mo_tot_num = match mo_tot_num with
|
|
||||||
| Some i -> i
|
|
||||||
| None -> get_mo_tot_num ()
|
|
||||||
in
|
|
||||||
begin
|
|
||||||
match mo_tot_num with
|
|
||||||
| 0 -> ()
|
|
||||||
| i -> assert ( x <= i )
|
|
||||||
end
|
|
||||||
; x )
|
|
||||||
|
|
||||||
let to_string x = Int.to_string x
|
|
||||||
end
|
|
||||||
|
|
||||||
"
|
"
|
||||||
|
|
||||||
let template = format_of_string "
|
let template = format_of_string "
|
||||||
@ -209,9 +179,75 @@ let parse_input input=
|
|||||||
|> print_string
|
|> print_string
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let () =
|
|
||||||
parse_input input_data ;
|
let ezfio_template = format_of_string "
|
||||||
print_endline untouched
|
module %s : sig
|
||||||
|
type t with sexp
|
||||||
|
val to_%s : t -> %s
|
||||||
|
val get_max : unit -> %s
|
||||||
|
val of_%s : ?min:%s -> ?max:%s -> %s -> t
|
||||||
|
val to_string : t -> string
|
||||||
|
end = struct
|
||||||
|
type t = %s with sexp
|
||||||
|
let to_string x = %s.to_string x
|
||||||
|
let get_max () =
|
||||||
|
if (Ezfio.has_%s ()) then
|
||||||
|
Ezfio.get_%s ()
|
||||||
|
else
|
||||||
|
%s
|
||||||
|
let get_min () =
|
||||||
|
%s
|
||||||
|
let to_%s x = x
|
||||||
|
let of_%s ?(min=get_min ()) ?(max=get_max ()) x =
|
||||||
|
begin
|
||||||
|
assert (x >= min) ;
|
||||||
|
if (x > %s) then
|
||||||
|
warning \"%s\";
|
||||||
|
begin
|
||||||
|
match max with
|
||||||
|
| %s -> ()
|
||||||
|
| i -> assert ( x <= i )
|
||||||
|
end ;
|
||||||
|
x
|
||||||
|
end
|
||||||
|
end
|
||||||
|
"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
let parse_input_ezfio input=
|
||||||
|
let parse s =
|
||||||
|
match (
|
||||||
|
String.split s ~on:'\n'
|
||||||
|
|> List.filter ~f:(fun x -> (String.strip x) <> "")
|
||||||
|
) with
|
||||||
|
| [] -> ""
|
||||||
|
| a :: b :: c :: d :: [] ->
|
||||||
|
begin
|
||||||
|
let (name,typ) = String.lsplit2_exn ~on:':' a
|
||||||
|
and ezfio_func = b
|
||||||
|
and (min, max) = String.lsplit2_exn ~on:':' c
|
||||||
|
and msg = d
|
||||||
|
in
|
||||||
|
let name :: typ :: ezfio_func :: min :: max :: msg :: [] =
|
||||||
|
name :: typ :: ezfio_func :: min :: max :: msg :: []
|
||||||
|
|> List.map ~f:String.strip
|
||||||
|
in
|
||||||
|
Printf.sprintf ezfio_template
|
||||||
|
name typ typ typ typ typ typ typ typ (String.capitalize typ)
|
||||||
|
ezfio_func ezfio_func max min typ typ max msg min
|
||||||
|
end
|
||||||
|
| _ -> failwith "Error in input_ezfio"
|
||||||
|
in
|
||||||
|
String.split ~on:'*' input
|
||||||
|
|> List.map ~f:parse
|
||||||
|
|> String.concat
|
||||||
|
|> print_string
|
||||||
|
;;
|
||||||
|
|
||||||
|
let () =
|
||||||
|
parse_input input_data ;
|
||||||
|
parse_input_ezfio input_ezfio;
|
||||||
|
print_endline untouched;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user