10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-11-13 17:43:55 +01:00
quantum_package/ocaml/Input_nuclei.ml

109 lines
2.7 KiB
OCaml
Raw Normal View History

2014-10-24 00:42:07 +02:00
open Qptypes;;
open Qputils;;
open Core.Std;;
module Nuclei : sig
type t =
{ nucl_num : Nucl_number.t ;
nucl_label : Element.t array;
nucl_charge : Charge.t array;
nucl_coord : Point3d.t array;
2014-10-25 21:24:21 +02:00
} with sexp
2014-10-24 00:42:07 +02:00
;;
val read : unit -> t
2014-10-29 00:12:45 +01:00
val debug : t -> string
2014-10-29 00:50:59 +01:00
val to_string : t -> string
2014-10-24 00:42:07 +02:00
end = struct
type t =
{ nucl_num : Nucl_number.t ;
nucl_label : Element.t array;
nucl_charge : Charge.t array;
nucl_coord : Point3d.t array;
2014-10-25 21:24:21 +02:00
} with sexp
2014-10-24 00:42:07 +02:00
;;
let get_default = Qpackage.get_ezfio_default "nuclei";;
let read_nucl_num () =
Ezfio.get_nuclei_nucl_num ()
|> Nucl_number.of_int
;;
let read_nucl_label () =
(Ezfio.get_nuclei_nucl_label ()).Ezfio.data
|> Ezfio.flattened_ezfio_data
|> Array.map ~f:Element.of_string
;;
let read_nucl_charge () =
(Ezfio.get_nuclei_nucl_charge () ).Ezfio.data
|> Ezfio.flattened_ezfio_data
|> Array.map ~f:Charge.of_float
;;
let read_nucl_coord () =
let nucl_num = Nucl_number.to_int (read_nucl_num ()) in
let raw_data =
(Ezfio.get_nuclei_nucl_coord() ).Ezfio.data
|> Ezfio.flattened_ezfio_data
in
let zero = Point3d.of_string Units.Bohr "0. 0. 0." in
let result = Array.create nucl_num zero in
for i=0 to (nucl_num-1)
do
result.(i) <- Point3d.({ x=raw_data.(i);
y=raw_data.(nucl_num+i);
z=raw_data.(2*nucl_num+i); });
done;
result
;;
let read () =
{ nucl_num = read_nucl_num ();
nucl_label = read_nucl_label () ;
nucl_charge = read_nucl_charge ();
nucl_coord = read_nucl_coord ();
}
;;
2014-10-29 00:12:45 +01:00
let debug b =
2014-10-24 00:42:07 +02:00
Printf.sprintf "
nucl_num = %s
nucl_label = %s
nucl_charge = %s
nucl_coord = %s
"
(Nucl_number.to_string b.nucl_num)
(b.nucl_label |> Array.to_list |> List.map
~f:(Element.to_string) |> String.concat ~sep:", " )
(b.nucl_charge |> Array.to_list |> List.map
~f:(Charge.to_string) |> String.concat ~sep:", " )
(b.nucl_coord |> Array.to_list |> List.map
~f:(Point3d.to_string Units.Bohr) |> String.concat ~sep:"\n" )
2014-10-29 00:50:59 +01:00
;;
2014-10-24 00:42:07 +02:00
2014-10-29 18:55:31 +01:00
let to_string b =
let nucl_num = Nucl_number.to_int b.nucl_num in
let text =
( Printf.sprintf " %d\n "
nucl_num
) :: (
List.init nucl_num ~f:(fun i->
Printf.sprintf " %-3s %d %s"
(b.nucl_label.(i) |> Element.to_string)
(b.nucl_charge.(i) |> Charge.to_int )
(b.nucl_coord.(i) |> Point3d.to_string Units.Angstrom) )
) |> String.concat ~sep:"\n"
in
Printf.sprintf "
Nuclear coordinates in xyz format (Angstroms) ::
%s
" text
2014-10-29 00:50:59 +01:00
;;
2014-10-24 00:42:07 +02:00
end