open Util type t = { expo : float array; coef : float array; center : Coordinate.t; totAngMom : Angular_momentum.t; size : int; norm_coef : (int array -> float) array; } (** Normalization coefficient of contracted function i, which depends on the exponent and the angular momentum. Two conventions can be chosen : a single normalisation factor for all functions of the class, or a coefficient which depends on the powers of x,y and z. *) let compute_norm_coef s = let atot = Angular_momentum.to_int s.totAngMom in Array.mapi (fun i alpha -> let c = ((alpha +. alpha) *. pi_inv)**(1.5) *. (pow (4. *. alpha) atot) in let result a = let dfa = Array.map (fun j -> fact (j+j) /. ( float_of_int (1 lsl j) *. fact j) ) a in sqrt (c /. (dfa.(0) *.dfa.(1) *. dfa.(2))) in result ) s.expo let create ~expo ~coef ~center ~totAngMom = assert (Array.length expo = Array.length coef); assert (Array.length expo > 0); let tmp = { expo ; coef ; center ; totAngMom ; size=Array.length expo ; norm_coef = [||]} in { tmp with norm_coef = compute_norm_coef tmp }