10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-11-03 20:54:00 +01:00
quantum_package/ocaml/Basis.ml

64 lines
1.3 KiB
OCaml
Raw Normal View History

2016-01-14 17:03:55 +01:00
open Core.Std
open Qptypes
2014-08-27 16:38:13 +02:00
2016-01-14 17:03:55 +01:00
type t = (Gto.t * Nucl_number.t) list with sexp
2014-08-27 16:38:13 +02:00
(** Read all the basis functions of an element *)
2014-09-17 23:47:13 +02:00
let read in_channel at_number =
2014-08-27 16:38:13 +02:00
let rec read result =
try
let gto = Gto.read_one in_channel in
2014-09-17 23:47:13 +02:00
read ( (gto,at_number)::result)
2014-08-27 16:38:13 +02:00
with
| Gto.End_Of_Basis -> List.rev result
in read []
2016-01-14 17:03:55 +01:00
2014-08-27 16:38:13 +02:00
(** Find an element in the basis set file *)
let find in_channel element =
2014-09-17 14:57:12 +02:00
In_channel.seek in_channel 0L;
2014-08-27 16:38:13 +02:00
let element_read = ref Element.X in
while !element_read <> element
do
let buffer = input_line in_channel in
try
element_read := Element.of_string buffer
with
| Element.ElementError _ -> ()
done ;
!element_read
2016-01-14 17:03:55 +01:00
2014-08-27 16:38:13 +02:00
2014-09-17 23:47:13 +02:00
(** Read an element from the file *)
let read_element in_channel at_number element =
2014-08-27 16:38:13 +02:00
ignore (find in_channel element) ;
2016-01-14 17:03:55 +01:00
read in_channel at_number
2014-08-27 16:38:13 +02:00
2014-09-17 14:57:12 +02:00
let to_string b =
2014-10-26 12:46:17 +01:00
let new_nucleus n =
2014-10-29 00:12:45 +01:00
Printf.sprintf "Atom %d" n
2014-10-26 12:46:17 +01:00
in
let rec do_work accu current_nucleus = function
| [] -> List.rev accu
| (g,n)::tail ->
let n = Nucl_number.to_int n
in
let accu =
if (n <> current_nucleus) then
(new_nucleus n)::""::accu
else
accu
in
do_work ((Gto.to_string g)::accu) n tail
in
do_work [new_nucleus 1] 1 b
|> String.concat ~sep:"\n"
2016-01-14 17:03:55 +01:00
include To_md5
let to_md5 = to_md5 sexp_of_t
2016-01-14 17:03:55 +01:00
2014-10-26 12:46:17 +01:00