QCaml/Basis/Basis.ml

75 lines
1.8 KiB
OCaml

type t =
{
size : int;
contracted_shells : ContractedShell.t array;
}
module Cs = ContractedShell
module Gb = GeneralBasis
module Ps = PrimitiveShell
(** Returns an array of the basis set per atom *)
let of_nuclei_and_general_basis n b =
let result =
Array.map (fun (e, center) ->
List.assoc e b
|> Array.map (fun (totAngMom, shell) ->
let lc =
Array.map (fun Gb.{exponent ; coefficient} ->
coefficient, Ps.make totAngMom center exponent) shell
in
Cs.make lc)
) n
|> Array.to_list
|> Array.concat
in
Array.iteri (fun i x ->
if (i > 0) then
result.(i) <- Cs.with_index x (
Cs.index result.(i-1) +
Cs.size_of_shell result.(i-1) )
) result ;
let size =
let n = ref 0 in
for i=0 to (Array.length result) - 1 do
n := !n + Cs.size_of_shell result.(i)
done; !n
in
{ contracted_shells = result ; size }
let to_string b =
let b = b.contracted_shells in
let line ="
-----------------------------------------------------------------------
" in
"
Atomic Basis set
----------------
-----------------------------------------------------------------------
# Angular Coordinates (Bohr) Exponents Coefficients
Momentum X Y Z
-----------------------------------------------------------------------
"
^
( Array.map (fun p -> Format.(fprintf str_formatter "%a" Cs.pp p;
flush_str_formatter ())) b
|> Array.to_list
|> String.concat line
)
^ line
let of_nuclei_and_basis_filename ~nuclei filename =
let general_basis =
GeneralBasis.read filename
in
of_nuclei_and_general_basis nuclei general_basis