(** Simulation *) open Common open Particles open Operators (** Type *) type t = { charge : Charge.t; electrons : Electrons.t; nuclei : Nuclei.t; ao_basis : Ao.Basis.t; operators : Operator.t list; } (** Access *) let nuclei t = t.nuclei let charge t = t.charge let electrons t = t.electrons let ao_basis t = t.ao_basis let nuclear_repulsion t = Nuclei.repulsion @@ nuclei t let operators t = t.operators (** Creation *) let make ?(multiplicity=1) ?(charge=0) ?(operators=[]) ~nuclei ao_basis = (* Tune Garbage Collector *) let gc = Gc.get () in Gc.set { gc with space_overhead = 1000 }; let electrons = Electrons.of_atoms ~multiplicity ~charge nuclei in let charge = Charge.(Nuclei.charge nuclei + Electrons.charge electrons) in { charge ; nuclei ; electrons ; ao_basis ; operators} (** Printers *) let pp ppf t = let formula = Nuclei.formula t.nuclei in let n_aos = Ao.Basis.size t.ao_basis in let n_ops = List.length t.operators in Format.fprintf ppf "@[@[%s@], @[%a@], @[%d AOs@], @[%d operators@]@]" formula Electrons.pp t.electrons n_aos n_ops