2018-02-09 00:37:25 +01:00
|
|
|
type t =
|
|
|
|
{
|
|
|
|
size : int;
|
2018-03-20 14:11:31 +01:00
|
|
|
contracted_shells : ContractedShell.t array ;
|
2018-03-20 15:16:24 +01:00
|
|
|
atomic_shells : AtomicShell.t array lazy_t;
|
2018-02-09 00:37:25 +01:00
|
|
|
}
|
|
|
|
|
2018-03-20 15:16:24 +01:00
|
|
|
module As = AtomicShell
|
2018-02-23 18:41:30 +01:00
|
|
|
module Cs = ContractedShell
|
|
|
|
module Gb = GeneralBasis
|
2018-03-14 16:22:08 +01:00
|
|
|
module Ps = PrimitiveShell
|
2018-02-23 18:41:30 +01:00
|
|
|
|
2018-01-18 00:21:05 +01:00
|
|
|
|
2018-01-18 17:39:10 +01:00
|
|
|
(** Returns an array of the basis set per atom *)
|
2018-03-20 14:11:31 +01:00
|
|
|
let of_nuclei_and_general_basis nucl bas =
|
|
|
|
let index_ = ref 0 in
|
|
|
|
let contracted_shells =
|
2018-01-19 17:42:12 +01:00
|
|
|
Array.map (fun (e, center) ->
|
2018-03-20 14:11:31 +01:00
|
|
|
List.assoc e bas
|
2018-03-21 15:01:39 +01:00
|
|
|
|> Array.map (fun (ang_mom, shell) ->
|
2018-03-14 16:22:08 +01:00
|
|
|
let lc =
|
|
|
|
Array.map (fun Gb.{exponent ; coefficient} ->
|
2018-03-21 15:01:39 +01:00
|
|
|
coefficient, Ps.make ang_mom center exponent) shell
|
2018-02-06 18:12:19 +01:00
|
|
|
in
|
2018-03-20 14:11:31 +01:00
|
|
|
let result = Cs.make ~index:!index_ lc in
|
|
|
|
index_ := !index_ + Cs.size_of_shell result;
|
|
|
|
result
|
|
|
|
)
|
|
|
|
) nucl
|
2018-01-19 17:42:12 +01:00
|
|
|
|> Array.to_list
|
|
|
|
|> Array.concat
|
|
|
|
in
|
2018-03-20 15:16:24 +01:00
|
|
|
let atomic_shells = lazy(
|
2018-03-20 14:11:31 +01:00
|
|
|
let uniq_center_angmom =
|
2018-03-21 15:01:39 +01:00
|
|
|
Array.map (fun x -> Cs.center x, Cs.ang_mom x) contracted_shells
|
2018-03-20 14:11:31 +01:00
|
|
|
|> Array.to_list
|
|
|
|
|> List.sort_uniq compare
|
|
|
|
in
|
|
|
|
let csl =
|
|
|
|
Array.to_list contracted_shells
|
|
|
|
in
|
2018-03-21 15:01:39 +01:00
|
|
|
List.map (fun (center, ang_mom) ->
|
2018-03-20 14:11:31 +01:00
|
|
|
let a =
|
2018-03-21 15:01:39 +01:00
|
|
|
List.filter (fun x -> Cs.center x = center && Cs.ang_mom x = ang_mom) csl
|
2018-03-20 14:11:31 +01:00
|
|
|
|> Array.of_list
|
|
|
|
in
|
2018-03-20 15:16:24 +01:00
|
|
|
As.make ~index:(Cs.index a.(0)) a
|
2018-03-20 14:11:31 +01:00
|
|
|
) uniq_center_angmom
|
2018-03-20 15:16:24 +01:00
|
|
|
|> List.sort (fun x y -> compare (As.index x) (As.index y))
|
2018-03-20 14:11:31 +01:00
|
|
|
|> Array.of_list
|
|
|
|
) in
|
2018-03-20 15:16:24 +01:00
|
|
|
{ contracted_shells ; atomic_shells ; size = !index_ }
|
2018-03-20 14:11:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
let size x = x.size
|
|
|
|
|
2018-03-20 15:16:24 +01:00
|
|
|
let atomic_shells x = Lazy.force x.atomic_shells
|
2018-03-20 14:11:31 +01:00
|
|
|
|
|
|
|
let contracted_shells x = x.contracted_shells
|
2018-02-09 00:37:25 +01:00
|
|
|
|
2018-01-18 00:21:05 +01:00
|
|
|
|
|
|
|
|
|
|
|
let to_string b =
|
2018-03-20 15:16:24 +01:00
|
|
|
let b = atomic_shells b in
|
2018-01-18 17:39:10 +01:00
|
|
|
let line ="
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
" in
|
|
|
|
"
|
|
|
|
Atomic Basis set
|
|
|
|
----------------
|
|
|
|
|
|
|
|
-----------------------------------------------------------------------
|
2018-01-19 17:42:12 +01:00
|
|
|
# Angular Coordinates (Bohr) Exponents Coefficients
|
|
|
|
Momentum X Y Z
|
2018-01-18 17:39:10 +01:00
|
|
|
-----------------------------------------------------------------------
|
|
|
|
"
|
2018-01-19 03:14:06 +01:00
|
|
|
^
|
2018-03-20 15:16:24 +01:00
|
|
|
( Array.map (fun p -> Format.(fprintf str_formatter "%a" As.pp p;
|
2018-03-16 00:23:47 +01:00
|
|
|
flush_str_formatter ())) b
|
2018-02-06 18:12:19 +01:00
|
|
|
|> Array.to_list
|
|
|
|
|> String.concat line
|
|
|
|
)
|
|
|
|
^ line
|
2017-12-30 19:06:07 +01:00
|
|
|
|
2018-02-23 18:41:30 +01:00
|
|
|
|
|
|
|
|
2018-03-08 23:29:08 +01:00
|
|
|
let of_nuclei_and_basis_filename ~nuclei filename =
|
2018-02-09 00:37:25 +01:00
|
|
|
let general_basis =
|
2018-03-08 23:29:08 +01:00
|
|
|
GeneralBasis.read filename
|
2018-02-09 00:37:25 +01:00
|
|
|
in
|
|
|
|
of_nuclei_and_general_basis nuclei general_basis
|
2018-01-22 23:19:24 +01:00
|
|
|
|
2018-01-18 23:42:48 +01:00
|
|
|
|