open Util open Constants open Contracted_shell_type open Coordinate type t = Contracted_shell_type.t let size a = a.size let expo a i = a.expo.(i) let coef a i = a.coef.(i) let center a = a.center let totAngMom a = a.totAngMom let norm_coef a i = a.norm_coef.(i) let norm_coef_scale a = a.norm_coef_scale let index a = a.index let with_index = Contracted_shell_type.with_index let powers a = a.powers let to_string s = let coord = s.center in let open Printf in (match s.totAngMom with | Angular_momentum.S -> sprintf "%3d " (s.index+1) | _ -> sprintf "%3d-%-3d" (s.index+1) (s.index+(Array.length s.powers)) ) ^ ( sprintf "%1s %8.3f %8.3f %8.3f " (Angular_momentum.to_string s.totAngMom) (get X coord) (get Y coord) (get Z coord) ) ^ (Array.map2 (fun e c -> sprintf "%16.8e %16.8e" e c) s.expo s.coef |> Array.to_list |> String.concat (sprintf "\n%36s" " ") ) (** 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. Returns, for each contracted function, an array of functions taking as argument the [|x;y;z|] powers. *) let compute_norm_coef expo totAngMom = let atot = Angular_momentum.to_int totAngMom in let factor int_array = let dfa = Array.map (fun j -> ( float_of_int (1 lsl j) *. fact j) /. fact (j+j) ) int_array in sqrt (dfa.(0) *.dfa.(1) *. dfa.(2)) in let expo = if atot mod 2 = 0 then Array.map (fun alpha -> let alpha_2 = alpha +. alpha in (alpha_2 *. pi_inv)**(0.75) *. (pow (alpha_2 +. alpha_2) (atot/2)) ) expo else Array.map (fun alpha -> let alpha_2 = alpha +. alpha in (alpha_2 *. pi_inv)**(0.75) *. sqrt (pow (alpha_2 +. alpha_2) atot) ) expo in Array.map (fun x -> let f a = x *. (factor a) in f) expo let make = Contracted_shell_type.make