QCaml/Simulation.ml

67 lines
1.6 KiB
OCaml

type t = {
charge : Charge.t;
electrons : Electrons.t;
nuclei : Nuclei.t;
basis : Basis.t;
ao_basis : AOBasis.t;
f12 : F12factor.t option;
range_separation : float option;
nuclear_repulsion : float;
}
let nuclei t = t.nuclei
let charge t = t.charge
let electrons t = t.electrons
let basis t = t.basis
let ao_basis t = t.ao_basis
let nuclear_repulsion t = t.nuclear_repulsion
let range_separation t = t.range_separation
let f12 t = t.f12
let make ?cartesian:(cartesian=false)
?multiplicity:(multiplicity=1)
?charge:(charge=0)
?f12
?range_separation
~nuclei
basis
=
(* Tune Garbage Collector *)
let gc = Gc.get () in
Gc.set { gc with space_overhead = 1000 };
let electrons =
Electrons.make ~multiplicity ~charge nuclei
in
let charge =
Charge.(Nuclei.charge nuclei + Electrons.charge electrons)
in
let ao_basis =
AOBasis.make ?f12 ~basis ~cartesian nuclei
in
let nuclear_repulsion =
Nuclei.repulsion nuclei
in
{
charge ; basis ; nuclei ; electrons ; ao_basis ; f12 ; range_separation ;
nuclear_repulsion ;
}
let of_filenames ?(cartesian=false) ?(multiplicity=1) ?(charge=0) ?f12 ?range_separation ~nuclei ?(aux_basis_filenames=[]) basis_filename =
let nuclei =
Nuclei.of_filename nuclei
in
let basis =
Basis.of_nuclei_and_basis_filenames ~nuclei (basis_filename :: aux_basis_filenames)
in
lazy (make ?range_separation ?f12 ~cartesian ~charge ~multiplicity ~nuclei basis)
|> Parallel.broadcast