10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-11-06 22:23:42 +01:00

Notebook 0 2 22 and 1 2 22 OK

This commit is contained in:
Anthony Scemama 2019-12-04 18:13:54 +01:00
parent e1efc10289
commit 537c5540c4

View File

@ -235,8 +235,10 @@
]
},
{
"cell_type": "raw",
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"let () = ignore @@ MOBasis.f12_ints aux_basis\n",
"let () = ignore @@ MOBasis.two_e_ints aux_basis"
@ -246,14 +248,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Determinant-based functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Integrals"
"## Integral-based functions"
]
},
{
@ -286,30 +281,117 @@
"source": [
"let cancel_singles = false \n",
"\n",
"let f12_integrals mo_basis =\n",
"\n",
"let mos_cabs = \n",
" Util.list_range (mo_num+1) aux_num\n",
" \n",
" let two_e_ints = MOBasis.f12_ints mo_basis in\n",
" let f2 i j k l s s' =\n",
" let ijkl = F12.get_phys two_e_ints i j k l in\n",
" let ijlk = F12.get_phys two_e_ints i j l k in\n",
" if s' <> s then\n",
" ijkl \n",
" else\n",
" (ijkl -. ijlk) \n",
"let mos_in = \n",
" Util.list_range 1 mo_num\n",
"\n",
"let mos_a k =\n",
" Determinant.alfa k\n",
" |> Spindeterminant.to_list\n",
" \n",
"let mos_b k =\n",
" Determinant.beta k\n",
" |> Spindeterminant.to_list\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### H integrals"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"let h_one =\n",
" let h = \n",
" MOBasis.one_e_ints aux_basis\n",
" in fun i j _ -> h.{i,j}\n",
" \n",
"let h_two = \n",
" let two_e_ints = MOBasis.two_e_ints aux_basis in\n",
" let h2 i j k l (s:Spin.t) (s':Spin.t) =\n",
" if s' <> s then\n",
" ERI.get_phys two_e_ints i j k l\n",
" else\n",
" (ERI.get_phys two_e_ints i j k l) -. \n",
" (ERI.get_phys two_e_ints i j l k)\n",
" in\n",
" ( (fun _ _ _ -> 0.),\n",
" (if cancel_singles then\n",
" (fun i j k l s s' ->\n",
" (* Required to cancel out single excitations *)\n",
" if (i=k && j<>l) || (j=l && i<>k) then\n",
" 0.\n",
" else\n",
" f2 i j k l s s'\n",
" ) \n",
" else f2),\n",
" None\n",
" )\n",
" h2\n",
"\n",
" \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### F12 integrals"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"let f_two = \n",
" let two_e_ints = MOBasis.f12_ints aux_basis in\n",
" let f2 i j k l (s:Spin.t) (s':Spin.t) =\n",
" if s' <> s then\n",
" 0.5 *. F12.get_phys two_e_ints i j k l\n",
" else\n",
" 0.5 *. (\n",
" (F12.get_phys two_e_ints i j k l) -. \n",
" (F12.get_phys two_e_ints i j l k) )\n",
" in\n",
" let f3 i j k l (s:Spin.t) (s':Spin.t) = \n",
" if (i=k && j<>l) || (j=l && i<>k) then\n",
" 0.\n",
" else\n",
" f2 i j k l s s'\n",
" in\n",
" if cancel_singles then f3 else f2\n",
"\n",
"let f_one = fun _ _ _ -> 0.\n",
"\n",
"(*\n",
"let f_two = h_two\n",
"\n",
"let f_one = h_one\n",
"*)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Determinant-based functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Integrals"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"let f12_integrals mo_basis =\n",
" ( f_one, f_two, None )\n",
"\n",
"let h_ij mo_basis ki kj =\n",
" let integrals =\n",
@ -353,7 +435,7 @@
"outputs": [],
"source": [
"let is_a_double det_space =\n",
" let mo_class = DeterminantSpace.mo_class det_space in\n",
" let mo_class = DeterminantSpace.mo_class det_space in\n",
" let mo_num = Array.length @@ MOClass.mo_class_array mo_class in\n",
" let m l =\n",
" List.fold_left (fun accu i ->\n",
@ -423,7 +505,8 @@
"let ci = CI.make ~n_states:state in_space\n",
"\n",
"let ci_coef, ci_energy = Lazy.force ci.eigensystem \n",
"\n"
"\n",
"let _ = print_newline () \n"
]
},
{
@ -438,7 +521,7 @@
"metadata": {},
"source": [
"let p12 det_space =\n",
" let mo_class = DeterminantSpace.mo_class det_space in\n",
" let mo_class = DeterminantSpace.mo_class det_space in\n",
" let mo_num = Array.length @@ MOClass.mo_class_array mo_class in\n",
" let m l =\n",
" List.fold_left (fun accu i ->\n",
@ -477,20 +560,6 @@
" \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Integral-based functions"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
@ -518,9 +587,7 @@
},
{
"cell_type": "raw",
"metadata": {
"collapsed": true
},
"metadata": {},
"source": [
"let m_H_aux, m_F_aux = \n",
" \n",
@ -573,10 +640,6 @@
"metadata": {},
"outputs": [],
"source": [
"let mos_cabs = \n",
" Util.list_range (mo_num+1) aux_num\n",
"\n",
"\n",
"let generate_alphas ki kj exc cabs l r =\n",
" (* Check input excitation degree *)\n",
" let d = Determinant.degree ki kj in\n",
@ -637,7 +700,7 @@
" List.map (fun particle' ->\n",
" Some (Determinant.double_excitation Spin.Alfa hole particle Spin.Beta hole' particle' ki)\n",
" ) mos_cabs\n",
" ) mos_a \n",
" ) mos_b \n",
" ) mos_cabs\n",
" ) mos_a\n",
" ]\n",
@ -646,6 +709,7 @@
" |> List.concat\n",
" |> List.concat\n",
" |> Util.list_some\n",
" |> List.filter (fun x -> Determinant.is_none x = false)\n",
" |> List.map (fun x -> Determinant.set_phase Phase.Pos x)\n",
" in\n",
"\n",
@ -703,45 +767,58 @@
" \n",
" \n",
"let compute_HaaF ki alphas kj =\n",
" List.fold_left (fun accu alpha -> accu\n",
" List.fold_left (fun accu alpha -> accu\n",
" +. h_ij aux_basis ki alpha\n",
" *. f_ij aux_basis alpha kj\n",
" ) 0. alphas\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"let ki = det_I.(0) \n",
"let kj = det_I.(0)\n",
"let alphas =\n",
" generate_alphas ki kj 0 1 1 1\n",
"let check n integral_value exc cabs lexc rexc =\n",
" let det_list =\n",
" match n with\n",
" | 0 -> det_I\n",
" | n -> Array.sub det_I 0 n\n",
" in\n",
" Printf.printf \"Checking...\\n%!\";\n",
" let result =\n",
" Array.mapi (fun i ki -> \n",
" Array.mapi (fun j kj -> \n",
" if i > j then 0. else\n",
" if Determinant.degree ki kj <> exc then 0. else\n",
" let alphas = generate_alphas ki kj exc cabs lexc rexc in\n",
" let det_value =\n",
" compute_HaaF ki alphas kj\n",
" in\n",
" integral_value ki kj -. det_value \n",
" ) det_list\n",
" ) det_list\n",
" |> Array.to_list\n",
" |> Array.concat\n",
" in\n",
" let error = \n",
" Array.fold_left (fun accu x -> accu +. x *. x) 0. result\n",
" /. (float_of_int @@ Array.length result)\n",
" in\n",
" if error < epsilon_float then\n",
" Printf.printf \"OK: %e\\n%!\" error\n",
" else\n",
" Printf.printf \"Failed: %e\\n%!\" error\n",
"\n",
"let _ =\n",
" compute_HaaF ki alphas kj\n",
"\n",
" \n",
"(*\n",
"|> SetDet.iter (fun x -> Format.printf \"@[%a@]@;\" (Determinant.pp 24) x)\n",
"*)"
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"cell_type": "markdown",
"metadata": {},
"outputs": [],
"source": []
"source": [
"# 0 2 22"
]
},
{
"cell_type": "code",
@ -751,14 +828,20 @@
},
"outputs": [],
"source": [
"String.concat"
"png_image \"0_2_22.png\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 0 1 11"
"$i,j$ : orbital indices of MOs occupied in $|I\\rangle$.\n",
"\n",
"$$\n",
"\\sum_{j} \\sum_{i<j} \\sum_{b}\\sum_{a<b}\n",
" \\langle i j || a b \\rangle \n",
" \\left[ ab || ij \\right]\n",
"$$"
]
},
{
@ -767,7 +850,115 @@
"metadata": {},
"outputs": [],
"source": [
"png_image \"0_1_11.png\""
"let integral_value ki kj = \n",
" (* Alpha-Beta *)\n",
" let s, s' = Spin.(Alfa, Beta) in\n",
" List.fold_left (fun accu j -> accu +. \n",
" List.fold_left (fun accu i -> accu +. \n",
" List.fold_left (fun accu b -> accu +. \n",
" List.fold_left (fun accu a ->\n",
" accu +. h_two i j a b s s' *. f_two a b i j s s'\n",
" ) 0. mos_cabs\n",
" ) 0. mos_cabs\n",
" ) 0. (mos_a ki)\n",
" ) 0. (mos_b ki)\n",
" +.\n",
" (* Alpha-Alpha / Beta-Beta *)\n",
" List.fold_left (fun accu (mos,s) -> \n",
" let s' = s in accu +.\n",
" List.fold_left (fun accu j -> accu +. \n",
" List.fold_left (fun accu i -> accu +. \n",
" if i < j then accu else\n",
" List.fold_left (fun accu b -> accu +. \n",
" List.fold_left (fun accu a -> \n",
" if b > a then accu else\n",
" accu +. h_two i j a b s s' *. f_two a b i j s s'\n",
" ) 0. mos_cabs\n",
" ) 0. mos_cabs\n",
" ) 0. mos\n",
" ) 0. mos\n",
" ) 0. [ (mos_a ki,Spin.Alfa) ; (mos_b ki,Spin.Beta)]\n",
" \n",
"let _ =\n",
" check 10 integral_value 0 2 2 2\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1 2 22"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"png_image \"1_2_22.png\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$|J\\rangle = \\hat{T}_{i}^{k}|I\\rangle$\n",
"\n",
"$j$ : orbital indices of MOs occupied both in $|I\\rangle$ and $|J\\rangle$.\n",
"\n",
"\n",
"$$\n",
"\\sum_{j} \\sum_{b}\\sum_{a<b}\n",
" \\langle i j || a b \\rangle \n",
" \\left[ ab || kj \\right]\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"let integral_value ki kj = \n",
" let h, p, s, phase =\n",
" match Excitation.of_det ki kj with\n",
" | Excitation.(Single (phase, { hole ; particle ; spin })) ->\n",
" hole, particle, spin, phase\n",
" | _ -> assert false\n",
" in\n",
" \n",
" let mos, mos' =\n",
" match s with\n",
" | Spin.Alfa -> mos_a ki, mos_b ki\n",
" | Spin.Beta -> mos_b ki, mos_a ki\n",
" in\n",
"\n",
" (* Alpha-Beta *)\n",
" let s' = Spin.other s in\n",
" List.fold_left (fun accu j -> accu +. \n",
" List.fold_left (fun accu b -> accu +. \n",
" List.fold_left (fun accu a ->\n",
" accu +. h_two h j a b s s' *. f_two a b p j s s'\n",
" ) 0. mos_cabs\n",
" ) 0. mos_cabs\n",
" ) 0. mos' \n",
" +.\n",
" (* Alpha-Alpha / Beta-Beta *)\n",
" let s' = s in \n",
" List.fold_left (fun accu j -> accu +. \n",
" List.fold_left (fun accu b -> accu +. \n",
" List.fold_left (fun accu a -> \n",
" if b > a then accu else\n",
" accu +. h_two h j a b s s' *. f_two a b p j s s'\n",
" ) 0. mos_cabs\n",
" ) 0. mos_cabs\n",
" ) 0. mos \n",
" \n",
"\n",
"let _ = check 10 integral_value 1 2 2 2"
]
},
{
@ -796,5 +987,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}