From 01b56ea5f88d0df01c56ed3f95b7da084019a1b3 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 6 Feb 2020 19:36:57 +0100 Subject: [PATCH] Removed Schwarz screening in f12 --- MOBasis/HF12.ml | 72 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/MOBasis/HF12.ml b/MOBasis/HF12.ml index 90fbada..d0a0693 100644 --- a/MOBasis/HF12.ml +++ b/MOBasis/HF12.ml @@ -290,6 +290,7 @@ let make ~frozen_core ~simulation ~mo_basis ~aux_basis_filename () = let f_one = fun _ _ _ -> 0. in +(* let s, s' = Spin.(Alfa, Beta) in let m_3_Hschwarz_aa = array_3_init mo_num mo_num mo_num (fun i j k -> @@ -320,12 +321,13 @@ let make ~frozen_core ~simulation ~mo_basis ~aux_basis_filename () = (s3 = s4 && m_3_Fschwarz_aa.{l,m,n} < eps ) || (s3 <> s4 && m_3_Fschwarz_ab.{l,m,n} < eps ) then + 0. + else Array.fold_left (fun accu a -> accu +. h_two a i j k s1 s2 *. f_two a l m n s3 s4 ) 0. mos_cabs - else - 0. in +*) (* Pre-compute dressed integrals *) if Parallel.master then Printf.printf "Computing m_0111_1H_1F\n%!" ; @@ -1011,6 +1013,10 @@ let make ~frozen_core ~simulation ~mo_basis ~aux_basis_filename () = in + let ncabs = Array.length mos_cabs in + let tmp_h = Mat.make0 ncabs 9 in + let tmp_f = Mat.make0 ncabs 9 in + let f_3 ki kj = let i, j, m, k, l, n, s1, s2, s3, phase = match Excitation.of_det ki kj with @@ -1037,7 +1043,7 @@ let make ~frozen_core ~simulation ~mo_basis ~aux_basis_filename () = +. sum mos_cabs (fun a -> h_two a n j m s2 s3 *. f_two a i l k s2 s1) +. sum mos_cabs (fun a -> h_two a k j m s2 s3 *. f_two a i n l s3 s1) -. sum mos_cabs (fun a -> h_two a l j m s2 s3 *. f_two a i n k s3 s1) - *) + sum_schwarz k i j m n l s1 s2 s3 s3 +. sum_schwarz n i j m l k s1 s2 s2 s3 -. sum_schwarz l i j m n k s1 s2 s3 s3 @@ -1047,6 +1053,26 @@ let make ~frozen_core ~simulation ~mo_basis ~aux_basis_filename () = +. sum_schwarz n j m i l k s2 s3 s2 s1 +. sum_schwarz k j m i n l s2 s3 s3 s1 -. sum_schwarz l j m i n k s2 s3 s3 s1 + *) + Array.iteri (fun idx a -> tmp_f.{idx+1,7} <- f_two a i l k s2 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,5} <- f_two a j l k s2 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,2} <- f_two a m l k s2 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,9} <- f_two a i n k s3 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,4} <- f_two a j n k s3 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,3} <- f_two a m n k s3 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,8} <- f_two a i n l s3 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,6} <- f_two a j n l s3 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,1} <- f_two a m n l s3 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,3} <- if tmp_f.{idx+1,3} = 0. then 0. else -. h_two a l i j s1 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,1} <- if tmp_f.{idx+1,1} = 0. then 0. else h_two a k i j s1 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,2} <- if tmp_f.{idx+1,2} = 0. then 0. else h_two a n i j s1 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,5} <- if tmp_f.{idx+1,5} = 0. then 0. else -. h_two a n i m s1 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,6} <- if tmp_f.{idx+1,6} = 0. then 0. else -. h_two a k i m s1 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,4} <- if tmp_f.{idx+1,4} = 0. then 0. else h_two a l i m s1 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,9} <- if tmp_f.{idx+1,9} = 0. then 0. else -. h_two a l j m s2 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,7} <- if tmp_f.{idx+1,7} = 0. then 0. else h_two a n j m s2 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,8} <- if tmp_f.{idx+1,8} = 0. then 0. else h_two a k j m s2 s3) mos_cabs; + dot (Mat.as_vec tmp_h) (Mat.as_vec tmp_f) | Alfa, Alfa, Beta | Beta, Beta, Alfa -> (* @@ -1058,7 +1084,7 @@ let make ~frozen_core ~simulation ~mo_basis ~aux_basis_filename () = -. sum mos_cabs (fun a -> h_two a l m i s3 s1 *. f_two a j n k s3 s2) +. sum mos_cabs (fun a -> h_two a n j m s2 s3 *. f_two a i l k s2 s1) -. sum mos_cabs (fun a -> h_two a n i m s1 s3 *. f_two a j l k s2 s2) - *) + sum_schwarz l i j m k n s1 s2 s1 s3 -. sum_schwarz k i j m l n s1 s2 s1 s3 +. sum_schwarz l m j i n k s3 s2 s3 s1 @@ -1067,6 +1093,24 @@ let make ~frozen_core ~simulation ~mo_basis ~aux_basis_filename () = -. sum_schwarz l m i j n k s3 s1 s3 s2 +. sum_schwarz n j m i l k s2 s3 s2 s1 -. sum_schwarz n i m j l k s1 s3 s2 s2 + *) + Array.iteri (fun idx a -> tmp_f.{idx+1,1} <- f_two a m k n s1 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,2} <- f_two a m l n s1 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,4} <- f_two a i n l s3 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,5} <- f_two a j n l s3 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,3} <- f_two a i n k s3 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,6} <- f_two a j n k s3 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,7} <- f_two a i l k s2 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,8} <- f_two a j l k s2 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,1} <- if tmp_f.{idx+1,1} = 0. then 0. else h_two a l i j s1 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,2} <- if tmp_f.{idx+1,2} = 0. then 0. else -. h_two a k i j s1 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,3} <- if tmp_f.{idx+1,3} = 0. then 0. else +. h_two a l m j s3 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,4} <- if tmp_f.{idx+1,4} = 0. then 0. else -. h_two a k m j s3 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,5} <- if tmp_f.{idx+1,5} = 0. then 0. else +. h_two a k m i s3 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,6} <- if tmp_f.{idx+1,6} = 0. then 0. else -. h_two a l m i s3 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,7} <- if tmp_f.{idx+1,7} = 0. then 0. else +. h_two a n j m s2 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,8} <- if tmp_f.{idx+1,8} = 0. then 0. else -. h_two a n i m s1 s3) mos_cabs; + dot ~n:(8*ncabs) (Mat.as_vec tmp_h) (Mat.as_vec tmp_f) | Alfa, Beta, Beta | Beta, Alfa, Alfa -> (* @@ -1078,7 +1122,7 @@ let make ~frozen_core ~simulation ~mo_basis ~aux_basis_filename () = -. sum mos_cabs (fun a -> h_two a l j m s2 s3 *. f_two a i n k s3 s1) +. sum mos_cabs (fun a -> h_two a k m i s3 s1 *. f_two a j n l s3 s2) -. sum mos_cabs (fun a -> h_two a k j i s2 s1 *. f_two a m n l s3 s2) - *) + sum_schwarz l i j m k n s1 s2 s1 s3 -. sum_schwarz n i j m k l s1 s2 s1 s2 +. sum_schwarz n i m j k l s1 s3 s1 s2 @@ -1087,6 +1131,24 @@ let make ~frozen_core ~simulation ~mo_basis ~aux_basis_filename () = -. sum_schwarz l j m i n k s2 s3 s3 s1 +. sum_schwarz k m i j n l s3 s1 s3 s2 -. sum_schwarz k j i m n l s2 s1 s3 s2 + *) + Array.iteri (fun idx a -> tmp_f.{idx+1,6} <- f_two a i n k s3 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,4} <- f_two a i l k s2 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,5} <- f_two a j k n s1 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,1} <- f_two a m k n s1 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,2} <- f_two a m k l s1 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,3} <- f_two a j k l s1 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,7} <- f_two a j n l s3 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_f.{idx+1,8} <- f_two a m n l s3 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,1} <- if tmp_f.{idx+1,1} = 0. then 0. else h_two a l i j s1 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,2} <- if tmp_f.{idx+1,2} = 0. then 0. else -. h_two a n i j s1 s2) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,3} <- if tmp_f.{idx+1,3} = 0. then 0. else +. h_two a n i m s1 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,4} <- if tmp_f.{idx+1,4} = 0. then 0. else +. h_two a n j m s2 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,5} <- if tmp_f.{idx+1,5} = 0. then 0. else -. h_two a l i m s1 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,6} <- if tmp_f.{idx+1,6} = 0. then 0. else -. h_two a l j m s2 s3) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,7} <- if tmp_f.{idx+1,7} = 0. then 0. else +. h_two a k m i s3 s1) mos_cabs; + Array.iteri (fun idx a -> tmp_h.{idx+1,8} <- if tmp_f.{idx+1,8} = 0. then 0. else -. h_two a k j i s2 s1) mos_cabs; + dot ~n:(8*ncabs) (Mat.as_vec tmp_h) (Mat.as_vec tmp_f) | Beta, Alfa, Beta | Alfa, Beta, Alfa -> assert false in