10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-11-07 14:43:41 +01:00
QCaml/Notebooks/F12_fast.ipynb
2020-03-30 18:06:21 +02:00

2969 lines
100 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test of F12 matrix elements"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"## Initialization"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-03-30T10:15:59.908500Z",
"start_time": "2020-03-30T10:15:58.731Z"
},
"hidden": true,
"init_cell": true
},
"outputs": [
{
"data": {
"text/plain": [
"val png_image : string -> unit = <fun>\n"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"- : unit = ()\n",
"Findlib has been successfully loaded. Additional directives:\n",
" #require \"package\";; to load a package\n",
" #list;; to list the available packages\n",
" #camlp4o;; to load camlp4 (standard syntax)\n",
" #camlp4r;; to load camlp4 (revised syntax)\n",
" #predicates \"p,q,...\";; to set these predicates\n",
" Topfind.reset();; to force that packages will be reloaded\n",
" #thread;; to enable threads\n",
"\n",
"- : unit = ()\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/scemama/qp2/external/opam/4.10.0/lib/bytes: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/base64: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/base64/base64.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ocaml/compiler-libs: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ocaml/compiler-libs/ocamlcommon.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/result: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/result/result.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ppx_deriving/runtime: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ppx_deriving/runtime/ppx_deriving_runtime.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ppx_deriving_yojson/runtime: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ppx_deriving_yojson/runtime/ppx_deriving_yojson_runtime.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ocaml/unix.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/uuidm: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/uuidm/uuidm.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/easy-format: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/easy-format/easy_format.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/biniou: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/biniou/biniou.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/yojson: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/yojson/yojson.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/jupyter: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/jupyter/jupyter.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/jupyter/notebook: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/jupyter/notebook/jupyter_notebook.cma: loaded\n"
]
},
{
"data": {
"text/plain": [
"val png_image : string -> Jupyter_notebook.display_id = <fun>\n"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/scemama/qp2/external/opam/4.10.0/lib/ocaml/compiler-libs/ocamlbytecomp.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ocaml/compiler-libs/ocamltoplevel.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ocaml/bigarray.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/lacaml: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/lacaml/lacaml.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/lacaml/top: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/lacaml/top/lacaml_top.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/astring: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/astring/astring.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/cmdliner: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/cmdliner/cmdliner.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/seq: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/stdlib-shims: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/stdlib-shims/stdlib_shims.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/fmt: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/fmt/fmt.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/fmt/fmt_cli.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/fmt/fmt_tty.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/re: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/re/re.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/alcotest: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/alcotest/alcotest.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/ocaml/str.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/zarith: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/zarith/zarith.cma: loaded\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/getopt: added to search path\n",
"/home/scemama/qp2/external/opam/4.10.0/lib/getopt/getopt.cma: loaded\n"
]
}
],
"source": [
"let png_image = print_endline ;;\n",
"\n",
"(* --------- *)\n",
"\n",
"#cd \"/home/scemama/QCaml\";;\n",
"#use \"topfind\";;\n",
"#require \"jupyter.notebook\";;\n",
"\n",
"let png_image name = \n",
" Jupyter_notebook.display_file ~base64:true \"image/png\" (\"Notebooks/images/\"^name)\n",
";;\n",
"\n",
"#require \"lacaml.top\";;\n",
"#require \"alcotest\";;\n",
"#require \"str\";;\n",
"#require \"bigarray\";;\n",
"#require \"zarith\";;\n",
"#require \"getopt\";;\n",
"#directory \"_build\";;\n",
"#directory \"_build/Basis\";;\n",
"#directory \"_build/CI\";;\n",
"#directory \"_build/MOBasis\";;\n",
"#directory \"_build/Nuclei\";;\n",
"#directory \"_build/Parallel\";;\n",
"#directory \"_build/Perturbation\";;\n",
"#directory \"_build/SCF\";;\n",
"#directory \"_build/Utils\";;"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Modules"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-03-30T10:16:00.033900Z",
"start_time": "2020-03-30T10:15:58.750Z"
},
"hidden": true,
"init_cell": true
},
"outputs": [],
"source": [
"#load \"Constants.cmo\";;\n",
"#load_rec \"Util.cma\";;\n",
"#load_rec \"Matrix.cmo\";;\n",
"#load_rec \"Simulation.cmo\";;\n",
"#load_rec \"Spindeterminant.cmo\";;\n",
"#load_rec \"Determinant.cmo\";;\n",
"#load_rec \"HartreeFock.cmo\";;\n",
"#load_rec \"MOBasis.cmo\";;\n",
"#load_rec \"F12CI.cmo\";;"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Printers"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-03-30T10:16:00.095400Z",
"start_time": "2020-03-30T10:15:58.760Z"
},
"hidden": true,
"init_cell": true
},
"outputs": [
{
"data": {
"text/plain": [
"val pp_mo : Format.formatter -> MOBasis.t -> unit = <fun>\n"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#install_printer AngularMomentum.pp_string ;;\n",
"#install_printer Basis.pp ;;\n",
"#install_printer Charge.pp ;;\n",
"#install_printer Coordinate.pp ;;\n",
"#install_printer Vector.pp;;\n",
"#install_printer Matrix.pp;;\n",
"#install_printer Util.pp_float_2darray;;\n",
"#install_printer Util.pp_float_array;;\n",
"#install_printer Util.pp_matrix;;\n",
"#install_printer HartreeFock.pp ;;\n",
"#install_printer Fock.pp ;;\n",
"#install_printer MOClass.pp ;;\n",
"let pp_mo ppf t = MOBasis.pp ~start:1 ~finish:0 ppf t ;;\n",
"#install_printer pp_mo;;\n",
"(*\n",
"#install_printer DeterminantSpace.pp;;\n",
"*)\n",
"#install_printer SpindeterminantSpace.pp;;\n",
"#install_printer Bitstring.pp;;\n",
"\n",
"(* --------- *)\n",
"\n",
"open Lacaml.D\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"## Run"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Simulation\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-03-30T10:16:00.287500Z",
"start_time": "2020-03-30T10:15:58.769Z"
},
"hidden": true,
"init_cell": true,
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"val basis_filename : string = \"/home/scemama/qp2/data/basis/6-31g\"\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val aux_basis_filename : string = \"/home/scemama/qp2/data/basis/cc-pvdz\"\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val nuclei : Nuclei.t = [|(Element.C, 0.0000 0.0000 0.0000)|]\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val frozen_core : bool = false\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val multiplicity : int = 1\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val state : int = 1\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val basis : Basis.t =\n",
" \n",
" Atomic Basis set\n",
" ----------------\n",
"\n",
"-----------------------------------------------------------------------\n",
" # Angular Coordinates (Bohr) Exponents Coefficients\n",
" Momentum X Y Z\n",
"-----------------------------------------------------------------------\n",
" 1-3 S 0.0000 0.0000 0.0000 3.04752488e+03 1.83473713e-03\n",
" 4.57369518e+02 1.40373228e-02\n",
" 1.03948685e+02 6.88426223e-02\n",
" 2.92101553e+01 2.32184443e-01\n",
" 9.28666296e+00 4.67941348e-01\n",
" 3.16392696e+00 3.62311985e-01\n",
" \n",
" 7.86827235e+00 -1.19332420e-01\n",
" 1.88128854e+00 -1.60854152e-01\n",
" 5.44249258e-01 1.14345644e+00\n",
" \n",
" 1.68714478e-01 1.00000000e+00\n",
" \n",
" \n",
"-----------------------------------------------------------------------\n",
" 4-9 P 0.0000 0.0000 0.0000 7.86827235e+00 6.89990666e-02\n",
" 1.88128854e+00 3.16423961e-01\n",
" 5.44249258e-01 7.44308291e-01\n",
" \n",
" 1.68714478e-01 1.00000000e+00\n",
" \n",
" \n",
"-----------------------------------------------------------------------\n",
"\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val aux_basis : Basis.t =\n",
" \n",
" Atomic Basis set\n",
" ----------------\n",
"\n",
"-----------------------------------------------------------------------\n",
" # Angular Coordinates (Bohr) Exponents Coefficients\n",
" Momentum X Y Z\n",
"-----------------------------------------------------------------------\n",
" 1-6 S 0.0000 0.0000 0.0000 3.04752488e+03 1.83473713e-03\n",
" 4.57369518e+02 1.40373228e-02\n",
" 1.03948685e+02 6.88426223e-02\n",
" 2.92101553e+01 2.32184443e-01\n",
" 9.28666296e+00 4.67941348e-01\n",
" 3.16392696e+00 3.62311985e-01\n",
" \n",
" 7.86827235e+00 -1.19332420e-01\n",
" 1.88128854e+00 -1.60854152e-01\n",
" 5.44249258e-01 1.14345644e+00\n",
" \n",
" 1.68714478e-01 1.00000000e+00\n",
" \n",
" 6.66500000e+03 6.92000000e-04\n",
" 1.00000000e+03 5.32900000e-03\n",
" 2.28000000e+02 2.70770000e-02\n",
" 6.47100000e+01 1.01718000e-01\n",
" 2.10600000e+01 2.74740000e-01\n",
" 7.49500000e+00 4.48564000e-01\n",
" 2.79700000e+00 2.85074000e-01\n",
" 5.21500000e-01 1.52040000e-02\n",
" 1.59600000e-01 -3.19100000e-03\n",
" \n",
" 6.66500000e+03 -1.46000000e-04\n",
" 1.00000000e+03 -1.15400000e-03\n",
" 2.28000000e+02 -5.72500000e-03\n",
" 6.47100000e+01 -2.33120000e-02\n",
" 2.10600000e+01 -6.39550000e-02\n",
" 7.49500000e+00 -1.49981000e-01\n",
" 2.79700000e+00 -1.27262000e-01\n",
" 5.21500000e-01 5.44529000e-01\n",
" 1.59600000e-01 5.80496000e-01\n",
" \n",
" 1.59600000e-01 1.00000000e+00\n",
" \n",
" \n",
"-----------------------------------------------------------------------\n",
" 4-15 P 0.0000 0.0000 0.0000 7.86827235e+00 6.89990666e-02\n",
" 1.88128854e+00 3.16423961e-01\n",
" 5.44249258e-01 7.44308291e-01\n",
" \n",
" 1.68714478e-01 1.00000000e+00\n",
" \n",
" 9.43900000e+00 3.81090000e-02\n",
" 2.00200000e+00 2.09480000e-01\n",
" 5.45600000e-01 5.08557000e-01\n",
" 1.51700000e-01 4.68842000e-01\n",
" \n",
" 1.51700000e-01 1.00000000e+00\n",
" \n",
" \n",
"-----------------------------------------------------------------------\n",
" 19-24 D 0.0000 0.0000 0.0000 5.50000000e-01 1.00000000e+00\n",
" \n",
" \n",
"-----------------------------------------------------------------------\n",
"\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val f12 : F12factor.t =\n",
" {F12factor.expo_s = 1.;\n",
" gaussian =\n",
" {GaussianOperator.coef_g =\n",
" [ -0.314400 -0.303700 -0.168100 -0.098110 -0.060240 -0.037260 ];\n",
" expo_g =\n",
" [ 0.220900 1.004000 3.622000 12.160000 45.870000 254.400000 ];\n",
" expo_g_inv =\n",
" [ 4.526935 0.996016 0.276091 0.082237 0.021801 0.003931 ]}}\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val charge : int = 0\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val simulation : Simulation.t = <abstr>\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"let basis_filename = \"/home/scemama/qp2/data/basis/6-31g\" \n",
"let aux_basis_filename = \"/home/scemama/qp2/data/basis/cc-pvdz\" \n",
"let nuclei = Nuclei.of_zmt_string \"c\" \n",
"let frozen_core = false\n",
"let multiplicity = 1\n",
"let state = 1\n",
"\n",
"let basis = Basis.of_nuclei_and_basis_filenames ~nuclei [basis_filename] \n",
"let aux_basis = Basis.of_nuclei_and_basis_filenames ~nuclei (basis_filename :: aux_basis_filename :: []) \n",
"let f12 = F12factor.gaussian_geminal 1.0 \n",
"let charge = 0 \n",
"\n",
"\n",
"let simulation =\n",
" Simulation.make \n",
" ~f12 ~charge ~multiplicity ~nuclei\n",
" ~cartesian:true\n",
" basis\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-03-30T10:16:00.298200Z",
"start_time": "2020-03-30T10:15:58.778Z"
},
"hidden": true,
"init_cell": true
},
"outputs": [
{
"data": {
"text/plain": [
"val n_elec_alfa : int = 3\n",
"val n_elec_beta : int = 3\n",
"val n_elec : int = 6\n"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"let n_elec_alfa, n_elec_beta, n_elec = \n",
" let e = Simulation.electrons simulation in\n",
" Electrons.(n_alfa e, n_beta e, n_elec e)"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Hartree-Fock"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-03-30T10:16:00.474000Z",
"start_time": "2020-03-30T10:15:58.786Z"
},
"hidden": true,
"init_cell": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"15 significant shell pairs computed in 0.013028 seconds\n",
"1\n",
"2\n",
"3\n",
"6\n",
"Computed ERIs in 0.083199 seconds\n",
"MOs =\n",
"\n",
"\n",
" -- 1 -- -- 2 -- -- 3 -- -- 4 -- -- 5 --\n",
" 1 0.995189 -0.236456 0 -0 0\n",
" 2 0.0272807 0.573253 0 2.23673E-15 0\n",
" 3 -0.00753288 0.50151 0 -2.90078E-15 0\n",
" ... ... ... ... ...\n",
" 7 -0 -0 0.028973 0.7796 -0.0935272\n",
" 8 -0 -0 0.269658 0.0144514 0.61693\n",
" 9 -0 -0 -0.260237 0.10177 0.628851\n",
" \n",
"\n",
" -- 6 -- -- 7 -- -- 8 -- -- 9 --\n",
" 1 -0 0.0649867 -0 0\n",
" 2 -4.19726E-16 -1.62901 5.23178E-16 0\n",
" 3 -0 1.63955 -1.33409E-15 0\n",
" ... ... ... ...\n",
" 7 0.0892087 0 -0.920636 0.088067\n",
" 8 0.830283 0 -0.0170658 -0.580913\n",
" 9 -0.801275 0 -0.120181 -0.592138\n",
" \n"
]
},
{
"data": {
"text/plain": [
"val hf : HartreeFock.t = \n",
"======================================================================\n",
" Restricted Hartree-Fock \n",
"======================================================================\n",
"\n",
" ------------------------------------------------------------\n",
" # HF energy Convergence HOMO-LUMO\n",
" ------------------------------------------------------------\n",
" 1 -36.54848150 7.4861e-01 0.2723\n",
" ------------------------------------------------------------\n",
"\n",
"\n",
" ============================================================\n",
" One-electron energy -52.6699343629\n",
" Kinetic 42.4526846308\n",
" Potential -95.1226189937\n",
" -------------------------------------------------------- \n",
" Two-electron energy 16.1214528647\n",
" Coulomb 21.8535626014\n",
" Exchange -5.7321097367\n",
" -------------------------------------------------------- \n",
" HF HOMO 0.8237527941\n",
" HF LUMO 8.2337246898\n",
" HF LUMO-LUMO 7.4099718957\n",
" -------------------------------------------------------- \n",
" Electronic energy -36.5484814981\n",
" Nuclear repulsion 0.0000000000\n",
" Hartree-Fock energy -36.5484814981\n",
" ============================================================\n",
" \n",
"\n"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val mo_basis : MOBasis.t =\n",
" Eigenvalues: -11.127416 -0.632049 -0.269831 0.131526 0.151773 \n",
" -- 1 -- -- 2 -- -- 3 -- -- 4 -- -- 5 --\n",
" 1 0.995189 -0.236456 0 -0 0\n",
" 2 0.0272807 0.573253 0 2.23673E-15 0\n",
" 3 -0.00753288 0.50151 0 -2.90078E-15 0\n",
" ... ... ... ... ...\n",
" 7 -0 -0 0.028973 0.7796 -0.0935272\n",
" 8 -0 -0 0.269658 0.0144514 0.61693\n",
" 9 -0 -0 -0.260237 0.10177 0.628851\n",
" \n",
" Eigenvalues: 0.786913 0.828232 0.869410 0.849164 \n",
" -- 6 -- -- 7 -- -- 8 -- -- 9 --\n",
" 1 -0 0.0649867 -0 0\n",
" 2 -4.19726E-16 -1.62901 5.23178E-16 0\n",
" 3 -0 1.63955 -1.33409E-15 0\n",
" ... ... ... ...\n",
" 7 0.0892087 0 -0.920636 0.088067\n",
" 8 0.830283 0 -0.0170658 -0.580913\n",
" 9 -0.801275 0 -0.120181 -0.592138\n",
" \n",
" \n"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"let hf = HartreeFock.make ~guess:`Hcore ~max_scf:1 simulation ;;\n",
"\n",
"let mo_basis = MOBasis.of_hartree_fock hf"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"# FCI-F12"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"## Common functions"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-03-30T10:16:00.507100Z",
"start_time": "2020-03-30T10:15:58.791Z"
},
"hidden": true,
"init_cell": true
},
"outputs": [
{
"data": {
"text/plain": [
"val f12 : F12factor.t =\n",
" {F12factor.expo_s = 1.;\n",
" gaussian =\n",
" {GaussianOperator.coef_g =\n",
" [ -0.314400 -0.303700 -0.168100 -0.098110 -0.060240 -0.037260 ];\n",
" expo_g =\n",
" [ 0.220900 1.004000 3.622000 12.160000 45.870000 254.400000 ];\n",
" expo_g_inv =\n",
" [ 4.526935 0.996016 0.276091 0.082237 0.021801 0.003931 ]}}\n"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val mo_num : int = 9\n"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val pp_spindet : Format.formatter -> Spindeterminant.t -> unit = <fun>\n"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val pp_det : Format.formatter -> Determinant.t -> unit = <fun>\n"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"let f12 = Util.of_some @@ Simulation.f12 simulation \n",
"\n",
"let mo_num = MOBasis.size mo_basis \n",
"\n",
"let pp_spindet = Spindeterminant.pp mo_num\n",
"\n",
"let pp_det = Determinant.pp mo_num\n",
"\n",
";;\n",
"\n",
"#install_printer pp_spindet ;;\n",
"#install_printer pp_det ;;\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-03-30T10:16:03.181400Z",
"start_time": "2020-03-30T10:15:58.799Z"
},
"hidden": true,
"init_cell": true
},
"outputs": [
{
"data": {
"text/plain": [
"val simulation_aux : Simulation.t = <abstr>\n"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"66 significant shell pairs computed in 0.122791 seconds\n",
"1\n",
"2\n",
"3\n",
"6\n",
"9\n",
"10\n",
"11\n",
"12\n",
"15\n",
"18\n",
"Computed ERIs in 2.253815 seconds\n"
]
},
{
"data": {
"text/plain": [
"val aux_basis : MOBasis.t =\n",
" Eigenvalues: -11.127416 -0.632049 -0.269831 0.131526 0.151773 \n",
" -- 1 -- -- 2 -- -- 3 -- -- 4 -- -- 5 --\n",
" 1 0.995189 -0.236456 8.68506E-12 4.39594E-12 -7.46805E-12\n",
" 2 0.0272807 0.573253 -4.95565E-12 -5.67405E-12 -4.47366E-13\n",
" 3 -0.00753288 0.50151 -8.79918E-13 -7.15566E-13 2.36287E-13\n",
" ... ... ... ... ...\n",
" 22 0 0 -0 -0 0\n",
" 23 0 0 -0 -0 0\n",
" 24 0 0 -0 -0 0\n",
" \n",
" Eigenvalues: 0.786913 0.828232 0.869410 0.849164 1.471540 \n",
" -- 6 -- -- 7 -- -- 8 -- -- 9 -- -- 10 --\n",
" 1 -9.38797E-12 0.0649867 -5.92171E-12 -1.01808E-11 2.71822E-13\n",
" 2 1.16966E-12 -1.62901 -8.06973E-13 6.55834E-12 -5.57185E-14\n",
" 3 6.63605E-13 1.63955 5.0525E-13 1.12933E-12 -2.61365E-15\n",
" ... ... ... ... ...\n",
" 22 0 0 0 0 -0.866025\n",
" 23 0 0 0 0 0\n",
" 24 0 0 0 0 0\n",
" \n",
" Eigenvalues: 1.031908 1.024910 1.028381 1.247024 25.947498 \n",
" -- 11 -- -- 12 -- -- 13 -- -- 14 -- -- 15 --\n",
" 1 4.00353E-10 -8.57233E-11 1.06969E-10 3.79632 -2.36312E-10\n",
" 2 1.4024E-10 1.19157E-12 9.07568E-12 -10.5897 -8.33662E-10\n",
" 3 3.79392E-12 7.24542E-12 -1.17682E-11 53.7881 -1.17393E-10\n",
" ... ... ... ... ...\n",
" 22 0 -0 0 -0 0\n",
" 23 0 -0 0 -0 1.05805E-13\n",
" 24 0 -0 0 -0 0\n",
" \n",
" Eigenvalues: 25.902263 25.896210 18.767112 377.619959 1.471980 \n",
" -- 16 -- -- 17 -- -- 18 -- -- 19 -- -- 20 --\n",
" 1 -1.81712E-09 7.6446E-09 27.2935 436.547 7.08629E-12\n",
" 2 -7.15883E-10 2.38277E-09 -127.494 -10.9671 -2.66825E-13\n",
" 3 -1.90088E-11 -1.74694E-11 -21.2025 -23.8199 -3.9535E-13\n",
" ... ... ... ... ...\n",
" 22 0 0 -0 0 -0.0208586\n",
" 23 0 0 -0 0 -0.442591\n",
" 24 0 0 -0 0 0.0417173\n",
" \n",
" Eigenvalues: 1.478279 1.478333 1.471737 \n",
" -- 21 -- -- 22 -- -- 23 --\n",
" 1 -1.36007E-11 -2.98191E-11 6.74696E-10\n",
" 2 5.12555E-13 1.12961E-12 -2.54412E-11\n",
" 3 7.58688E-13 1.66236E-12 -3.76295E-11\n",
" ... ... ...\n",
" 22 -0.0667224 0.492879 0.0467273\n",
" 23 0.890945 0.100348 0.0161496\n",
" 24 0.133445 -0.985758 -0.0934546\n",
" \n",
" \n"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val aux_num : int = 23\n"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"let simulation_aux = \n",
" let charge = Charge.to_int @@ Simulation.charge simulation \n",
" and multiplicity = Electrons.multiplicity @@ Simulation.electrons simulation\n",
" and nuclei = Simulation.nuclei simulation\n",
" in\n",
" let general_basis = \n",
" Basis.general_basis @@ Simulation.basis simulation\n",
" in\n",
" GeneralBasis.combine [\n",
" general_basis ; GeneralBasis.read aux_basis_filename\n",
" ]\n",
" |> Basis.of_nuclei_and_general_basis nuclei\n",
" |> Simulation.make ~f12 ~charge ~multiplicity ~nuclei \n",
"\n",
"\n",
"let aux_basis = \n",
" MOBasis.of_mo_basis simulation_aux mo_basis\n",
"\n",
"let aux_num = \n",
" MOBasis.size aux_basis\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2020-03-30T10:16:41.349200Z",
"start_time": "2020-03-30T10:15:58.806Z"
},
"hidden": true,
"init_cell": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"66 significant shell pairs computed in 1.895893 seconds\n",
"1\n",
"2\n",
"3\n",
"6\n",
"9\n",
"10\n",
"11\n",
"12\n",
"15\n",
"18\n",
"Computed ERIs in 35.957611 seconds\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"4-idx transformation \n",
"23 / 23\n",
"4-idx transformation \n",
"23 / 23\n"
]
}
],
"source": [
"let () = ignore @@ MOBasis.f12_ints aux_basis\n",
"let () = ignore @@ MOBasis.two_e_ints aux_basis"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"## Integral-based functions"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"\\begin{equation}\n",
"\\langle I | \\hat{H} | J \\rangle = \\begin{cases}\n",
"\\sum_i h_{ii} + \\frac{1}{2} \\sum_{ij} \\langle ij || ij \\rangle \\text{ when } |J\\rangle = |I\\rangle \\\\\n",
"h_{ik} + \\sum_{j} \\langle ij || kj \\rangle \\text{ when } |J\\rangle = \\hat{T}_i^k |I\\rangle \\\\\n",
"\\langle ij || kl \\rangle \\text{ when } |J\\rangle = \\hat{T}_{ij}^{kl} |I\\rangle \\\\\n",
"\\end{cases}\n",
"\\end{equation}\n",
"\n",
"\n",
"\\begin{equation}\n",
"\\langle I | \\hat{F} | J \\rangle = \\begin{cases}\n",
"\\sum_i f_{ii} + \\frac{1}{2} \\sum_{ij} \\langle ij || ij \\rangle \\text{ when } |J\\rangle = |I\\rangle \\\\\n",
"f_{ik} + \\sum_{j} \\langle ij || kj \\rangle \\text{ when } |J\\rangle = \\hat{T}_i^k |I\\rangle \\\\\n",
"\\langle ij || kl \\rangle \\text{ when } |J\\rangle = \\hat{T}_{ij}^{kl} |I\\rangle \\\\\n",
"\\end{cases}\n",
"\\end{equation}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"let cancel_singles = false \n",
"\n",
"let mos_cabs = \n",
" Util.list_range (mo_num+1) aux_num\n",
" \n",
"let mos_abs = \n",
" Util.list_range 1 aux_num\n",
" \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": {
"hidden": true
},
"source": [
"### H integrals"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"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",
" h2\n",
"\n",
" \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### F12 integrals"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"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",
"*)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"## Determinant-based functions"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Integrals"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"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",
" List.map (fun f -> f mo_basis)\n",
" [ CI.h_integrals ]\n",
" in\n",
" CIMatrixElement.make integrals ki kj \n",
" |> List.hd\n",
"\n",
"\n",
"let f_ij mo_basis ki kj =\n",
" let integrals =\n",
" List.map (fun f -> f mo_basis)\n",
" [ f12_integrals ]\n",
" in\n",
" CIMatrixElement.make integrals ki kj \n",
" |> List.hd \n",
"\n",
"\n",
"let hf_ij mo_basis ki kj =\n",
" let integrals =\n",
" List.map (fun f -> f mo_basis)\n",
" [ CI.h_integrals ; f12_integrals ]\n",
" in\n",
" CIMatrixElement.make integrals ki kj\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Determinant space"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"let is_a_double det_space =\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",
" let j = i-1 in Bitstring.logor accu (Bitstring.shift_left_one mo_num j)\n",
" ) (Bitstring.zero mo_num) l\n",
" in\n",
" let aux_mask = m (MOClass.auxiliary_mos mo_class) in\n",
" fun k -> \n",
" let alfa =\n",
" Determinant.alfa k\n",
" |> Spindeterminant.bitstring\n",
" in\n",
" let beta =\n",
" Determinant.beta k\n",
" |> Spindeterminant.bitstring\n",
" in\n",
" let a = Bitstring.logand aux_mask alfa\n",
" and b = Bitstring.logand aux_mask beta\n",
" in\n",
" match Bitstring.popcount a + Bitstring.popcount b with\n",
" | 2 | 1 -> true\n",
" | 0 | _ -> false\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"let in_space = \n",
" DeterminantSpace.fci_f12_of_mo_basis aux_basis ~frozen_core mo_num\n",
" \n",
"let aux_space = \n",
" DeterminantSpace.fci_of_mo_basis aux_basis ~frozen_core \n",
"\n",
"let det_space_in () =\n",
" DeterminantSpace.determinant_stream in_space\n",
"\n",
"let det_space_out () =\n",
" let s = \n",
" DeterminantSpace.determinant_stream aux_space\n",
" in\n",
" Stream.from (fun _ ->\n",
" try\n",
" let is_a_double = is_a_double in_space in\n",
" let rec result () =\n",
" let ki = Stream.next s in\n",
" if is_a_double ki then\n",
" Some (ki,ki)\n",
" else\n",
" result ()\n",
" in\n",
" result ()\n",
" with Stream.Failure -> None\n",
" )\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true,
"scrolled": false
},
"outputs": [],
"source": [
"let ci = CI.make ~n_states:state in_space\n",
"\n",
"let ci_coef, ci_energy = Lazy.force ci.eigensystem \n",
"\n",
"let _ = print_newline () \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"Permutation operator $p_{12}$ that generates a new determinant with electrons 1 and 2 swapped."
]
},
{
"cell_type": "raw",
"metadata": {
"hidden": true
},
"source": [
"let p12 det_space =\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",
" let j = i-1 in Bitstring.logor accu (Bitstring.shift_left_one mo_num j)\n",
" ) (Bitstring.zero mo_num) l\n",
" in\n",
" let aux_mask = m (MOClass.auxiliary_mos mo_class) in\n",
" let not_aux_mask =\n",
" Bitstring.(shift_left_one mo_num (mo_num-1) |> minus_one |> logxor aux_mask)\n",
" in\n",
" fun k ->\n",
" let alfa =\n",
" Determinant.alfa k\n",
" |> Spindeterminant.bitstring\n",
" in\n",
" let beta =\n",
" Determinant.beta k\n",
" |> Spindeterminant.bitstring\n",
" in\n",
" let a = Bitstring.logand aux_mask alfa\n",
" and b = Bitstring.logand aux_mask beta\n",
" in\n",
" match Bitstring.popcount a, Bitstring.popcount b with\n",
" | 2, 0 \n",
" | 0, 2 -> Some (Determinant.negate_phase k)\n",
" | 1, 1 -> Some (Determinant.of_spindeterminants\n",
" (Spindeterminant.of_bitstring @@\n",
" Bitstring.(logor b (logand not_aux_mask alfa)) )\n",
" (Spindeterminant.of_bitstring @@\n",
" Bitstring.(logor a (logand not_aux_mask beta))\n",
" ) )\n",
" | 1, 0 \n",
" | 0, 1 -> Some k\n",
" | _ -> None\n",
" \n",
" \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"## Matrices $\\langle I | H | \\alpha \\rangle$ and $\\langle I | F | \\alpha \\rangle$ "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true,
"scrolled": true
},
"outputs": [],
"source": [
"let randomize = false\n",
"\n",
"let out_list =\n",
" Util.stream_to_list (det_space_out ())\n",
" \n",
"let in_list =\n",
" Util.stream_to_list (det_space_in ())\n",
" \n",
"let det_a = Array.of_list out_list\n",
" |> Array.map (fun (i,_) -> i)\n",
"\n",
"let det_I =\n",
" if randomize then\n",
" let n = 123456789 in\n",
" in_list\n",
" |> List.map (fun k -> (Random.int n, k))\n",
" |> List.sort compare\n",
" |> List.map (fun (_,k) -> k)\n",
" |> Array.of_list\n",
" else\n",
" Array.of_list in_list\n"
]
},
{
"cell_type": "raw",
"metadata": {
"hidden": true,
"raw_mimetype": "text/markdown"
},
"source": [
"let m_H_aux, m_F_aux = \n",
" \n",
" let rec col_vecs_list accu_H accu_F = function\n",
" | [] -> \n",
" List.rev accu_H, \n",
" List.rev accu_F \n",
" | (ki, ki') :: rest when ki = ki' ->\n",
" begin\n",
" let h, f = \n",
" List.map (fun kj ->\n",
" match hf_ij aux_basis kj ki with\n",
" | [ a ; b ] -> a, b\n",
" | _ -> assert false ) in_list\n",
" |> List.split\n",
" in\n",
" let h = Vec.of_list h in\n",
" let f = Vec.of_list f in\n",
" scal 0.5 f; (* Specific to He singlet *)\n",
" col_vecs_list (h::accu_H) (f::accu_F) rest\n",
" end\n",
" | (ki, ki') :: rest ->\n",
" begin\n",
" assert false;\n",
" end\n",
" in\n",
" let h, f = \n",
" col_vecs_list [] [] out_list\n",
" in\n",
" Mat.of_col_vecs_list h,\n",
" Mat.of_col_vecs_list f"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"Function to generate all intermediate external determinants $|\\alpha \\rangle$ between $|I\\rangle$ and $|J\\rangle$, with a positive phase factor.\n",
"\n",
"* `exc` is the degree of excitation between $|I\\rangle$ and $|J\\rangle$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"let generate_alphas ki kj exc =\n",
" (* Check input excitation degree *)\n",
" let d = Determinant.degree ki kj in\n",
" if d <> exc then\n",
" Printf.sprintf \"Invalid excitation degree. Expected %d and found %d.\" exc d\n",
" |> failwith;\n",
" \n",
" (* Generate single excitations *)\n",
" let all_singles ki =\n",
" let mos_a, mos_b = Determinant.to_lists ki in\n",
" [ List.map (fun hole -> \n",
" List.map (fun particle ->\n",
" if hole = particle then None else\n",
" Some (Determinant.single_excitation Spin.Alfa hole particle ki)\n",
" ) mos_abs\n",
" ) mos_a\n",
" ;\n",
" List.map (fun hole -> \n",
" List.map (fun particle ->\n",
" if hole = particle then None else\n",
" Some (Determinant.single_excitation Spin.Beta hole particle ki)\n",
" ) mos_abs\n",
" ) mos_b \n",
" ]\n",
" |> 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",
" (* Generate double excitations *)\n",
" let all_doubles ki =\n",
" let mos_a, mos_b = Determinant.to_lists ki in\n",
" [ List.map (fun hole -> (* Alpha-Alpha *)\n",
" List.map (fun particle ->\n",
" List.map (fun hole' -> \n",
" List.map (fun particle' ->\n",
" if hole = particle || hole' = particle' then None else\n",
" if hole' > hole && particle' < particle then\n",
" Some (Determinant.double_excitation Spin.Alfa hole particle Spin.Alfa hole' particle' ki)\n",
" else None\n",
" ) mos_abs\n",
" ) mos_a \n",
" ) mos_abs\n",
" ) mos_a\n",
" ; \n",
" List.map (fun hole -> (* Beta-Beta *)\n",
" List.map (fun particle ->\n",
" List.map (fun hole' -> \n",
" List.map (fun particle' ->\n",
" if hole' > hole && particle' < particle && hole <> particle && hole' <> particle' then\n",
" Some (Determinant.double_excitation Spin.Beta hole particle Spin.Beta hole' particle' ki)\n",
" else None\n",
" ) mos_abs\n",
" ) mos_b \n",
" ) mos_abs\n",
" ) mos_b\n",
" ;\n",
" List.map (fun hole -> (* Alpha-Beta *)\n",
" List.map (fun particle ->\n",
" List.map (fun hole' -> \n",
" List.map (fun particle' ->\n",
" if hole = particle || hole' = particle' then None else\n",
" Some (Determinant.double_excitation Spin.Alfa hole particle Spin.Beta hole' particle' ki)\n",
" ) mos_abs\n",
" ) mos_b \n",
" ) mos_abs\n",
" ) mos_a\n",
" ]\n",
" |> List.concat\n",
" |> List.concat\n",
" |> 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",
" (* Generate left and right excitations *)\n",
" let al = List.concat [ all_singles ki ; all_doubles ki ] in\n",
" let ar = List.concat [ all_singles kj ; all_doubles kj ] in\n",
" \n",
" let mo_class = DeterminantSpace.mo_class in_space in\n",
" let m l =\n",
" List.fold_left (fun accu i ->\n",
" let j = i-1 in Bitstring.logor accu (Bitstring.shift_left_one mo_num j)\n",
" ) (Bitstring.zero mo_num) l\n",
" in\n",
" let aux_mask = m (MOClass.auxiliary_mos mo_class) in\n",
" let good_cabs k = \n",
" let alfa =\n",
" Determinant.alfa k\n",
" |> Spindeterminant.bitstring\n",
" in\n",
" let beta =\n",
" Determinant.beta k\n",
" |> Spindeterminant.bitstring\n",
" in\n",
" let a = Bitstring.logand aux_mask alfa\n",
" and b = Bitstring.logand aux_mask beta\n",
" in\n",
" match Bitstring.popcount a + Bitstring.popcount b with\n",
" | 1 | 2 -> true\n",
" | _ -> false\n",
" in\n",
" \n",
" (* Merge lists in a set of unique determinants *)\n",
" List.concat [ al; ar ]\n",
" |> List.sort_uniq compare\n",
" \n",
" (* Filter out all determinants with incorrect numbers of electrons in the CABS *)\n",
" |> List.filter good_cabs \n",
" \n",
" \n",
"let compute_HaaF ki alphas kj =\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": {
"hidden": true
},
"outputs": [],
"source": [
"let check n integral_value exc =\n",
" let cpudet, cpuint = ref 0., ref 0. in\n",
" let det_list =\n",
" match n with\n",
" | 0 -> det_I\n",
" | n -> Array.sub det_I 0 n\n",
" in\n",
" let result =\n",
" Printf.printf \"Checking ... \\n%!\";\n",
" let percent = ref 0 in\n",
" let task (i,ki) =\n",
" (let p = (10 * (i+1))/(Array.length det_list) in\n",
" if p <> !percent then\n",
" ( percent := p ; Printf.printf \" - %3d %%\\n%!\" (p*10) ));\n",
" Array.mapi (fun j kj -> \n",
" if i > j || Determinant.degree ki kj <> exc then\n",
" (0,0,0.,0.)\n",
" else\n",
" begin\n",
" let alphas = generate_alphas ki kj exc in\n",
" let det_value =\n",
" let t0 = Unix.gettimeofday () in\n",
" let result = compute_HaaF ki alphas kj in\n",
" cpudet := !cpudet +. Unix.gettimeofday () -. t0;\n",
" result\n",
" in\n",
" let int_value = \n",
" let t0 = Unix.gettimeofday () in\n",
" let result = integral_value ki kj in\n",
" cpuint := !cpuint +. Unix.gettimeofday () -. t0;\n",
" result\n",
" in\n",
"(* Printf.printf \"%d %d %e %e\\n%!\" i j det_value int_value; *)\n",
" (i,j,det_value,int_value)\n",
" end\n",
" ) det_list\n",
" in\n",
" det_list\n",
" |> Array.mapi (fun i ki -> (i,ki))\n",
" |> Array.to_list\n",
" |> Stream.of_list\n",
" |> Farm.run ~f:task\n",
" |> Util.stream_to_list\n",
" |> Array.concat\n",
" in\n",
" let i,j,d,v = \n",
" let rec aux k imax jmax emax dmax vmax = \n",
" if k = -1 then\n",
" imax, jmax, dmax, vmax\n",
" else\n",
" let i, j, d, v = result.(k) in\n",
" let e = abs_float (d -. v) in\n",
" if e >= emax then\n",
" aux (k-1) i j e d v\n",
" else\n",
" aux (k-1) imax jmax emax dmax vmax\n",
" in\n",
" aux (Array.length result - 1) 0 0 0. 0. 0.\n",
" in\n",
" let error = abs_float (d -. v) in\n",
" if error < epsilon_float then\n",
" (*\n",
" Printf.printf \"OK: %e\\n%!\" error\n",
" *)\n",
" Printf.printf \"OK: (%d, %d) | %e %e | %e | cpu : %f %f\\n%!\" i j d v error !cpudet !cpuint\n",
" else\n",
" Printf.printf \"Failed: (%d, %d) | %e %e | %e | cpu : %f %f\\n%!\" i j d v error !cpudet !cpuint\n",
"\n",
" \n",
"let sum l f = List.fold_left (fun accu i -> accu +. f i) 0. l"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"let array_3_init d1 d2 d3 f =\n",
" let result = \n",
" Bigarray.(Array3.create Float64 fortran_layout) d1 d2 d3\n",
" in\n",
" for k=1 to d3 do\n",
" for j=1 to d2 do\n",
" for i=1 to d1 do\n",
" result.{i,j,k} <- f i j k\n",
" done\n",
" done\n",
" done;\n",
" result\n",
"\n",
"\n",
"let array_4_init d1 d2 d3 d4 f =\n",
" let result = \n",
" Bigarray.(Genarray.create Float64 fortran_layout) [| d1;d2;d3;d4 |]\n",
" in\n",
" for l=1 to d4 do\n",
" for k=1 to d3 do\n",
" for j=1 to d2 do\n",
" for i=1 to d1 do\n",
" result.{i,j,k,l} <- f i j k l\n",
" done\n",
" done\n",
" done\n",
" done;\n",
" result\n",
"\n",
"\n",
"let array_5_init d1 d2 d3 d4 d5 f =\n",
" let result = \n",
" Bigarray.(Genarray.create Float64 fortran_layout) [| d1;d2;d3;d4;d5 |]\n",
" in\n",
" for m=1 to d5 do\n",
" for l=1 to d4 do\n",
" for k=1 to d3 do\n",
" for j=1 to d2 do\n",
" for i=1 to d1 do\n",
" result.{i,j,k,l,m} <- f i j k l m\n",
" done\n",
" done\n",
" done\n",
" done\n",
" done;\n",
" result\n",
"\n",
"(* ----- *)"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"******"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"# 1. 0 "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"let m_0111_1H_1F = \n",
" Vec.init mo_num (fun i -> \n",
" sum mos_cabs (fun a ->\n",
" h_one i a Spin.Alfa *. f_one a i Spin.Alfa ))\n",
"\n",
"let m_0111_1H_2Fa, m_0111_2Ha_2Fa =\n",
"\n",
" let m_0122_Haa = \n",
" array_3_init mo_num mo_num mo_num (fun i j k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a k Spin.Alfa Spin.Alfa *. f_two a k i j Spin.Alfa Spin.Alfa\n",
" ) )\n",
" in \n",
" \n",
" let m_0111_1H_2Fa = \n",
" Mat.init_cols mo_num mo_num (fun i j ->\n",
" sum mos_cabs (fun a ->\n",
" h_one i a Spin.Alfa *. f_two a j i j Spin.Alfa Spin.Alfa +.\n",
" h_two i j a j Spin.Alfa Spin.Alfa *. f_one a i Spin.Alfa\n",
" ) +.\n",
" if i < j then 0. else\n",
" begin\n",
" sum mos_cabs (fun a ->\n",
" sum mos_cabs (fun b -> if b >= a then 0. else\n",
" h_two i j a b Spin.Alfa Spin.Alfa *. f_two a b i j Spin.Alfa Spin.Alfa\n",
" )\n",
" ) +.\n",
" sum mos_in (fun k -> m_0122_Haa.{i,j,k}) \n",
" end\n",
" )\n",
" in\n",
" \n",
" let m_0111_2Ha_2Fa =\n",
" array_3_init mo_num mo_num mo_num (fun i j k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a j Spin.Alfa Spin.Alfa *.\n",
" f_two a k i k Spin.Alfa Spin.Alfa \n",
" ) -. if i < j then 0. else m_0122_Haa.{i,j,k}\n",
" )\n",
" in m_0111_1H_2Fa, m_0111_2Ha_2Fa\n",
"\n",
"\n",
" \n",
"let m_0111_1H_2Fb, m_0111_2Hb_2Fb =\n",
" let m_0122_Hab = \n",
" array_3_init mo_num mo_num mo_num (fun i j k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a k Spin.Alfa Spin.Beta *. f_two a k i j Spin.Alfa Spin.Beta\n",
" ) )\n",
" in\n",
" \n",
" let m_0111_1H_2Fb = \n",
" Mat.init_cols mo_num mo_num (fun i j ->\n",
" sum mos_cabs (fun a ->\n",
" h_one i a Spin.Alfa *. f_two a j i j Spin.Alfa Spin.Beta +. \n",
" h_two i j a j Spin.Alfa Spin.Beta *. f_one a i Spin.Alfa +.\n",
" h_one j a Spin.Alfa *. f_two a i j i Spin.Alfa Spin.Beta +. \n",
" h_two j i a i Spin.Alfa Spin.Beta *. f_one a j Spin.Alfa\n",
" ) +.\n",
" sum mos_in (fun k -> m_0122_Hab.{i,j,k} +. m_0122_Hab.{j,i,k} ) +.\n",
" sum mos_cabs (fun a ->\n",
" sum mos_cabs (fun b ->\n",
" h_two i j a b Spin.Alfa Spin.Beta *. f_two a b i j Spin.Alfa Spin.Beta\n",
" )\n",
" )\n",
" )\n",
" in \n",
" \n",
" let m_0111_2Hb_2Fb =\n",
" array_3_init mo_num mo_num mo_num (fun i j k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two k i a i Spin.Alfa Spin.Beta *.\n",
" f_two a j k j Spin.Alfa Spin.Beta +.\n",
" h_two i k a k Spin.Alfa Spin.Beta *.\n",
" f_two a j i j Spin.Alfa Spin.Alfa \n",
" ) -. m_0122_Hab.{k,i,j}\n",
" )\n",
" in\n",
" m_0111_1H_2Fb, m_0111_2Hb_2Fb\n",
" \n",
"\n",
"let m_0111_2Ha_2Fb =\n",
" array_3_init mo_num mo_num mo_num (fun i j k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a j Spin.Alfa Spin.Alfa *.\n",
" f_two a k i k Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
"\n",
"\n",
"\n",
"\n",
"let integral_value ki kj = \n",
"\n",
" let mos_i, mos_i' = mos_a ki, mos_b ki in\n",
" let same = (mos_i = mos_i') in\n",
" \n",
" (* Alpha *)\n",
" let a = \n",
" sum mos_i (fun i -> m_0111_1H_1F.{i}) \n",
" in\n",
" \n",
" let b = \n",
" if same then a else\n",
" sum mos_i' (fun i -> m_0111_1H_1F.{i})\n",
" in\n",
" \n",
" let aa = \n",
" sum mos_i (fun j ->\n",
" sum mos_i (fun i -> m_0111_1H_2Fa.{i,j} ))\n",
" in\n",
" \n",
" let bb = \n",
" if same then aa else\n",
" sum mos_i' (fun j ->\n",
" sum mos_i' (fun i -> m_0111_1H_2Fa.{i,j} ))\n",
" in\n",
" \n",
" let ab = \n",
" sum mos_i' (fun j ->\n",
" sum mos_i (fun i -> m_0111_1H_2Fb.{i,j} )) \n",
" in\n",
" \n",
" let aaa = \n",
" sum mos_i (fun k ->\n",
" sum mos_i (fun j ->\n",
" sum mos_i (fun i -> m_0111_2Ha_2Fa.{i,j,k} ))) \n",
" in\n",
" \n",
" let bbb = \n",
" if same then aaa else\n",
" sum mos_i' (fun k ->\n",
" sum mos_i' (fun j ->\n",
" sum mos_i' (fun i -> m_0111_2Ha_2Fa.{i,j,k} )))\n",
" in\n",
" \n",
" let baa = \n",
" sum mos_i' (fun k ->\n",
" sum mos_i (fun j ->\n",
" sum mos_i (fun i ->\n",
" m_0111_2Ha_2Fb.{i,j,k} +. m_0111_2Hb_2Fb.{i,j,k}\n",
" )))\n",
" in\n",
" \n",
" let bba = \n",
" sum mos_i (fun k ->\n",
" sum mos_i' (fun j ->\n",
" sum mos_i' (fun i ->\n",
" m_0111_2Ha_2Fb.{i,j,k} +. m_0111_2Hb_2Fb.{j,i,k} \n",
" ))) \n",
" in\n",
"\n",
" a +. b +. aa +. bb +. ab +. aaa +. baa +. bba +. bbb\n",
" \n",
" \n",
"let _ =\n",
" check 0 integral_value 0 \n",
" \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"# 2. 1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true,
"scrolled": false
},
"outputs": [],
"source": [
"let m_1111_1H_1F = \n",
" Mat.init_cols mo_num mo_num (fun i k -> \n",
" sum mos_cabs (fun a -> h_one i a Spin.Alfa *. f_one a k Spin.Alfa ))\n",
"\n",
"\n",
" \n",
"\n",
"let m_1111_2Ha_2Fa =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" if l=i then\n",
" sum mos_cabs (fun a ->\n",
" h_two j l a l Spin.Alfa Spin.Alfa *.\n",
" f_two a i j k Spin.Alfa Spin.Alfa \n",
" )\n",
" else\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a j Spin.Alfa Spin.Alfa *.\n",
" f_two a l k l Spin.Alfa Spin.Alfa +.\n",
" h_two j l a l Spin.Alfa Spin.Alfa *.\n",
" f_two a i j k Spin.Alfa Spin.Alfa )\n",
" )\n",
"\n",
"\n",
"\n",
"let m_1111_2Hb_2Fa =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" if l=i then\n",
" sum mos_cabs (fun a ->\n",
" h_two j l a l Spin.Alfa Spin.Beta *.\n",
" f_two a i j k Spin.Alfa Spin.Beta \n",
" )\n",
" else\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a j Spin.Alfa Spin.Beta *.\n",
" f_two a l k l Spin.Alfa Spin.Alfa +.\n",
" h_two j l a l Spin.Alfa Spin.Beta *.\n",
" f_two a i j k Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
"\n",
"\n",
"let m_1111_2Ha_2Fb =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a j Spin.Alfa Spin.Alfa *.\n",
" f_two a l k l Spin.Alfa Spin.Beta +.\n",
" h_two j l a l Spin.Alfa Spin.Beta *.\n",
" f_two a i j k Spin.Alfa Spin.Alfa \n",
" )\n",
" )\n",
"\n",
"\n",
"\n",
"let m_1111_2Hb_2Fb =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a j Spin.Alfa Spin.Beta *.\n",
" f_two a l k l Spin.Alfa Spin.Beta +.\n",
" h_two j l a l Spin.Alfa Spin.Alfa *.\n",
" f_two a i j k Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
"\n",
"\n",
"\n",
"\n",
" \n",
"\n",
"\n",
"let m_1121_2Ha_2Fa =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j k a Spin.Alfa Spin.Alfa *.\n",
" f_two l a l j Spin.Alfa Spin.Alfa \n",
" )\n",
" )\n",
"\n",
"\n",
"let m_1121_2Hb_2Fa =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j k a Spin.Alfa Spin.Beta *.\n",
" f_two l a l j Spin.Alfa Spin.Alfa \n",
" )\n",
" )\n",
"\n",
"let m_1121_2Ha_2Fb =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j k a Spin.Alfa Spin.Alfa *.\n",
" f_two l a l j Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
"\n",
"\n",
"let m_1121_2Hb_2Fb =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j k a Spin.Alfa Spin.Beta *.\n",
" f_two l a l j Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
"\n",
"let m_1122_va =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two j i a l Spin.Alfa Spin.Alfa *.\n",
" f_two l a k j Spin.Alfa Spin.Alfa \n",
" )\n",
" )\n",
" \n",
"let m_1111_1H_2Fa = \n",
" array_3_init mo_num mo_num mo_num (fun j i k ->\n",
" sum mos_in (fun l -> m_1122_va.{l,j,i,k}) +.\n",
" sum mos_cabs (fun a ->\n",
" h_one i a Spin.Alfa *. f_two a j k j Spin.Alfa Spin.Alfa +.\n",
" h_two i j a j Spin.Alfa Spin.Alfa *. f_one a k Spin.Alfa +.\n",
" h_one j a Spin.Alfa *. f_two a i j k Spin.Alfa Spin.Alfa +.\n",
" h_two i j k a Spin.Alfa Spin.Alfa *. f_one a j Spin.Alfa +.\n",
" sum mos_cabs (fun b -> if b > a then 0. else\n",
" h_two i j a b Spin.Alfa Spin.Alfa *.\n",
" f_two a b k j Spin.Alfa Spin.Alfa )\n",
" )\n",
" )\n",
"\n",
"\n",
"let m_1122_v2 =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j l a Spin.Alfa Spin.Beta *.\n",
" f_two l a k j Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
"\n",
"\n",
"let m_1122_v3 =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a l Spin.Alfa Spin.Beta *.\n",
" f_two a l k j Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
"\n",
" \n",
"let m_1111_1H_2Fb = \n",
" array_3_init mo_num mo_num mo_num (fun j i k ->\n",
" sum mos_in (fun l -> m_1122_v2.{l,j,i,k} +. m_1122_v3.{l,j,i,k}) +.\n",
" sum mos_cabs (fun a ->\n",
" h_one i a Spin.Alfa *. f_two a j k j Spin.Alfa Spin.Beta +.\n",
" h_two i j a j Spin.Alfa Spin.Beta *. f_one a k Spin.Alfa +.\n",
" h_one j a Spin.Beta *. f_two a i j k Spin.Alfa Spin.Beta +.\n",
" h_two i j k a Spin.Alfa Spin.Beta *. f_one a j Spin.Beta +.\n",
" sum mos_cabs (fun b ->\n",
" h_two i j a b Spin.Alfa Spin.Beta *.\n",
" f_two a b k j Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
" )\n",
" \n",
"let m_1122_oa =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" if l > j then\n",
" sum mos_cabs (fun a ->\n",
" h_two j l a k Spin.Alfa Spin.Alfa *.\n",
" f_two i a l j Spin.Alfa Spin.Alfa \n",
" )\n",
" else 0.\n",
" )\n",
"\n",
"let m_1122_o =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun l j i k ->\n",
" sum mos_cabs (fun a ->\n",
" h_two l j k a Spin.Alfa Spin.Beta *.\n",
" f_two i a l j Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
" \n",
"\n",
"\n",
"(*----*)\n",
"\n",
"let integral_value ki kj = \n",
" let i, k, 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_novirt, mos_novirt' =\n",
" let alfa = \n",
" let i = Spindeterminant.bitstring @@ Determinant.alfa ki in\n",
" let j = Spindeterminant.bitstring @@ Determinant.alfa kj in\n",
" Bitstring.to_list (Bitstring.logor i j)\n",
" in\n",
" let beta = \n",
" let i = Spindeterminant.bitstring @@ Determinant.beta ki in\n",
" let j = Spindeterminant.bitstring @@ Determinant.beta kj in\n",
" Bitstring.to_list (Bitstring.logor i j)\n",
" in\n",
" match s with\n",
" | Spin.Alfa -> alfa, beta\n",
" | Spin.Beta -> beta, alfa\n",
" in\n",
" \n",
" let mos_ij, mos_ij' =\n",
" let alfa = \n",
" let i = Spindeterminant.bitstring @@ Determinant.alfa ki in\n",
" let j = Spindeterminant.bitstring @@ Determinant.alfa kj in\n",
" Bitstring.to_list (Bitstring.logand i j)\n",
" in\n",
" let beta = \n",
" let i = Spindeterminant.bitstring @@ Determinant.beta ki in\n",
" let j = Spindeterminant.bitstring @@ Determinant.beta kj in\n",
" Bitstring.to_list (Bitstring.logand i j)\n",
" in\n",
" match s with\n",
" | Spin.Alfa -> alfa, beta\n",
" | Spin.Beta -> beta, alfa\n",
" in\n",
" \n",
" let mos_i, mos_i' =\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",
" let mos_j, mos_j' =\n",
" match s with\n",
" | Spin.Alfa -> mos_a kj, mos_b kj\n",
" | Spin.Beta -> mos_b kj, mos_a kj\n",
" in\n",
" \n",
" let result = \n",
" m_1111_1H_1F.{i,k} +. \n",
" sum mos_ij (fun j -> \n",
" m_1111_1H_2Fa.{j,i,k} \n",
" +. sum mos_i (fun l -> m_1111_2Ha_2Fa.{l,j,i,k})\n",
" +. sum mos_i' (fun l -> m_1111_2Ha_2Fb.{l,j,i,k})\n",
" +. sum mos_j (fun l -> m_1121_2Ha_2Fa.{l,j,i,k})\n",
" +. sum mos_j' (fun l -> m_1121_2Ha_2Fb.{l,j,i,k})\n",
" -. sum mos_novirt (fun l -> m_1122_va.{l,j,i,k})\n",
" -. sum mos_ij (fun l -> m_1122_oa.{l,j,i,k} )\n",
" ) +.\n",
" sum mos_ij' (fun j ->\n",
" m_1111_1H_2Fb.{j,i,k} \n",
" +. sum mos_i (fun l -> m_1111_2Hb_2Fa.{l,j,i,k})\n",
" +. sum mos_i' (fun l -> m_1111_2Hb_2Fb.{l,j,i,k})\n",
" +. sum mos_j (fun l -> m_1121_2Hb_2Fb.{l,j,i,k})\n",
" +. sum mos_j' (fun l -> m_1121_2Hb_2Fa.{l,j,i,k})\n",
" -. sum mos_novirt (fun l -> m_1122_v2.{l,j,i,k}) \n",
" -. sum mos_novirt' (fun l -> m_1122_v3.{l,j,i,k})\n",
" -. sum mos_ij (fun l -> m_1122_o.{l,j,i,k})\n",
" ) \n",
" in\n",
" match phase with\n",
" | Phase.Pos -> result\n",
" | Phase.Neg -> -. result\n",
" \n",
"\n",
"(*\n",
"let ki = det_I.(77)\n",
"let kj = det_I.(83)\n",
"\n",
"let _ = integral_value ki kj\n",
"let _ = \n",
" let alphas = generate_alphas ki kj 1 1\n",
" in compute_HaaF ki alphas kj\n",
"*)\n",
"\n",
"let _ = check 100 integral_value 1 \n",
"\n"
]
},
{
"cell_type": "raw",
"metadata": {
"hidden": true
},
"source": [
"Timing : 40.020974 0.019294"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"# 3. 2"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"val m_2112_1H_2Fa :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2112_1H_2Fb :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2112_2Ha_2Fa :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2112_2Hb_2Fa :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2112_2Ha_2Fb :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2121_2Ha_2Fa :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2121_2Hb_2Fa :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2121_2Ha_2Fb :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2122_2Ha_2Fa_ij :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2122_2Hb_2Fb_ij :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2122_2Hb_2Fb_ij2 :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2122_2Ha_2Fa_ij2 :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2122_2Ha_2Fa_nv :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2122_2Hb_2Fb_nv :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val m_2122_2Hb_2Fb_nv2 :\n",
" (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =\n",
" <abstr>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val integral_value : Determinant.t -> Determinant.t -> float = <fun>\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Checking ... \n",
" - 10 %\n",
" - 20 %\n",
" - 30 %\n",
" - 40 %\n",
" - 50 %\n",
" - 60 %\n",
" - 70 %\n",
" - 80 %\n",
" - 90 %\n",
" - 100 %\n",
"OK: (2, 45) | 2.332967e-02 2.332967e-02 | 2.428613e-17 | cpu : 109.679883 0.039116\n"
]
},
{
"data": {
"text/plain": [
"- : unit = ()\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val ki : Determinant.t =\n",
" phase:+1\n",
" a:+1 +--++-----------------------------------------------------------\n",
" b:+1 +++-------------------------------------------------------------\n",
"\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"val kj : Determinant.t =\n",
" phase:+1\n",
" a:+1 +-+-+-----------------------------------------------------------\n",
" b:+1 ++-+------------------------------------------------------------\n",
"\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"- : float = 0.000896378780435275082\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"- : float = 0.000896378780435274107\n"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"let m_2112_1H_2Fa =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_one i a Spin.Alfa *. f_two a j k l Spin.Alfa Spin.Alfa +.\n",
" h_one j a Spin.Alfa *. f_two i a k l Spin.Alfa Spin.Alfa +. \n",
" h_two i j a l Spin.Alfa Spin.Alfa *. f_one a k Spin.Alfa +.\n",
" h_two i j k a Spin.Alfa Spin.Alfa *. f_one a l Spin.Alfa +.\n",
" sum mos_in (fun m -> -. h_two i j a m Spin.Alfa Spin.Alfa *.\n",
" f_two m a k l Spin.Alfa Spin.Alfa) +.\n",
" sum mos_cabs (fun b -> if b >= a then 0. else\n",
" h_two i j a b Spin.Alfa Spin.Alfa *. f_two a b k l Spin.Alfa Spin.Alfa \n",
" )\n",
" )\n",
" )\n",
"\n",
"let m_2112_1H_2Fb =\n",
" array_4_init mo_num mo_num mo_num mo_num (fun i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_one i a Spin.Alfa *. f_two a j k l Spin.Alfa Spin.Beta +.\n",
" h_one j a Spin.Alfa *. f_two i a k l Spin.Alfa Spin.Beta +.\n",
" h_two i j a l Spin.Alfa Spin.Beta *. f_one a k Spin.Alfa +.\n",
" h_two i j k a Spin.Alfa Spin.Beta *. f_one a l Spin.Alfa +.\n",
" sum mos_in (fun m ->\n",
" h_two i j a m Spin.Alfa Spin.Beta *. f_two a m k l Spin.Alfa Spin.Beta +.\n",
" h_two i j m a Spin.Alfa Spin.Beta *. f_two m a k l Spin.Alfa Spin.Beta ) +.\n",
" sum mos_cabs (fun b -> \n",
" h_two i j a b Spin.Alfa Spin.Beta *. f_two a b k l Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
" )\n",
"\n",
"let m_2112_2Ha_2Fa =\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i n a n Spin.Alfa Spin.Alfa *. f_two a j k l Spin.Alfa Spin.Alfa +. \n",
" h_two j n a n Spin.Alfa Spin.Alfa *. f_two a i l k Spin.Alfa Spin.Alfa \n",
" )\n",
" )\n",
" \n",
"let m_2112_2Hb_2Fa =\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i n a n Spin.Alfa Spin.Beta *. f_two a j k l Spin.Alfa Spin.Alfa +.\n",
" h_two j n a n Spin.Alfa Spin.Beta *. f_two a i l k Spin.Alfa Spin.Alfa \n",
" )\n",
" )\n",
" \n",
"let m_2112_2Ha_2Fb =\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i n a n Spin.Alfa Spin.Alfa *. f_two a j k l Spin.Alfa Spin.Beta +.\n",
" h_two j n a n Spin.Alfa Spin.Beta *. f_two a i l k Spin.Alfa Spin.Beta )\n",
" )\n",
" \n",
" \n",
"let m_2121_2Ha_2Fa =\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a l Spin.Alfa Spin.Alfa *. f_two a n k n Spin.Alfa Spin.Alfa +.\n",
" h_two j i a k Spin.Alfa Spin.Alfa *. f_two a n l n Spin.Alfa Spin.Alfa \n",
" )\n",
" )\n",
" \n",
"\n",
"let m_2121_2Hb_2Fa =\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a l Spin.Alfa Spin.Beta *. f_two a n k n Spin.Alfa Spin.Alfa +.\n",
" h_two j i a k Spin.Alfa Spin.Beta *. f_two a n l n Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
" \n",
"let m_2121_2Ha_2Fb =\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i j a l Spin.Alfa Spin.Alfa *. f_two a n k n Spin.Alfa Spin.Beta +.\n",
" h_two j i a k Spin.Alfa Spin.Alfa *. f_two a n l n Spin.Alfa Spin.Beta \n",
" )\n",
" )\n",
" \n",
"\n",
"let m_2122_2Ha_2Fa_ij =\n",
" let s = Spin.Alfa in\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i n a k s s *. f_two j a n l s s \n",
" +. h_two i n a l s s *. f_two j a k n s s \n",
" -. h_two j n a k s s *. f_two i a n l s s \n",
" -. h_two j n a l s s *. f_two i a k n s s\n",
" )\n",
" )\n",
" \n",
"let m_2122_2Hb_2Fb_ij =\n",
" let s, s' = Spin.(Alfa, Beta) in\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_two n i a k s s *. f_two a j n l s s'\n",
" +. h_two n j a l s s' *. f_two i a k n s s \n",
" -. h_two n j k a s s' *. f_two i a n l s s'\n",
" )\n",
" )\n",
" \n",
"let m_2122_2Hb_2Fb_ij2 =\n",
" let s, s' = Spin.(Alfa, Beta) in\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" -. h_two i n a l s s' *. f_two a j k n s s' +.\n",
" (if n < j then\n",
" h_two i n k a s s' *. f_two j a l n s' s'\n",
" +. h_two n j a l s' s' *. f_two i a k n s s'\n",
" else \n",
" -. h_two i n k a s s' *. f_two j a n l s' s' \n",
" -. h_two j n a l s' s' *. f_two i a k n s s'\n",
" )\n",
" )\n",
" )\n",
" \n",
"let m_2122_2Ha_2Fa_ij2 =\n",
" let s, s' = Spin.(Alfa, Beta) in\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a ->\n",
" h_two i n k a s s' *. f_two j a l n s s'\n",
" +. h_two j n l a s s' *. f_two i a k n s s'\n",
" -. h_two i n l a s s' *. f_two j a k n s s'\n",
" -. h_two j n k a s s' *. f_two i a l n s s'\n",
" )\n",
" ) \n",
" \n",
"let m_2122_2Ha_2Fa_nv =\n",
" let s = Spin.Alfa in\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a -> h_two i j a n s s *. f_two n a k l s s ) ) \n",
" \n",
" \n",
" \n",
"let m_2122_2Hb_2Fb_nv =\n",
" let s, s' = Spin.(Alfa, Beta) in\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a -> -. h_two i j a n s s' *. f_two a n k l s s' ) ) \n",
" \n",
"let m_2122_2Hb_2Fb_nv2 =\n",
" let s, s' = Spin.(Alfa, Beta) in\n",
" array_5_init mo_num mo_num mo_num mo_num mo_num (fun n i j k l ->\n",
" sum mos_cabs (fun a -> -. h_two i j n a s s' *. f_two n a k l s s' ) ) \n",
" \n",
" \n",
" \n",
"let integral_value ki kj = \n",
" let i, j, k, l, s, s', phase =\n",
" match Excitation.of_det ki kj with\n",
" | Excitation.(Double (phase, { hole ; particle ; spin }, {hole=hole' ; particle=particle' ; spin=spin' })) ->\n",
" hole, hole', particle, particle', spin, spin', phase\n",
" | _ -> assert false\n",
" in\n",
" let mos_i, mos_i' =\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",
" let mos_j, mos_j' =\n",
" match s with\n",
" | Spin.Alfa -> mos_a kj, mos_b kj\n",
" | Spin.Beta -> mos_b kj, mos_a kj\n",
" in\n",
" \n",
" let mos_ij, mos_ij' =\n",
" let alfa = \n",
" let i = Spindeterminant.bitstring @@ Determinant.alfa ki in\n",
" let j = Spindeterminant.bitstring @@ Determinant.alfa kj in\n",
" Bitstring.to_list (Bitstring.logand i j)\n",
" in\n",
" let beta = \n",
" let i = Spindeterminant.bitstring @@ Determinant.beta ki in\n",
" let j = Spindeterminant.bitstring @@ Determinant.beta kj in\n",
" Bitstring.to_list (Bitstring.logand i j)\n",
" in\n",
" match s with\n",
" | Spin.Alfa -> alfa, beta\n",
" | Spin.Beta -> beta, alfa\n",
" in\n",
" \n",
" let mos_novirt, mos_novirt' =\n",
" let alfa = \n",
" let i = Spindeterminant.bitstring @@ Determinant.alfa ki in\n",
" let j = Spindeterminant.bitstring @@ Determinant.alfa kj in\n",
" Bitstring.to_list (Bitstring.logor i j)\n",
" in\n",
" let beta = \n",
" let i = Spindeterminant.bitstring @@ Determinant.beta ki in\n",
" let j = Spindeterminant.bitstring @@ Determinant.beta kj in\n",
" Bitstring.to_list (Bitstring.logor i j)\n",
" in\n",
" match s with\n",
" | Spin.Alfa -> alfa, beta\n",
" | Spin.Beta -> beta, alfa\n",
" in\n",
" \n",
" let result = \n",
" if s = s' then\n",
" m_2112_1H_2Fa.{i,j,k,l} +. \n",
" sum mos_i (fun n -> m_2112_2Ha_2Fa.{n,i,j,k,l} ) +.\n",
" sum mos_i' (fun n -> m_2112_2Hb_2Fa.{n,i,j,k,l} ) +.\n",
" sum mos_j (fun n -> m_2121_2Ha_2Fa.{n,i,j,k,l} ) +.\n",
" sum mos_j' (fun n -> m_2121_2Ha_2Fb.{n,i,j,k,l} ) +.\n",
" sum mos_ij (fun n -> m_2122_2Ha_2Fa_ij.{n,i,j,k,l} ) +. \n",
" sum mos_ij' (fun n -> m_2122_2Ha_2Fa_ij2.{n,i,j,k,l} ) +. \n",
" sum mos_novirt (fun n -> m_2122_2Ha_2Fa_nv.{n,i,j,k,l} ) \n",
" else\n",
" m_2112_1H_2Fb.{i,j,k,l} +. \n",
" sum mos_i (fun n -> m_2112_2Ha_2Fb.{n,i,j,k,l} ) +.\n",
" sum mos_i' (fun n -> m_2112_2Ha_2Fb.{n,j,i,l,k} ) +.\n",
" sum mos_j (fun n -> m_2121_2Hb_2Fa.{n,i,j,k,l} ) +.\n",
" sum mos_j' (fun n -> m_2121_2Hb_2Fa.{n,j,i,l,k} ) +.\n",
" sum mos_novirt'(fun n -> m_2122_2Hb_2Fb_nv.{n,i,j,k,l} ) +.\n",
" sum mos_novirt (fun n -> m_2122_2Hb_2Fb_nv2.{n,i,j,k,l} )+.\n",
" sum mos_ij (fun n -> m_2122_2Hb_2Fb_ij.{n,i,j,k,l} ) +. \n",
" sum mos_ij' (fun n -> m_2122_2Hb_2Fb_ij2.{n,i,j,k,l} ) \n",
" in\n",
"\n",
" match phase with\n",
" | Phase.Pos -> result\n",
" | Phase.Neg -> -. result\n",
" \n",
"let _ = check 100 integral_value 2 \n",
"\n",
"let ki = det_I.(7)\n",
"let kj = det_I.(89)\n",
"\n",
"let _ = integral_value ki kj\n",
"let _ = \n",
" let alphas = generate_alphas ki kj 2 \n",
" in compute_HaaF ki alphas kj\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"# 4. 3"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"val integral_value : Determinant.t -> Determinant.t -> float = <fun>\n"
]
},
"execution_count": 130,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Checking ... \n",
" - 10 %\n",
" - 20 %\n",
" - 30 %\n",
" - 40 %\n",
" - 50 %\n",
" - 60 %\n",
" - 70 %\n",
" - 80 %\n",
" - 90 %\n",
" - 100 %\n",
"OK: (13, 52) | 6.122906e-04 6.122906e-04 | 3.252607e-19 | cpu : 77.238524 0.119682\n"
]
},
{
"data": {
"text/plain": [
"- : unit = ()\n"
]
},
"execution_count": 130,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"let integral_value ki kj = \n",
" let i, j, m, k, l, n, s1, s2, s3, phase =\n",
" match Excitation.of_det ki kj with\n",
" | Excitation.(Triple (phase,\n",
" { hole=h1 ; particle=p1 ; spin=s1 },\n",
" { hole=h2 ; particle=p2 ; spin=s2 },\n",
" { hole=h3 ; particle=p3 ; spin=s3 }) ) -> h1, h2, h3, p1, p2, p3, s1, s2, s3, phase\n",
" | _ -> assert false\n",
" in\n",
"\n",
" let result = \n",
" let open Spin in \n",
" match s1, s2, s3 with\n",
" | Alfa, Alfa, Alfa\n",
" | Beta, Beta, Beta -> \n",
" sum mos_cabs (fun a -> \n",
" h_two i j a k s1 s2 *. f_two m a l n s3 s3 \n",
" +. h_two i j a n s1 s2 *. f_two m a k l s3 s2 \n",
" +. h_two i m a l s1 s3 *. f_two j a k n s2 s3 \n",
" +. h_two j m a k s2 s3 *. f_two i a l n s1 s3 \n",
" +. h_two j m a n s2 s3 *. f_two i a k l s1 s2 \n",
" -. h_two i j a l s1 s2 *. f_two m a k n s3 s3 \n",
" -. h_two i m a k s1 s3 *. f_two j a l n s2 s3 \n",
" -. h_two i m a n s1 s3 *. f_two j a k l s2 s2 \n",
" -. h_two j m a l s2 s3 *. f_two i a k n s1 s3 )\n",
" | Alfa, Alfa, Beta\n",
" | Beta, Beta, Alfa -> \n",
" sum mos_cabs (fun a -> \n",
" h_two i j a l s1 s2 *. f_two a m k n s1 s3\n",
" +. h_two i m k a s1 s3 *. f_two j a l n s2 s3\n",
" +. h_two j m a n s2 s3 *. f_two i a k l s1 s2 \n",
" +. h_two j m l a s2 s3 *. f_two i a k n s1 s3\n",
" -. h_two i j a k s1 s2 *. f_two a m l n s1 s3\n",
" -. h_two i m a n s1 s3 *. f_two j a k l s2 s2 \n",
" -. h_two i m l a s1 s3 *. f_two j a k n s2 s3\n",
" -. h_two j m k a s2 s3 *. f_two i a l n s1 s3\n",
" ) \n",
" | Alfa, Beta, Beta\n",
" | Beta, Alfa, Alfa -> \n",
" sum mos_cabs (fun a -> \n",
" h_two i j a l s1 s2 *. f_two a m k n s1 s3 \n",
" +. h_two i m a n s1 s3 *. f_two a j k l s1 s2 \n",
" +. h_two i m k a s1 s3 *. f_two j a l n s2 s3 \n",
" +. h_two j m a n s2 s3 *. f_two i a k l s1 s2 \n",
" -. h_two i j a n s1 s2 *. f_two a m k l s1 s2 \n",
" -. h_two i j k a s1 s2 *. f_two m a l n s2 s3 \n",
" -. h_two i m a l s1 s3 *. f_two a j k n s1 s3 \n",
" -. h_two j m a l s2 s3 *. f_two i a k n s1 s3 \n",
" ) \n",
" | Beta, Alfa, Beta\n",
" | Alfa, Beta, Alfa -> assert false (*TODO *)\n",
" in\n",
" match phase with\n",
" | Phase.Pos -> result\n",
" | Phase.Neg -> -. result\n",
" \n",
"\n",
"let _ = check 100 integral_value 3 "
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"---------------------------"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true,
"scrolled": false
},
"outputs": [],
"source": [
"let ki = det_I.(129)\n",
"let kj = det_I.(349)\n",
"\n",
"let alpha_to_string alpha = \n",
" \n",
" let exc0 = Array.init (aux_num+1) (fun _ -> [|\"-\";\"-\"|]) in\n",
" \n",
" let i, j, m, k, l, n, s, s', s'', phase =\n",
" match Excitation.of_det ki kj with\n",
" | Excitation.(Triple (phase,\n",
" { hole ; particle ; spin },\n",
" {hole=hole' ; particle=particle' ; spin=spin' }, \n",
" {hole=hole''; particle=particle''; spin=spin''} )) ->\n",
" hole, hole', hole'', particle, particle', particle'', spin, spin', spin'', phase\n",
" | _ -> assert false\n",
" in\n",
" let spin = function\n",
" | Spin.Alfa -> 0\n",
" | _ -> 1\n",
" in\n",
" exc0.(i).(spin s ) <- \"i\" \n",
" ; exc0.(j).(spin s' ) <- \"j\" \n",
" ; exc0.(k).(spin s ) <- \"k\" \n",
" ; exc0.(l).(spin s' ) <- \"l\" \n",
" ; exc0.(m).(spin s'') <- \"m\" \n",
" ; exc0.(n).(spin s'') <- \"n\" \n",
" ;\n",
" let s0, s0', s0'' = s, s', s'' in\n",
" \n",
" let i, j, k, l, s, s', p1 =\n",
" match Excitation.of_det ki alpha with\n",
" | Excitation.(Double (phase, { hole ; particle ; spin }, {hole=hole' ; particle=particle' ; spin=spin' })) ->\n",
" hole, hole', particle, particle', spin, spin', phase\n",
" | _ -> assert false\n",
" in\n",
" \n",
" if exc0.(i).(spin s ) = \"-\" then exc0.(i).(spin s ) <- \"p\";\n",
" if exc0.(j).(spin s') = \"-\" then exc0.(j).(spin s') <- \"p\";\n",
" if exc0.(k).(spin s ) = \"-\" then exc0.(k).(spin s ) <- if k > mo_num then \"a\" else \"q\";\n",
" if exc0.(l).(spin s') = \"-\" then exc0.(l).(spin s') <- if l > mo_num then \"a\" else \"q\";\n",
" \n",
" let string_h = \n",
" Printf.sprintf \"h_two %s %s %s %s %s %s *. \" \n",
" exc0.(i).(spin s )\n",
" exc0.(j).(spin s')\n",
" exc0.(k).(spin s )\n",
" exc0.(l).(spin s')\n",
" (if s = s0 then \"s \" else if s = s0' then \"s'\" else \"s''\")\n",
" (if s' = s0' then \"s'\" else if s = s0'' then \"s''\" else \"s\" )\n",
" in \n",
" \n",
" let i, j, k, l, s, s', p2 =\n",
" match Excitation.of_det alpha kj with\n",
" | Excitation.(Double (phase, { hole ; particle ; spin }, {hole=hole' ; particle=particle' ; spin=spin' })) ->\n",
" hole, hole', particle, particle', spin, spin', phase\n",
" | _ -> assert false\n",
" in\n",
" \n",
" let string_f = \n",
" Printf.sprintf \"f_two %s %s %s %s %s %s\" \n",
" exc0.(i).(spin s )\n",
" exc0.(j).(spin s')\n",
" exc0.(k).(spin s )\n",
" exc0.(l).(spin s')\n",
" (if s = s0 then \"s \" else if s = s0' then \"s'\" else \"s''\")\n",
" (if s' = s0' then \"s'\" else if s = s0'' then \"s''\" else \"s\" )\n",
" in\n",
" (*\n",
" Format.printf \"|I> -> |a> : %a | %s\\n@.\" Excitation.pp (Excitation.of_det ki alpha) string_h ;\n",
" Format.printf \"|a> -> |J> : %a | %s\\n@.\" Excitation.pp (Excitation.of_det alpha kj) string_f ;\n",
" *)\n",
"\n",
" \n",
" let sign = \n",
" if Phase.add p1 p2 = phase then \"+.\" else \"-.\"\n",
" in\n",
" sign ^ string_h ^ string_f\n",
" \n",
"\n",
"let alpha_debug alpha = \n",
" \n",
" let i, j, k, l, s, s', p1 =\n",
" match Excitation.of_det ki alpha with\n",
" | Excitation.(Double (phase, { hole ; particle ; spin }, {hole=hole' ; particle=particle' ; spin=spin' })) ->\n",
" hole, hole', particle, particle', spin, spin', phase\n",
" | _ -> assert false\n",
" in\n",
" Printf.printf \"%d %d %d %d \" i j k l;\n",
" \n",
" let i, j, k, l, s, s', p2 =\n",
" match Excitation.of_det alpha kj with\n",
" | Excitation.(Double (phase, { hole ; particle ; spin }, {hole=hole' ; particle=particle' ; spin=spin' })) ->\n",
" hole, hole', particle, particle', spin, spin', phase\n",
" | _ -> assert false\n",
" in\n",
" (*\n",
" Format.printf \"|I> -> |a> : %a | \\n@.\" Excitation.pp (Excitation.of_det ki alpha) ;\n",
" Format.printf \"|a> -> |J> : %a | \\n@.\" Excitation.pp (Excitation.of_det alpha kj) ;\n",
" *)\n",
" Printf.printf \"%d %d %d %d \\n%!\" i j k l\n",
"\n",
" \n",
"let strings = \n",
" Format.printf \"|I> -> |J> : %a |\\n@.\" Excitation.pp (Excitation.of_det ki kj) ;\n",
" generate_alphas ki kj 3 1 2 2\n",
" |> Array.of_list\n",
" |> Array.mapi (fun kk alpha -> alpha_to_string alpha)\n",
" |> Array.to_list\n",
" |> List.sort_uniq compare\n",
" |> Array.of_list\n",
"\n",
"let _ = Array.iteri (fun i x -> Printf.printf \"%d %s \\n%!\" i x) strings\n",
"\n",
"let _ =\n",
" let v =\n",
" let alphas =\n",
" generate_alphas ki kj 3 1 2 2\n",
" (*\n",
" |> List.filter (fun alpha ->\n",
" let x = alpha_to_string alpha in\n",
" x = strings.(6)\n",
" )\n",
" *)\n",
" in\n",
" (*\n",
" List.iter alpha_debug alphas ;\n",
" Printf.printf \"\\n%!\";\n",
" *)\n",
" compute_HaaF ki alphas kj \n",
" in\n",
" let x = (integral_value ki kj) in\n",
" Printf.printf \"%20.8e %20.8e %20.8e\\n%!\" x v (v-. x)\n"
]
}
],
"metadata": {
"celltoolbar": "Initialization Cell",
"kernelspec": {
"display_name": "OCaml 4.10.0",
"language": "OCaml",
"name": "ocaml-jupyter"
},
"language_info": {
"codemirror_mode": "text/x-ocaml",
"file_extension": ".ml",
"mimetype": "text/x-ocaml",
"name": "OCaml",
"nbconverter_exporter": null,
"pygments_lexer": "OCaml",
"version": "4.10.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}