diff --git a/Basis/Contracted_shell.ml b/Basis/Contracted_shell.ml index bfa132f..091a2bb 100644 --- a/Basis/Contracted_shell.ml +++ b/Basis/Contracted_shell.ml @@ -63,7 +63,7 @@ let create ~indice ~expo ~coef ~center ~totAngMom = assert (Array.length expo > 0); let tmp = { indice ; expo ; coef ; center ; totAngMom ; size=Array.length expo ; norm_coef = [||]; - powers = Angular_momentum.zkey_array (Angular_momentum.Kind_1 totAngMom) } + powers = Angular_momentum.zkey_array (Angular_momentum.Singlet totAngMom) } in { tmp with norm_coef = compute_norm_coef tmp } diff --git a/Basis/TwoElectronRR.ml b/Basis/TwoElectronRR.ml index 1d9289b..4861e15 100644 --- a/Basis/TwoElectronRR.ml +++ b/Basis/TwoElectronRR.ml @@ -185,7 +185,7 @@ let contracted_class ~zero_m shell_a shell_b shell_c shell_d : float Zmap.t = (* Pre-computation of integral class indices *) let class_indices = Angular_momentum.zkey_array - (Angular_momentum.Kind_4 + (Angular_momentum.Quartet Contracted_shell.(totAngMom shell_a, totAngMom shell_b, totAngMom shell_c, totAngMom shell_d)) in diff --git a/Utils/Angular_momentum.ml b/Utils/Angular_momentum.ml index 7b443d6..f30b58a 100644 --- a/Utils/Angular_momentum.ml +++ b/Utils/Angular_momentum.ml @@ -53,9 +53,10 @@ let of_int = function type kind = -| Kind_1 of t -| Kind_2 of (t*t) -| Kind_4 of (t*t*t*t) +| Singlet of t +| Doublet of (t*t) +| Triplet of (t*t*t) +| Quartet of (t*t*t*t) let n_functions a = @@ -92,7 +93,7 @@ let zkey_array a = begin match a with - | Kind_1 l1 -> + | Singlet l1 -> let a = Array.init 3 (fun _ -> 0) in List.map (fun (cx,cy,cz) -> @@ -100,7 +101,7 @@ let zkey_array a = Zkey.(of_int_array Kind_3 a) ) (keys_1d @@ to_int l1) - | Kind_2 (l1, l2) -> + | Doublet (l1, l2) -> let a = Array.init 6 (fun _ -> 0) in List.map (fun (cx,cy,cz) -> @@ -110,9 +111,25 @@ let zkey_array a = Zkey.(of_int_array Kind_6 a) ) (keys_1d @@ to_int l1) ) (keys_1d @@ to_int l2) - |> List.concat + |> List.concat - | Kind_4 (l1, l2, l3, l4) -> + | Triplet (l1, l2, l3) -> + + let a = Array.init 9 (fun _ -> 0) in + List.map (fun (ax,ay,az) -> + a.(0) <- ax ; a.(1) <- ay ; a.(2) <- az ; + List.map (fun (bx,by,bz) -> + a.(3) <- bx ; a.(4) <- by ; a.(5) <- bz ; + List.map (fun (cx,cy,cz) -> + a.(6) <- cx ; a.(7) <- cy ; a.(8) <- cz ; + Zkey.(of_int_array Kind_9 a) + ) (keys_1d @@ to_int l3) + ) (keys_1d @@ to_int l2) + |> List.concat + ) (keys_1d @@ to_int l1) + |> List.concat + + | Quartet (l1, l2, l3, l4) -> let a = Array.init 12 (fun _ -> 0) in List.map (fun (ax,ay,az) -> diff --git a/Utils/Angular_momentum.mli b/Utils/Angular_momentum.mli index 73576a6..bc145d2 100644 --- a/Utils/Angular_momentum.mli +++ b/Utils/Angular_momentum.mli @@ -5,6 +5,11 @@ val to_string : t -> string val to_char : t -> char val to_int : t -> int val of_int : int -> t -type kind = Kind_1 of t | Kind_2 of (t * t) | Kind_4 of (t * t * t * t) +type kind = +| Singlet of t +| Doublet of (t*t) +| Triplet of (t*t*t) +| Quartet of (t*t*t*t) + val n_functions : t -> int val zkey_array : kind -> Z.t array diff --git a/Utils/Zkey.ml b/Utils/Zkey.ml index 28e0d25..5c87239 100644 --- a/Utils/Zkey.ml +++ b/Utils/Zkey.ml @@ -6,6 +6,7 @@ type kind = | Kind_3 | Kind_6 | Kind_12 +| Kind_9 | Kind_4 | Kind_2 | Kind_1 @@ -34,6 +35,14 @@ let of_int_array ~kind a = (Int64.of_int a.(6)) << a.(7) << a.(8) << a.(9) << a.(10) << a.(11) |> Z.of_int64 in a <| b + | Kind_9 -> + let a = + (Int64.of_int a.(0)) << a.(1) << a.(2) << a.(3) << a.(4) << a.(5) + |> Z.of_int64 + and b = + (Int64.of_int a.(6)) << a.(7) << a.(8) + |> Z.of_int64 + in a <| b | Kind_4 -> (Int64.of_int a.(0)) <+ a.(1) <+ a.(2) <+ a.(3) |> Z.of_int64 | Kind_2 -> (Int64.of_int a.(0)) <+ a.(1) |> Z.of_int64 | Kind_1 -> Z.of_int a.(0) @@ -63,6 +72,15 @@ let to_int_array ~kind a = Z.to_int @@ Z.extract a 20 10 ; Z.to_int @@ Z.extract a 10 10 ; Z.to_int @@ Z.extract a 0 10 |] + | Kind_9 -> [| Z.to_int @@ Z.extract a 84 10 ; + Z.to_int @@ Z.extract a 74 10 ; + Z.to_int @@ Z.extract a 64 10 ; + Z.to_int @@ Z.extract a 50 10 ; + Z.to_int @@ Z.extract a 40 10 ; + Z.to_int @@ Z.extract a 30 10 ; + Z.to_int @@ Z.extract a 20 10 ; + Z.to_int @@ Z.extract a 10 10 ; + Z.to_int @@ Z.extract a 0 10 |] | Kind_4 -> [| Z.to_int @@ Z.extract a 48 16 ; Z.to_int @@ Z.extract a 32 16 ; Z.to_int @@ Z.extract a 16 16 ;