10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-11-07 22:53:41 +01:00
QCaml/Nuclei/Nuclei.ml
2018-01-22 23:19:24 +01:00

63 lines
1.6 KiB
OCaml

type t = (Element.t * Coordinate.t) array
let of_xyz_file ~filename =
let lexbuf =
let ic = open_in filename in
Lexing.from_channel ic
in
Xyz_parser.input Nuclei_lexer.read_all lexbuf
let of_zmt_file ~filename =
let ic = open_in filename in
let rec aux accu =
try
let line = input_line ic in
aux (line::accu)
with End_of_file ->
close_in ic;
List.rev accu
|> String.concat "\n"
in aux []
|> Zmatrix.of_string
|> Zmatrix.to_xyz
|> Array.map (fun (e,x,y,z) -> (e, Coordinate.of_3_floats x y z ))
let to_string atoms =
"
Nuclear Coordinates (Angstrom)
------------------------------
-----------------------------------------------------------------------
Center Atomic Element Coordinates (Angstroms)
Number X Y Z
-----------------------------------------------------------------------
" ^
(Array.mapi (fun i (e, coord) ->
let coord =
Coordinate.to_Angstrom coord
in
Printf.sprintf " %5d %5d %5s %12.6f %12.6f %12.6f"
(i+1) (Element.to_int e) (Element.to_string e)
(Coordinate.x coord) (Coordinate.y coord) (Coordinate.z coord)
) atoms
|> Array.to_list
|> String.concat "\n" ) ^
"
-----------------------------------------------------------------------
"
let file : string option ref = ref None
let set_file f =
file := Some f
let nuclei = lazy(
match !file with
| None -> failwith "coordinate file not defined"
| Some filename -> of_xyz_file ~filename
)