2018-01-17 18:19:38 +01:00
|
|
|
open Util
|
|
|
|
|
|
|
|
type t = {
|
|
|
|
expo : float;
|
|
|
|
expo_inv : float;
|
2018-01-17 19:09:57 +01:00
|
|
|
center_ab: Coordinate.t;
|
2018-01-22 23:19:24 +01:00
|
|
|
center_a : Coordinate.t;
|
2018-01-17 19:09:57 +01:00
|
|
|
center : Coordinate.t;
|
2018-01-17 18:19:38 +01:00
|
|
|
norm_sq : float;
|
2018-02-01 16:09:04 +01:00
|
|
|
norm_coef: float;
|
2018-01-17 18:19:38 +01:00
|
|
|
coef : float;
|
2018-02-01 17:13:47 +01:00
|
|
|
norm_coef_scale : float array;
|
2018-01-17 18:19:38 +01:00
|
|
|
i : int;
|
|
|
|
j : int;
|
2018-01-23 19:26:28 +01:00
|
|
|
shell_a : Contracted_shell.t;
|
|
|
|
shell_b : Contracted_shell.t;
|
2018-01-17 18:19:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
exception Null_contribution
|
|
|
|
|
2018-01-19 18:11:03 +01:00
|
|
|
let create_array ?cutoff p_a p_b =
|
|
|
|
let cutoff, log_cutoff =
|
|
|
|
match cutoff with
|
|
|
|
| None -> -1., max_float
|
|
|
|
| Some cutoff -> cutoff, -. (log cutoff)
|
2018-01-17 18:19:38 +01:00
|
|
|
in
|
|
|
|
|
2018-01-18 00:21:05 +01:00
|
|
|
let center_ab = Coordinate.(
|
|
|
|
Contracted_shell.center p_a |- Contracted_shell.center p_b )
|
2018-01-17 18:19:38 +01:00
|
|
|
in
|
2018-01-17 19:09:57 +01:00
|
|
|
let norm_sq =
|
|
|
|
Coordinate.dot center_ab center_ab
|
|
|
|
in
|
2018-02-01 16:09:04 +01:00
|
|
|
let norm_coef_scale_a =
|
|
|
|
Contracted_shell.norm_coef_scale p_a
|
|
|
|
and norm_coef_scale_b =
|
|
|
|
Contracted_shell.norm_coef_scale p_b
|
|
|
|
in
|
2018-02-01 17:13:47 +01:00
|
|
|
let norm_coef_scale =
|
|
|
|
Array.map (fun v1 ->
|
|
|
|
Array.map (fun v2 -> v1 *. v2) norm_coef_scale_b
|
|
|
|
) norm_coef_scale_a
|
|
|
|
|> Array.to_list
|
|
|
|
|> Array.concat
|
2018-02-01 16:09:04 +01:00
|
|
|
in
|
2018-01-17 19:09:57 +01:00
|
|
|
Array.init (Contracted_shell.size p_a) (fun i ->
|
2018-01-18 00:21:05 +01:00
|
|
|
let p_a_expo_center = Coordinate.(
|
|
|
|
Contracted_shell.expo p_a i |. Contracted_shell.center p_a )
|
2018-01-17 19:09:57 +01:00
|
|
|
in
|
2018-02-01 16:09:04 +01:00
|
|
|
let norm_coef_a =
|
2018-01-17 19:09:57 +01:00
|
|
|
Contracted_shell.norm_coef p_a i
|
|
|
|
in
|
2018-01-17 18:19:38 +01:00
|
|
|
|
2018-01-17 19:09:57 +01:00
|
|
|
Array.init (Contracted_shell.size p_b) (fun j ->
|
|
|
|
try
|
2018-02-01 16:09:04 +01:00
|
|
|
let norm_coef_b =
|
2018-01-17 19:09:57 +01:00
|
|
|
Contracted_shell.norm_coef p_b j
|
|
|
|
in
|
2018-02-01 16:09:04 +01:00
|
|
|
let norm_coef =
|
|
|
|
norm_coef_a *. norm_coef_b
|
2018-01-17 19:09:57 +01:00
|
|
|
in
|
2018-02-01 16:09:04 +01:00
|
|
|
if (norm_coef < cutoff) then
|
2018-01-17 19:09:57 +01:00
|
|
|
raise Null_contribution;
|
2018-01-18 00:21:05 +01:00
|
|
|
let p_b_expo_center = Coordinate.(
|
|
|
|
Contracted_shell.expo p_b j |. Contracted_shell.center p_b )
|
2018-01-17 19:09:57 +01:00
|
|
|
in
|
|
|
|
let expo = Contracted_shell.(expo p_a i +. expo p_b j) in
|
|
|
|
let expo_inv = 1. /. expo in
|
2018-01-18 00:21:05 +01:00
|
|
|
let center = Coordinate.(
|
|
|
|
expo_inv |. (p_a_expo_center |+ p_b_expo_center ) )
|
2018-01-17 19:09:57 +01:00
|
|
|
in
|
|
|
|
let argexpo =
|
|
|
|
Contracted_shell.(expo p_a i *. expo p_b j) *. norm_sq *. expo_inv
|
|
|
|
in
|
|
|
|
if (argexpo > log_cutoff) then
|
|
|
|
raise Null_contribution;
|
|
|
|
let g =
|
|
|
|
(pi *. expo_inv)**(1.5) *. exp(-. argexpo)
|
|
|
|
in
|
|
|
|
let coef =
|
2018-02-01 16:09:04 +01:00
|
|
|
norm_coef *. Contracted_shell.(coef p_a i *. coef p_b j) *. g
|
2018-01-17 19:09:57 +01:00
|
|
|
in
|
|
|
|
if (abs_float coef < cutoff) then
|
|
|
|
raise Null_contribution;
|
2018-01-22 23:19:24 +01:00
|
|
|
let center_a =
|
|
|
|
Coordinate.(center |- Contracted_shell.center p_a)
|
|
|
|
in
|
2018-02-01 17:13:47 +01:00
|
|
|
Some { i ; j ; shell_a=p_a ; shell_b=p_b ; norm_coef ; coef ; expo ; expo_inv ; center ; center_a ; center_ab ; norm_sq ; norm_coef_scale }
|
2018-01-17 19:09:57 +01:00
|
|
|
with
|
|
|
|
| Null_contribution -> None
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|> Array.to_list
|
|
|
|
|> Array.concat
|
|
|
|
|> Array.to_list
|
|
|
|
|> List.filter (function Some _ -> true | None -> false)
|
|
|
|
|> List.map (function Some x -> x | None -> assert false)
|
|
|
|
|> Array.of_list
|
2018-01-17 18:19:38 +01:00
|
|
|
|
2018-01-22 23:19:24 +01:00
|
|
|
open Util
|
|
|
|
|