quantum_package/ocaml/qp_print.ml

184 lines
4.2 KiB
OCaml

open Qputils;;
open Qptypes;;
open Core;;
type input_action =
| Basis
| Nuclei
| Charge
| Multiplicity
| Electrons
;;
let create_i_action = function
| "basis" -> Basis
| "nucl" -> Nuclei
| "charge" -> Charge
| "mult" -> Multiplicity
| "elec" -> Electrons
| _ -> raise (Failure "Action should be:
* basis
* nucl
* charge
* mult
* elec
")
;;
let spec =
let open Command.Spec in
empty
+> flag "i" (optional string)
~doc:"Prints input data"
+> flag "o" (optional string)
~doc:"Prints output data"
+> anon ("ezfio_file" %: string)
;;
let run_i ~action ezfio_filename =
let action = create_i_action action in
if (not (Sys.file_exists_exn ezfio_filename)) then
failwith (ezfio_filename^" does not exist");
Ezfio.set_file ezfio_filename;
let print_basis () =
Printf.printf "%s\n" (Ezfio.get_ao_basis_ao_basis ())
in
let compute_charge () =
let input = match Input.Electrons.read () with
| Some x -> x
| None -> assert false
in
let nucl_charge = Ezfio.get_nuclei_nucl_charge ()
|> Ezfio.flattened_ezfio |> Array.map ~f:(Float.to_int)
and n_alpha = input.Input.Electrons.elec_alpha_num
|> Elec_alpha_number.to_int
and n_beta = input.Input.Electrons.elec_beta_num
|> Elec_beta_number.to_int
in Array.fold ~init:(-n_alpha-n_beta) ~f:(fun x y -> x+y) nucl_charge
|> Charge.of_int
in
let compute_multiplicity () =
let input = match Input.Electrons.read () with
| Some x -> x
| None -> assert false
in
let n_alpha = input.Input.Electrons.elec_alpha_num
and n_beta = input.Input.Electrons.elec_beta_num
in Multiplicity.of_alpha_beta n_alpha n_beta
in
let create_molecule () =
let nucl_num = Ezfio.get_nuclei_nucl_num ()
and nucl_charge = Ezfio.get_nuclei_nucl_charge ()
|> Ezfio.flattened_ezfio
and nucl_coord = Ezfio.get_nuclei_nucl_coord ()
|> Ezfio.flattened_ezfio
in
let nucl_label =
if (Ezfio.has_nuclei_nucl_label ()) then
Ezfio.get_nuclei_nucl_label () |> Ezfio.flattened_ezfio
else
Array.map ~f:(fun x-> x
|> Charge.of_float
|> Element.of_charge
|> Element.to_string ) nucl_charge
in
let buffer = ref "" in
for i=0 to (nucl_num-1) do
buffer := !buffer ^ (Printf.sprintf "%s %f %f %f %f\n"
nucl_label.(i)
nucl_charge.(i)
nucl_coord.(i)
nucl_coord.(i+nucl_num)
nucl_coord.(i+nucl_num+nucl_num)
)
done ;
let charge = compute_charge () in
let mult = compute_multiplicity () in
Molecule.of_xyz_string ~charge:charge ~multiplicity:mult !buffer
in
let print_nuclei () =
let molecule = create_molecule () in
print_endline (Molecule.to_string molecule)
and print_charge () =
let molecule = create_molecule () in
Printf.printf "%s" (Charge.to_string (Molecule.get_charge molecule))
and print_multiplicity () =
let molecule = create_molecule () in
Printf.printf "%s" (Multiplicity.to_string (Molecule.get_multiplicity
molecule))
and print_electrons () = ()
in
match action with
| Basis -> print_basis ()
| Nuclei -> print_nuclei ()
| Charge -> print_charge ()
| Multiplicity -> print_multiplicity ()
| Electrons -> print_electrons ()
;;
let run_o ~action ezfio_filename =
if (not (Sys.file_exists_exn ezfio_filename)) then
failwith (ezfio_filename^" does not exist");
(* Open EZFIO *)
Ezfio.set_file ezfio_filename;
;;
let command =
Command.basic_spec
~summary: "Quantum Package command"
~readme:(fun () ->
"
Prints data contained into the EZFIO file.
Input data :
* basis
* nucl
* charge
* mult
* elec
Output data :
*
")
spec
(fun i o ezfio_file () ->
try
match (i,o) with
| (Some i, None) -> run_i ~action:i ezfio_file
| (None, Some o) -> run_o ~action:o ezfio_file
| (Some _, Some _) ->
raise (Failure "Error : please specify -i or -o but not both.")
| (None, None) ->
raise (Failure "Error : please specify -i or -o.")
with
| Failure msg -> print_string ("Error\n"^msg)
| _ -> ()
)
;;
let () =
Command.run command
;;