mirror of
https://gitlab.com/scemama/QCaml.git
synced 2024-12-22 12:23:31 +01:00
Small optimizations
This commit is contained in:
parent
fead8dce5b
commit
9c9fc0a9e6
@ -45,14 +45,17 @@ let compute_norm_coef s =
|
|||||||
Angular_momentum.to_int s.totAngMom
|
Angular_momentum.to_int s.totAngMom
|
||||||
in
|
in
|
||||||
Array.mapi (fun i alpha ->
|
Array.mapi (fun i alpha ->
|
||||||
|
let alpha_2 =
|
||||||
|
alpha +. alpha
|
||||||
|
in
|
||||||
let c =
|
let c =
|
||||||
((alpha +. alpha) *. pi_inv)**(1.5) *. (pow (4. *. alpha) atot)
|
(alpha_2 *. pi_inv)**(1.5) *. (pow (alpha_2 +. alpha_2) atot)
|
||||||
in
|
in
|
||||||
let result a =
|
let result a =
|
||||||
let dfa = Array.map (fun j ->
|
let dfa = Array.map (fun j ->
|
||||||
fact (j+j) /. ( float_of_int (1 lsl j) *. fact j)
|
( float_of_int (1 lsl j) *. fact j) /. fact (j+j)
|
||||||
) a
|
) a
|
||||||
in sqrt (c /. (dfa.(0) *.dfa.(1) *. dfa.(2)))
|
in sqrt (c *. dfa.(0) *.dfa.(1) *. dfa.(2))
|
||||||
in
|
in
|
||||||
result
|
result
|
||||||
) s.expo
|
) s.expo
|
||||||
|
@ -22,11 +22,11 @@ let hvrr_two_e m (angMom_a, angMom_b, angMom_c, angMom_d)
|
|||||||
|
|
||||||
(** Vertical recurrence relations *)
|
(** Vertical recurrence relations *)
|
||||||
let rec vrr0 m angMom_a = function
|
let rec vrr0 m angMom_a = function
|
||||||
| 0 -> zero_m_array.(m)
|
|
||||||
| 1 -> let i = if angMom_a.(0) = 1 then 0 else if angMom_a.(1) = 1 then 1 else 2
|
| 1 -> let i = if angMom_a.(0) = 1 then 0 else if angMom_a.(1) = 1 then 1 else 2
|
||||||
in expo_inv_p *.( (Coordinate.coord center_pq i) *. zero_m_array.(m+1)
|
in expo_inv_p *.( (Coordinate.coord center_pq i) *. zero_m_array.(m+1)
|
||||||
-. expo_b *. (Coordinate.coord center_ab i) *. zero_m_array.(m) )
|
-. expo_b *. (Coordinate.coord center_ab i) *. zero_m_array.(m) )
|
||||||
|
|
||||||
|
| 0 -> zero_m_array.(m)
|
||||||
| totAngMom_a ->
|
| totAngMom_a ->
|
||||||
let key = Zkey.of_int_tuple (Zkey.Three
|
let key = Zkey.of_int_tuple (Zkey.Three
|
||||||
(angMom_a.(0)+1, angMom_a.(1)+1, angMom_a.(2)+1) )
|
(angMom_a.(0)+1, angMom_a.(1)+1, angMom_a.(2)+1) )
|
||||||
@ -196,74 +196,40 @@ let contracted_class_shell_pairs ~zero_m ?schwartz_p ?schwartz_q shell_p shell_q
|
|||||||
|
|
||||||
(* Compute all integrals in the shell for each pair of significant shell pairs *)
|
(* Compute all integrals in the shell for each pair of significant shell pairs *)
|
||||||
|
|
||||||
begin
|
for ab=0 to (Array.length shell_p - 1) do
|
||||||
match Contracted_shell.(totAngMom shell_a, totAngMom shell_b,
|
let cab = shell_p.(ab).Shell_pair.coef in
|
||||||
totAngMom shell_c, totAngMom shell_d) with
|
let b = shell_p.(ab).Shell_pair.j in
|
||||||
| Angular_momentum.(S,S,S,S) ->
|
for cd=0 to (Array.length shell_q - 1) do
|
||||||
begin
|
let coef_prod =
|
||||||
for ab=0 to (Array.length shell_p - 1) do
|
cab *. shell_q.(cd).Shell_pair.coef
|
||||||
for cd=0 to (Array.length shell_q - 1) do
|
in
|
||||||
let coef_prod =
|
(** Screening on the product of coefficients *)
|
||||||
shell_p.(ab).Shell_pair.coef *. shell_q.(cd).Shell_pair.coef
|
try
|
||||||
in
|
if (abs_float coef_prod) < 1.e-4*.cutoff then
|
||||||
(** Screening on the product of coefficients *)
|
raise NullQuartet;
|
||||||
try
|
|
||||||
if (abs_float coef_prod) < 1.e-4*.cutoff then
|
|
||||||
raise NullQuartet;
|
|
||||||
|
|
||||||
let expo_pq_inv =
|
let expo_pq_inv =
|
||||||
shell_p.(ab).Shell_pair.expo_inv +. shell_q.(cd).Shell_pair.expo_inv
|
shell_p.(ab).Shell_pair.expo_inv +. shell_q.(cd).Shell_pair.expo_inv
|
||||||
in
|
in
|
||||||
let center_pq =
|
let center_pq =
|
||||||
Coordinate.(shell_p.(ab).Shell_pair.center |- shell_q.(cd).Shell_pair.center)
|
Coordinate.(shell_p.(ab).Shell_pair.center |- shell_q.(cd).Shell_pair.center)
|
||||||
in
|
in
|
||||||
let norm_pq_sq =
|
let norm_pq_sq =
|
||||||
Coordinate.dot center_pq center_pq
|
Coordinate.dot center_pq center_pq
|
||||||
in
|
in
|
||||||
|
|
||||||
let zero_m_array =
|
let zero_m_array =
|
||||||
zero_m ~maxm ~expo_pq_inv ~norm_pq_sq
|
zero_m ~maxm ~expo_pq_inv ~norm_pq_sq
|
||||||
in
|
in
|
||||||
|
begin
|
||||||
let coef_prod =
|
match Contracted_shell.(totAngMom shell_a, totAngMom shell_b,
|
||||||
shell_p.(ab).Shell_pair.coef *. shell_q.(cd).Shell_pair.coef
|
totAngMom shell_c, totAngMom shell_d) with
|
||||||
in
|
| Angular_momentum.(S,S,S,S) ->
|
||||||
let integral =
|
let integral =
|
||||||
zero_m_array.(0)
|
zero_m_array.(0)
|
||||||
in
|
in
|
||||||
contracted_class.(0) <- contracted_class.(0) +. coef_prod *. integral
|
contracted_class.(0) <- contracted_class.(0) +. coef_prod *. integral
|
||||||
with NullQuartet -> ()
|
| _ ->
|
||||||
done
|
|
||||||
done;
|
|
||||||
end
|
|
||||||
|
|
||||||
| _ ->
|
|
||||||
begin
|
|
||||||
for ab=0 to (Array.length shell_p - 1) do
|
|
||||||
let b = shell_p.(ab).Shell_pair.j in
|
|
||||||
for cd=0 to (Array.length shell_q - 1) do
|
|
||||||
try
|
|
||||||
let coef_prod =
|
|
||||||
shell_p.(ab).Shell_pair.coef *. shell_q.(cd).Shell_pair.coef
|
|
||||||
in
|
|
||||||
(** Screening on the product of coefficients *)
|
|
||||||
if (abs_float coef_prod) < 1.e-4*.cutoff then
|
|
||||||
raise NullQuartet;
|
|
||||||
|
|
||||||
let expo_pq_inv =
|
|
||||||
shell_p.(ab).Shell_pair.expo_inv +. shell_q.(cd).Shell_pair.expo_inv
|
|
||||||
in
|
|
||||||
let center_pq =
|
|
||||||
Coordinate.(shell_p.(ab).Shell_pair.center |- shell_q.(cd).Shell_pair.center)
|
|
||||||
in
|
|
||||||
let norm_pq_sq =
|
|
||||||
Coordinate.dot center_pq center_pq
|
|
||||||
in
|
|
||||||
|
|
||||||
let zero_m_array =
|
|
||||||
zero_m ~maxm ~expo_pq_inv ~norm_pq_sq
|
|
||||||
in
|
|
||||||
|
|
||||||
let d = shell_q.(cd).Shell_pair.j in
|
let d = shell_q.(cd).Shell_pair.j in
|
||||||
let map = Array.init maxm (fun _ -> Zmap.create (Array.length class_indices)) in
|
let map = Array.init maxm (fun _ -> Zmap.create (Array.length class_indices)) in
|
||||||
(* Compute the integral class from the primitive shell quartet *)
|
(* Compute the integral class from the primitive shell quartet *)
|
||||||
@ -323,11 +289,10 @@ let contracted_class_shell_pairs ~zero_m ?schwartz_p ?schwartz_q shell_p shell_q
|
|||||||
contracted_class.(i) <- contracted_class.(i) +. coef_prod *. integral
|
contracted_class.(i) <- contracted_class.(i) +. coef_prod *. integral
|
||||||
with NullQuartet -> ()
|
with NullQuartet -> ()
|
||||||
) class_indices
|
) class_indices
|
||||||
with NullQuartet -> ()
|
end
|
||||||
done
|
with NullQuartet -> ()
|
||||||
done;
|
done
|
||||||
end
|
done;
|
||||||
end;
|
|
||||||
|
|
||||||
let result =
|
let result =
|
||||||
Zmap.create (Array.length contracted_class)
|
Zmap.create (Array.length contracted_class)
|
||||||
|
@ -27,7 +27,6 @@ let hvrr_two_e_vector m (angMom_a, angMom_b, angMom_c, angMom_d)
|
|||||||
|
|
||||||
(** Vertical recurrence relations *)
|
(** Vertical recurrence relations *)
|
||||||
let rec vrr0_v m angMom_a = function
|
let rec vrr0_v m angMom_a = function
|
||||||
| 0 -> Array.mapi (fun k c -> c *. zero_m_array.(k).(m)) coef_prod
|
|
||||||
| 1 -> let i = if angMom_a.(0) = 1 then 0 else if angMom_a.(1) = 1 then 1 else 2
|
| 1 -> let i = if angMom_a.(0) = 1 then 0 else if angMom_a.(1) = 1 then 1 else 2
|
||||||
in
|
in
|
||||||
let f = expo_b *. (Coordinate.coord center_ab i) in
|
let f = expo_b *. (Coordinate.coord center_ab i) in
|
||||||
@ -35,6 +34,7 @@ let hvrr_two_e_vector m (angMom_a, angMom_b, angMom_c, angMom_d)
|
|||||||
( (Coordinate.coord center_pq.(k) i) *. zero_m_array.(k).(m+1)
|
( (Coordinate.coord center_pq.(k) i) *. zero_m_array.(k).(m+1)
|
||||||
-. f *. zero_m_array.(k).(m) ) ) coef_prod
|
-. f *. zero_m_array.(k).(m) ) ) coef_prod
|
||||||
|
|
||||||
|
| 0 -> Array.mapi (fun k c -> c *. zero_m_array.(k).(m)) coef_prod
|
||||||
| totAngMom_a ->
|
| totAngMom_a ->
|
||||||
let key = Zkey.of_int_tuple (Zkey.Three
|
let key = Zkey.of_int_tuple (Zkey.Three
|
||||||
(angMom_a.(0)+1, angMom_a.(1)+1, angMom_a.(2)+1) )
|
(angMom_a.(0)+1, angMom_a.(1)+1, angMom_a.(2)+1) )
|
||||||
|
@ -11,6 +11,10 @@ let speclist = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
let run ~out =
|
let run ~out =
|
||||||
|
(*
|
||||||
|
let gc = Gc.get () in
|
||||||
|
Gc.set { gc with minor_heap_size=(262144 / 16) };
|
||||||
|
*)
|
||||||
let out_file =
|
let out_file =
|
||||||
match out with
|
match out with
|
||||||
| None -> raise (Invalid_argument "Output file should be specified with -o")
|
| None -> raise (Invalid_argument "Output file should be specified with -o")
|
||||||
|
Loading…
Reference in New Issue
Block a user