From bfa9fa8637e6059e68121ac95618d6671c9d12a4 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 17 Oct 2018 16:28:57 +0200 Subject: [PATCH] Cleaned one-electron integrals --- install/scripts/install_ocaml.sh | 6 +- ocaml/Input_ao_basis.ml | 401 ++++++------------ ocaml/Input_mo_basis.ml | 332 +++++---------- plugins/Hartree_Fock/NEEDED_CHILDREN_MODULES | 2 +- plugins/read_integral/NEEDED_CHILDREN_MODULES | 2 +- plugins/read_integral/read_integrals_ao.irp.f | 46 +- plugins/read_integral/read_integrals_mo.irp.f | 10 +- .../read_integrals_mo_chocol.irp.f | 13 +- scripts/module/module_handler.py | 1 - src/AO_Basis/EZFIO.cfg | 30 -- src/AO_one_e_integrals/EZFIO.cfg | 35 ++ .../NEEDED_CHILDREN_MODULES | 1 + src/AO_one_e_integrals/README.rst | 14 + .../ao_mono_ints.irp.f | 0 .../ao_ortho_canonical.irp.f | 0 .../ao_overlap.irp.f | 32 +- .../kin_ao_ints.irp.f | 4 +- .../pot_ao_ints.irp.f | 4 +- .../pot_ao_pseudo_ints.irp.f | 4 +- .../pseudopot.f90 | 0 src/AO_one_e_integrals/read_write.irp.f | 28 ++ .../spread_dipole_ao.irp.f | 0 src/Bitmask/bitmasks.irp.f | 2 +- src/Determinants/NEEDED_CHILDREN_MODULES | 2 +- src/Integrals_Bielec/NEEDED_CHILDREN_MODULES | 2 +- src/Integrals_Monoelec/EZFIO.cfg | 12 - .../NEEDED_CHILDREN_MODULES | 1 - src/Integrals_Monoelec/README.rst | 332 --------------- src/Integrals_Monoelec/read_write.irp.f | 84 ---- src/Integrals_Monoelec/tree_dependency.png | Bin 36832 -> 0 bytes src/MOGuess/NEEDED_CHILDREN_MODULES | 2 +- src/MO_Basis/EZFIO.cfg | 23 - src/MO_Basis/NEEDED_CHILDREN_MODULES | 2 +- src/MO_Basis/mos.irp.f | 39 -- src/MO_Basis/print_aos.irp.f | 53 --- src/MO_one_e_integrals/EZFIO.cfg | 27 ++ .../NEEDED_CHILDREN_MODULES | 1 + src/MO_one_e_integrals/README.rst | 14 + src/MO_one_e_integrals/ao_to_mo.irp.f | 41 ++ .../check_orthonormality.irp.f | 0 .../kin_mo_ints.irp.f | 4 +- .../mo_mono_ints.irp.f | 0 .../mo_overlap.irp.f | 0 .../orthonormalize.irp.f | 0 .../pot_mo_ints.irp.f | 4 +- .../pot_mo_pseudo_ints.irp.f | 4 +- src/MO_one_e_integrals/read_write.irp.f | 28 ++ .../save_ortho_mos.irp.f | 0 .../spread_dipole_mo.irp.f | 0 src/core_integrals/NEEDED_CHILDREN_MODULES | 2 +- 50 files changed, 530 insertions(+), 1114 deletions(-) create mode 100644 src/AO_one_e_integrals/EZFIO.cfg create mode 100644 src/AO_one_e_integrals/NEEDED_CHILDREN_MODULES create mode 100644 src/AO_one_e_integrals/README.rst rename src/{Integrals_Monoelec => AO_one_e_integrals}/ao_mono_ints.irp.f (100%) rename src/{MO_Basis => AO_one_e_integrals}/ao_ortho_canonical.irp.f (100%) rename src/{AO_Basis => AO_one_e_integrals}/ao_overlap.irp.f (87%) rename src/{Integrals_Monoelec => AO_one_e_integrals}/kin_ao_ints.irp.f (97%) rename src/{Integrals_Monoelec => AO_one_e_integrals}/pot_ao_ints.irp.f (99%) rename src/{Integrals_Monoelec => AO_one_e_integrals}/pot_ao_pseudo_ints.irp.f (98%) rename src/{Integrals_Monoelec => AO_one_e_integrals}/pseudopot.f90 (100%) create mode 100644 src/AO_one_e_integrals/read_write.irp.f rename src/{Integrals_Monoelec => AO_one_e_integrals}/spread_dipole_ao.irp.f (100%) delete mode 100644 src/Integrals_Monoelec/EZFIO.cfg delete mode 100644 src/Integrals_Monoelec/NEEDED_CHILDREN_MODULES delete mode 100644 src/Integrals_Monoelec/README.rst delete mode 100644 src/Integrals_Monoelec/read_write.irp.f delete mode 100644 src/Integrals_Monoelec/tree_dependency.png delete mode 100644 src/MO_Basis/print_aos.irp.f create mode 100644 src/MO_one_e_integrals/EZFIO.cfg create mode 100644 src/MO_one_e_integrals/NEEDED_CHILDREN_MODULES create mode 100644 src/MO_one_e_integrals/README.rst create mode 100644 src/MO_one_e_integrals/ao_to_mo.irp.f rename src/{Integrals_Monoelec => MO_one_e_integrals}/check_orthonormality.irp.f (100%) rename src/{Integrals_Monoelec => MO_one_e_integrals}/kin_mo_ints.irp.f (82%) rename src/{Integrals_Monoelec => MO_one_e_integrals}/mo_mono_ints.irp.f (100%) rename src/{MO_Basis => MO_one_e_integrals}/mo_overlap.irp.f (100%) rename src/{Integrals_Monoelec => MO_one_e_integrals}/orthonormalize.irp.f (100%) rename src/{Integrals_Monoelec => MO_one_e_integrals}/pot_mo_ints.irp.f (90%) rename src/{Integrals_Monoelec => MO_one_e_integrals}/pot_mo_pseudo_ints.irp.f (83%) create mode 100644 src/MO_one_e_integrals/read_write.irp.f rename src/{Integrals_Monoelec => MO_one_e_integrals}/save_ortho_mos.irp.f (100%) rename src/{Integrals_Monoelec => MO_one_e_integrals}/spread_dipole_mo.irp.f (100%) diff --git a/install/scripts/install_ocaml.sh b/install/scripts/install_ocaml.sh index cf5ad505..8be20f28 100755 --- a/install/scripts/install_ocaml.sh +++ b/install/scripts/install_ocaml.sh @@ -5,7 +5,7 @@ QP_ROOT=$PWD cd - # Normal installation -PACKAGES="core.v0.10.0 cryptokit ocamlfind sexplib.v0.10.0 zmq ppx_sexp_conv ppx_deriving jbuilder.1.0+beta17" +PACKAGES="core.v0.10.0 cryptokit ocamlfind sexplib.v0.10.0 zmq ppx_sexp_conv ppx_deriving" # Needed for ZeroMQ export C_INCLUDE_PATH="${QP_ROOT}"/include:"${C_INCLUDE_PATH}" @@ -76,8 +76,8 @@ source ${HOME}/.opam/opam-init/init.sh > /dev/null 2> /dev/null || true NCPUs=$(cat /proc/cpuinfo | grep -i MHz | wc -l) -${QP_ROOT}/bin/opam install -j ${NCPUs} stdint.0.4.2 -y -q || exit 1 -${QP_ROOT}/bin/opam install -j ${NCPUs} ${PACKAGES} -y -q || exit 1 +${QP_ROOT}/bin/opam install -j ${NCPUs} stdint.0.4.2 -y || exit 1 +echo ${PACKAGES} | xargs ${QP_ROOT}/bin/opam install -j ${NCPUs} -y || exit 1 rm -f ../_build/ocaml.log diff --git a/ocaml/Input_ao_basis.ml b/ocaml/Input_ao_basis.ml index 348ddd7f..f562b573 100644 --- a/ocaml/Input_ao_basis.ml +++ b/ocaml/Input_ao_basis.ml @@ -1,101 +1,38 @@ +(* =~=~ *) +(* Init *) +(* =~=~ *) + open Qptypes;; open Qputils;; open Core;; module Ao_basis : sig - type t = - { ao_basis : AO_basis_name.t; - ao_num : AO_number.t ; - ao_prim_num : AO_prim_number.t array; - ao_prim_num_max : AO_prim_number.t; - ao_nucl : Nucl_number.t array; - ao_power : Symmetry.Xyz.t array; - ao_coef : AO_coef.t array; - ao_expo : AO_expo.t array; - ao_cartesian : bool; - } [@@deriving sexp] - ;; - val read : unit -> t option +(* Generate type *) + type t = + { + disk_access_ao_one_integrals : Disk_access.t; + } [@@deriving sexp] + ;; + val read : unit -> t option + val write : t-> unit val to_string : t -> string - val to_basis : t -> Basis.t - val write : t -> unit - val to_md5 : t -> MD5.t val to_rst : t -> Rst_string.t + val of_rst : Rst_string.t -> t option end = struct - type t = - { ao_basis : AO_basis_name.t; - ao_num : AO_number.t ; - ao_prim_num : AO_prim_number.t array; - ao_prim_num_max : AO_prim_number.t; - ao_nucl : Nucl_number.t array; - ao_power : Symmetry.Xyz.t array; - ao_coef : AO_coef.t array; - ao_expo : AO_expo.t array; - ao_cartesian : bool; - } [@@deriving sexp] - ;; +(* Generate type *) + type t = + { + disk_access_ao_one_integrals : Disk_access.t; + } [@@deriving sexp] + ;; let get_default = Qpackage.get_ezfio_default "ao_basis";; - let read_ao_basis () = - Ezfio.get_ao_basis_ao_basis () - |> AO_basis_name.of_string - ;; - - let read_ao_num () = - Ezfio.get_ao_basis_ao_num () - |> AO_number.of_int - ;; - - let read_ao_prim_num () = - Ezfio.get_ao_basis_ao_prim_num () - |> Ezfio.flattened_ezfio - |> Array.map ~f:AO_prim_number.of_int - ;; - - let read_ao_prim_num_max () = - Ezfio.get_ao_basis_ao_prim_num () - |> Ezfio.flattened_ezfio - |> Array.fold ~f:(fun x y -> if x>y then x else y) ~init:0 - |> AO_prim_number.of_int - ;; - - let read_ao_nucl () = - let nmax = Nucl_number.get_max () in - Ezfio.get_ao_basis_ao_nucl () - |> Ezfio.flattened_ezfio - |> Array.map ~f:(fun x-> Nucl_number.of_int ~max:nmax x) - ;; - - let read_ao_power () = - let x = Ezfio.get_ao_basis_ao_power () in - let dim = x.Ezfio.dim.(0) in - let data = Ezfio.flattened_ezfio x in - let result = Array.init dim ~f:(fun x -> "") in - for i=1 to dim - do - if (data.(i-1) > 0) then - result.(i-1) <- result.(i-1)^"x"^(Int.to_string data.(i-1)); - if (data.(dim+i-1) > 0) then - result.(i-1) <- result.(i-1)^"y"^(Int.to_string data.(dim+i-1)); - if (data.(2*dim+i-1) > 0) then - result.(i-1) <- result.(i-1)^"z"^(Int.to_string data.(2*dim+i-1)); - done; - Array.map ~f:Symmetry.Xyz.of_string result - ;; - - let read_ao_coef () = - Ezfio.get_ao_basis_ao_coef () - |> Ezfio.flattened_ezfio - |> Array.map ~f:AO_coef.of_float - ;; - - let read_ao_expo () = - Ezfio.get_ao_basis_ao_expo () - |> Ezfio.flattened_ezfio - |> Array.map ~f:AO_expo.of_float - ;; +(* =~=~=~=~=~=~==~=~=~=~=~=~ *) +(* Generate Special Function *) +(* =~=~=~==~=~~=~=~=~=~=~=~=~ *) +(* Read snippet for ao_cartesian *) let read_ao_cartesian () = if not (Ezfio.has_ao_basis_ao_cartesian ()) then get_default "ao_cartesian" @@ -104,191 +41,133 @@ end = struct ; Ezfio.get_ao_basis_ao_cartesian () ;; - - let to_long_basis b = - let ao_num = AO_number.to_int b.ao_num in - let gto_array = Array.init (AO_number.to_int b.ao_num) - ~f:(fun i -> - let s = Symmetry.Xyz.to_symmetry b.ao_power.(i) in - let ao_prim_num = AO_prim_number.to_int b.ao_prim_num.(i) in - let prims = List.init ao_prim_num ~f:(fun j -> - let prim = { GaussianPrimitive.sym = s ; - GaussianPrimitive.expo = b.ao_expo.(ao_num*j+i) - } - in - let coef = b.ao_coef.(ao_num*j+i) in - (prim,coef) - ) in - Gto.of_prim_coef_list prims - ) - in - let rec do_work accu sym gto nucl = - match (sym, gto, nucl) with - | (s::srest, g::grest, n::nrest) -> - do_work ((s,g,n)::accu) srest grest nrest - | ([],[],[]) -> List.rev accu - | _ -> assert false - in - do_work [] - (Array.to_list b.ao_power) - (Array.to_list gto_array) - (Array.to_list b.ao_nucl) - ;; - let to_basis b = - to_long_basis b - |> Long_basis.to_basis - ;; - - let to_md5 b = - let short_basis = to_basis b in - Basis.to_md5 short_basis - ;; - - - - let write_md5 b = - to_md5 b - |> MD5.to_string - |> Ezfio.set_ao_basis_ao_md5 +(* Write snippet for ao_cartesian *) + let write_ao_cartesian = + Ezfio.set_ao_basis_ao_cartesian ;; - let write_ao_basis name = - AO_basis_name.to_string name - |> Ezfio.set_ao_basis_ao_basis +(* Read snippet for ao_prim_num_max *) + let read_ao_prim_num_max () = + if not (Ezfio.has_ao_basis_ao_prim_num_max ()) then + get_default "ao_prim_num_max" + |> Int.of_string + |> Ezfio.set_ao_basis_ao_prim_num_max + ; + Ezfio.get_ao_basis_ao_prim_num_max () + ;; +(* Write snippet for ao_prim_num_max *) + let write_ao_prim_num_max = + Ezfio.set_ao_basis_ao_prim_num_max ;; - let write b = - let { ao_basis ; - ao_num ; - ao_prim_num ; - ao_prim_num_max ; - ao_nucl ; - ao_power ; - ao_coef ; - ao_expo ; - ao_cartesian ; - } = b - in - write_md5 b ; - write_ao_basis ao_basis; +(* Read snippet for disk_access_ao_one_integrals *) + let read_disk_access_ao_one_integrals () = + if not (Ezfio.has_ao_basis_disk_access_ao_one_integrals ()) then + get_default "disk_access_ao_one_integrals" + |> String.of_string + |> Ezfio.set_ao_basis_disk_access_ao_one_integrals + ; + Ezfio.get_ao_basis_disk_access_ao_one_integrals () + |> Disk_access.of_string + ;; +(* Write snippet for disk_access_ao_one_integrals *) + let write_disk_access_ao_one_integrals var = + Disk_access.to_string var + |> Ezfio.set_ao_basis_disk_access_ao_one_integrals ;; - - let read () = - if (Ezfio.has_ao_basis_ao_basis ()) then - begin - let result = - { ao_basis = read_ao_basis (); - ao_num = read_ao_num () ; - ao_prim_num = read_ao_prim_num (); - ao_prim_num_max = read_ao_prim_num_max (); - ao_nucl = read_ao_nucl (); - ao_power = read_ao_power (); - ao_coef = read_ao_coef () ; - ao_expo = read_ao_expo () ; - ao_cartesian = read_ao_cartesian () ; - } - in - to_md5 result - |> MD5.to_string - |> Ezfio.set_ao_basis_ao_md5 ; - Some result - end - else - None +(* Read snippet for integral_kinetic *) + let read_integral_kinetic () = + if not (Ezfio.has_ao_basis_integral_kinetic ()) then + get_default "integral_kinetic" + |> Float.of_string + |> Ezfio.set_ao_basis_integral_kinetic + ; + Ezfio.get_ao_basis_integral_kinetic () ;; - - - let to_rst b = - let print_sym = - let l = List.init (Array.length b.ao_power) ~f:( - fun i -> ( (i+1),b.ao_nucl.(i),b.ao_power.(i) ) ) in - let rec do_work = function - | [] -> [] - | (i,n,x)::tail -> - (Printf.sprintf " %5d %6d %-8s\n" i (Nucl_number.to_int n) (Symmetry.Xyz.to_string x)):: - (do_work tail) - in do_work l - |> String.concat - in - - let short_basis = to_basis b in - Printf.sprintf " -Name of the AO basis :: - - ao_basis = %s - -Cartesian coordinates (6d,10f,...) :: - - ao_cartesian = %s - -Basis set (read-only) :: - -%s - - -======= ========= =========== - Basis Nucleus Symmetries -======= ========= =========== -%s -======= ========= =========== - -" (AO_basis_name.to_string b.ao_basis) - (Bool.to_string b.ao_cartesian) - (Basis.to_string short_basis - |> String.split ~on:'\n' - |> List.map ~f:(fun x-> " "^x) - |> String.concat ~sep:"\n" - ) print_sym - - |> Rst_string.of_string +(* Write snippet for integral_kinetic *) + let write_integral_kinetic = + Ezfio.set_ao_basis_integral_kinetic ;; - let read_rst s = - let s = Rst_string.to_string s - |> String.split ~on:'\n' - in - let rec extract_basis = function - | [] -> failwith "Error in basis set" - | line :: tail -> - let line = String.strip line in - if line = "Basis set (read-only) ::" then - String.concat tail ~sep:"\n" - else - extract_basis tail - in - extract_basis s +(* Read snippet for integral_nuclear *) + let read_integral_nuclear () = + if not (Ezfio.has_ao_basis_integral_nuclear ()) then + get_default "integral_nuclear" + |> Float.of_string + |> Ezfio.set_ao_basis_integral_nuclear + ; + Ezfio.get_ao_basis_integral_nuclear () + ;; +(* Write snippet for integral_nuclear *) + let write_integral_nuclear = + Ezfio.set_ao_basis_integral_nuclear ;; - let to_string b = - Printf.sprintf " -ao_basis = %s -ao_num = %s -ao_prim_num = %s -ao_prim_num_max = %s -ao_nucl = %s -ao_power = %s -ao_coef = %s -ao_expo = %s -ao_cartesian = %s -md5 = %s -" - (AO_basis_name.to_string b.ao_basis) - (AO_number.to_string b.ao_num) - (b.ao_prim_num |> Array.to_list |> List.map - ~f:(AO_prim_number.to_string) |> String.concat ~sep:", " ) - (AO_prim_number.to_string b.ao_prim_num_max) - (b.ao_nucl |> Array.to_list |> List.map ~f:Nucl_number.to_string |> - String.concat ~sep:", ") - (b.ao_power |> Array.to_list |> List.map ~f:(fun x-> - "("^(Symmetry.Xyz.to_string x)^")" )|> String.concat ~sep:", ") - (b.ao_coef |> Array.to_list |> List.map ~f:AO_coef.to_string - |> String.concat ~sep:", ") - (b.ao_expo |> Array.to_list |> List.map ~f:AO_expo.to_string - |> String.concat ~sep:", ") - (b.ao_cartesian |> Bool.to_string) - (to_md5 b |> MD5.to_string ) - +(* Read snippet for integral_overlap *) + let read_integral_overlap () = + if not (Ezfio.has_ao_basis_integral_overlap ()) then + get_default "integral_overlap" + |> Float.of_string + |> Ezfio.set_ao_basis_integral_overlap + ; + Ezfio.get_ao_basis_integral_overlap () + ;; +(* Write snippet for integral_overlap *) + let write_integral_overlap = + Ezfio.set_ao_basis_integral_overlap ;; -end +(* Read snippet for integral_pseudo *) + let read_integral_pseudo () = + if not (Ezfio.has_ao_basis_integral_pseudo ()) then + get_default "integral_pseudo" + |> Float.of_string + |> Ezfio.set_ao_basis_integral_pseudo + ; + Ezfio.get_ao_basis_integral_pseudo () + ;; +(* Write snippet for integral_pseudo *) + let write_integral_pseudo = + Ezfio.set_ao_basis_integral_pseudo + ;; + +(* =~=~=~=~=~=~=~=~=~=~=~=~ *) +(* Generate Global Function *) +(* =~=~=~=~=~=~=~=~=~=~=~=~ *) + +(* Read all *) + let read() = + Some + { + disk_access_ao_one_integrals = read_disk_access_ao_one_integrals (); + } + ;; +(* Write all *) + let write{ + disk_access_ao_one_integrals; + } = + write_disk_access_ao_one_integrals disk_access_ao_one_integrals; + ;; +(* to_string*) + let to_string b = + Printf.sprintf " + disk_access_ao_one_integrals = %s + " + (Disk_access.to_string b.disk_access_ao_one_integrals) + ;; +(* to_rst*) + let to_rst b = + Printf.sprintf " + Read/Write AO one-electron integrals from/to disk [ Write | Read | None ] :: + + disk_access_ao_one_integrals = %s + + " + (Disk_access.to_string b.disk_access_ao_one_integrals) + |> Rst_string.of_string + ;; + include Generic_input_of_rst;; + let of_rst = of_rst t_of_sexp;; + +end \ No newline at end of file diff --git a/ocaml/Input_mo_basis.ml b/ocaml/Input_mo_basis.ml index c51a7f4a..1bd01427 100644 --- a/ocaml/Input_mo_basis.ml +++ b/ocaml/Input_mo_basis.ml @@ -1,229 +1,131 @@ -open Qptypes -open Qputils -open Core +(* =~=~ *) +(* Init *) +(* =~=~ *) +open Qptypes;; +open Qputils;; +open Core;; module Mo_basis : sig - type t = - { mo_tot_num : MO_number.t ; - mo_label : MO_label.t; - mo_class : MO_class.t array; - mo_occ : MO_occ.t array; - mo_coef : (MO_coef.t array) array; - ao_md5 : MD5.t; - } [@@deriving sexp] - val read : unit -> t option +(* Generate type *) + type t = + { + disk_access_mo_one_integrals : Disk_access.t; + } [@@deriving sexp] + ;; + val read : unit -> t option + val write : t-> unit val to_string : t -> string val to_rst : t -> Rst_string.t + val of_rst : Rst_string.t -> t option end = struct - type t = - { mo_tot_num : MO_number.t ; - mo_label : MO_label.t; - mo_class : MO_class.t array; - mo_occ : MO_occ.t array; - mo_coef : (MO_coef.t array) array; - ao_md5 : MD5.t; - } [@@deriving sexp] - let get_default = Qpackage.get_ezfio_default "mo_basis" +(* Generate type *) + type t = + { + disk_access_mo_one_integrals : Disk_access.t; + } [@@deriving sexp] + ;; - let read_mo_label () = - if not (Ezfio.has_mo_basis_mo_label ()) then - Ezfio.set_mo_basis_mo_label "None" + let get_default = Qpackage.get_ezfio_default "mo_basis";; + +(* =~=~=~=~=~=~==~=~=~=~=~=~ *) +(* Generate Special Function *) +(* =~=~=~==~=~~=~=~=~=~=~=~=~ *) + +(* Read snippet for disk_access_mo_one_integrals *) + let read_disk_access_mo_one_integrals () = + if not (Ezfio.has_mo_basis_disk_access_mo_one_integrals ()) then + get_default "disk_access_mo_one_integrals" + |> String.of_string + |> Ezfio.set_mo_basis_disk_access_mo_one_integrals ; - Ezfio.get_mo_basis_mo_label () - |> MO_label.of_string + Ezfio.get_mo_basis_disk_access_mo_one_integrals () + |> Disk_access.of_string + ;; +(* Write snippet for disk_access_mo_one_integrals *) + let write_disk_access_mo_one_integrals var = + Disk_access.to_string var + |> Ezfio.set_mo_basis_disk_access_mo_one_integrals + ;; +(* Read snippet for integral_kinetic *) + let read_integral_kinetic () = + if not (Ezfio.has_mo_basis_integral_kinetic ()) then + get_default "integral_kinetic" + |> Float.of_string + |> Ezfio.set_mo_basis_integral_kinetic + ; + Ezfio.get_mo_basis_integral_kinetic () + ;; +(* Write snippet for integral_kinetic *) + let write_integral_kinetic = + Ezfio.set_mo_basis_integral_kinetic + ;; - let read_ao_md5 () = - let ao_md5 = - match (Input_ao_basis.Ao_basis.read ()) with - | None -> failwith "Unable to read AO basis" - | Some result -> Input_ao_basis.Ao_basis.to_md5 result - in - let result = - if not (Ezfio.has_mo_basis_ao_md5 ()) then - begin - MD5.to_string ao_md5 - |> Ezfio.set_mo_basis_ao_md5 - end; - Ezfio.get_mo_basis_ao_md5 () - |> MD5.of_string - in - if (ao_md5 <> result) then - failwith "The current MOs don't correspond to the current AOs."; - result +(* Read snippet for integral_nuclear *) + let read_integral_nuclear () = + if not (Ezfio.has_mo_basis_integral_nuclear ()) then + get_default "integral_nuclear" + |> Float.of_string + |> Ezfio.set_mo_basis_integral_nuclear + ; + Ezfio.get_mo_basis_integral_nuclear () + ;; +(* Write snippet for integral_nuclear *) + let write_integral_nuclear = + Ezfio.set_mo_basis_integral_nuclear + ;; +(* Read snippet for integral_pseudo *) + let read_integral_pseudo () = + if not (Ezfio.has_mo_basis_integral_pseudo ()) then + get_default "integral_pseudo" + |> Float.of_string + |> Ezfio.set_mo_basis_integral_pseudo + ; + Ezfio.get_mo_basis_integral_pseudo () + ;; +(* Write snippet for integral_pseudo *) + let write_integral_pseudo = + Ezfio.set_mo_basis_integral_pseudo + ;; - let read_mo_tot_num () = - Ezfio.get_mo_basis_mo_tot_num () - |> MO_number.of_int - - - let read_mo_class () = - if not (Ezfio.has_mo_basis_mo_class ()) then - begin - let mo_tot_num = MO_number.to_int (read_mo_tot_num ()) in - let data = - Array.init mo_tot_num ~f:(fun _ -> MO_class.(to_string (Active []))) - |> Array.to_list - in - Ezfio.ezfio_array_of_list ~rank:1 - ~dim:[| mo_tot_num |] ~data:data - |> Ezfio.set_mo_basis_mo_class - end; - Ezfio.flattened_ezfio (Ezfio.get_mo_basis_mo_class () ) - |> Array.map ~f:MO_class.of_string - - - let read_mo_occ () = - if not (Ezfio.has_mo_basis_mo_label ()) then - begin - let elec_alpha_num = Ezfio.get_electrons_elec_alpha_num () - and elec_beta_num = Ezfio.get_electrons_elec_beta_num () - and mo_tot_num = MO_number.to_int (read_mo_tot_num ()) in - let data = Array.init mo_tot_num ~f:(fun i -> - if (i Array.to_list in - Ezfio.ezfio_array_of_list ~rank:1 - ~dim:[| mo_tot_num |] ~data:data - |> Ezfio.set_mo_basis_mo_occ - end; - Ezfio.flattened_ezfio (Ezfio.get_mo_basis_mo_occ () ) - |> Array.map ~f:MO_occ.of_float - - - let read_mo_coef () = - let a = Ezfio.get_mo_basis_mo_coef () - |> Ezfio.flattened_ezfio - |> Array.map ~f:MO_coef.of_float - in - let mo_tot_num = read_mo_tot_num () |> MO_number.to_int in - let ao_num = (Array.length a)/mo_tot_num in - Array.init mo_tot_num ~f:(fun j -> - Array.sub ~pos:(j*ao_num) ~len:(ao_num) a - ) - - - let read () = - if (Ezfio.has_mo_basis_mo_tot_num ()) then - Some - { mo_tot_num = read_mo_tot_num (); - mo_label = read_mo_label () ; - mo_class = read_mo_class (); - mo_occ = read_mo_occ (); - mo_coef = read_mo_coef (); - ao_md5 = read_ao_md5 (); - } - else - None - - - let mo_coef_to_string mo_coef = - let ao_num = Array.length mo_coef.(0) - and mo_tot_num = Array.length mo_coef in - let rec print_five imin imax = - match (imax-imin+1) with - | 1 -> - let header = [ Printf.sprintf " #%15d" (imin+1) ; ] in - let new_lines = - List.init ao_num ~f:(fun i -> - Printf.sprintf " %3d %15.10f " (i+1) - (MO_coef.to_float mo_coef.(imin ).(i)) ) - in header @ new_lines - | 2 -> - let header = [ Printf.sprintf " #%15d %15d" (imin+1) (imin+2) ; ] in - let new_lines = - List.init ao_num ~f:(fun i -> - Printf.sprintf " %3d %15.10f %15.10f" (i+1) - (MO_coef.to_float mo_coef.(imin ).(i)) - (MO_coef.to_float mo_coef.(imin+1).(i)) ) - in header @ new_lines - | 3 -> - let header = [ Printf.sprintf " #%15d %15d %15d" - (imin+1) (imin+2) (imin+3); ] in - let new_lines = - List.init ao_num ~f:(fun i -> - Printf.sprintf " %3d %15.10f %15.10f %15.10f" (i+1) - (MO_coef.to_float mo_coef.(imin ).(i)) - (MO_coef.to_float mo_coef.(imin+1).(i)) - (MO_coef.to_float mo_coef.(imin+2).(i)) ) - in header @ new_lines - | 4 -> - let header = [ Printf.sprintf " #%15d %15d %15d %15d" - (imin+1) (imin+2) (imin+3) (imin+4) ; ] in - let new_lines = - List.init ao_num ~f:(fun i -> - Printf.sprintf " %3d %15.10f %15.10f %15.10f %15.10f" (i+1) - (MO_coef.to_float mo_coef.(imin ).(i)) - (MO_coef.to_float mo_coef.(imin+1).(i)) - (MO_coef.to_float mo_coef.(imin+2).(i)) - (MO_coef.to_float mo_coef.(imin+3).(i)) ) - in header @ new_lines - | 5 -> - let header = [ Printf.sprintf " #%15d %15d %15d %15d %15d" - (imin+1) (imin+2) (imin+3) (imin+4) (imin+5) ; ] in - let new_lines = - List.init ao_num ~f:(fun i -> - Printf.sprintf " %3d %15.10f %15.10f %15.10f %15.10f %15.10f" (i+1) - (MO_coef.to_float mo_coef.(imin ).(i)) - (MO_coef.to_float mo_coef.(imin+1).(i)) - (MO_coef.to_float mo_coef.(imin+2).(i)) - (MO_coef.to_float mo_coef.(imin+3).(i)) - (MO_coef.to_float mo_coef.(imin+4).(i)) ) - in header @ new_lines - | _ -> assert false - in - let rec create_list accu i = - if (i+4 < mo_tot_num) then - create_list ( (print_five i (i+3) |> String.concat ~sep:"\n")::accu ) (i+4) - else - (print_five i (mo_tot_num-1) |> String.concat ~sep:"\n")::accu |> List.rev - in - create_list [] 0 |> String.concat ~sep:"\n\n" - - - let to_rst b = - Printf.sprintf " -Label of the molecular orbitals :: - - mo_label = %s - -Total number of MOs :: - - mo_tot_num = %s - -MO coefficients :: - -%s -" - (MO_label.to_string b.mo_label) - (MO_number.to_string b.mo_tot_num) - (mo_coef_to_string b.mo_coef) - |> Rst_string.of_string - - - - let to_string b = - Printf.sprintf " -mo_label = %s -mo_tot_num = \"%s\" -mo_clas = %s -mo_occ = %s -mo_coef = %s -" - (MO_label.to_string b.mo_label) - (MO_number.to_string b.mo_tot_num) - (b.mo_class |> Array.to_list |> List.map - ~f:(MO_class.to_string) |> String.concat ~sep:", " ) - (b.mo_occ |> Array.to_list |> List.map - ~f:(MO_occ.to_string) |> String.concat ~sep:", " ) - (b.mo_coef |> Array.map - ~f:(fun x-> Array.map ~f:MO_coef.to_string x |> String.concat_array - ~sep:"," ) |> - String.concat_array ~sep:"\n" ) - - -end +(* =~=~=~=~=~=~=~=~=~=~=~=~ *) +(* Generate Global Function *) +(* =~=~=~=~=~=~=~=~=~=~=~=~ *) +(* Read all *) + let read() = + Some + { + disk_access_mo_one_integrals = read_disk_access_mo_one_integrals (); + } + ;; +(* Write all *) + let write{ + disk_access_mo_one_integrals; + } = + write_disk_access_mo_one_integrals disk_access_mo_one_integrals; + ;; +(* to_string*) + let to_string b = + Printf.sprintf " + disk_access_mo_one_integrals = %s + " + (Disk_access.to_string b.disk_access_mo_one_integrals) + ;; +(* to_rst*) + let to_rst b = + Printf.sprintf " + Read/Write MO one-electron integrals from/to disk [ Write | Read | None ] :: + + disk_access_mo_one_integrals = %s + + " + (Disk_access.to_string b.disk_access_mo_one_integrals) + |> Rst_string.of_string + ;; + include Generic_input_of_rst;; + let of_rst = of_rst t_of_sexp;; +end \ No newline at end of file diff --git a/plugins/Hartree_Fock/NEEDED_CHILDREN_MODULES b/plugins/Hartree_Fock/NEEDED_CHILDREN_MODULES index 6fb87e35..f0ef5d67 100644 --- a/plugins/Hartree_Fock/NEEDED_CHILDREN_MODULES +++ b/plugins/Hartree_Fock/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Integrals_Bielec MOGuess Bitmask +Integrals_Bielec AO_one_e_integrals MOGuess Bitmask diff --git a/plugins/read_integral/NEEDED_CHILDREN_MODULES b/plugins/read_integral/NEEDED_CHILDREN_MODULES index 566762ba..0c15e599 100644 --- a/plugins/read_integral/NEEDED_CHILDREN_MODULES +++ b/plugins/read_integral/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Integrals_Monoelec Integrals_Bielec Hartree_Fock +AO_one_e_integrals MO_one_e_integrals Integrals_Bielec Hartree_Fock diff --git a/plugins/read_integral/read_integrals_ao.irp.f b/plugins/read_integral/read_integrals_ao.irp.f index 77f2213e..dab342ec 100644 --- a/plugins/read_integral/read_integrals_ao.irp.f +++ b/plugins/read_integral/read_integrals_ao.irp.f @@ -1,7 +1,7 @@ program read_integrals PROVIDE ezfio_filename - call ezfio_set_integrals_monoelec_disk_access_ao_one_integrals("None") + call ezfio_set_ao_one_e_integrals_disk_access_ao_one_integrals("None") call run end @@ -22,41 +22,54 @@ subroutine run integer(key_kind) :: key allocate (A(ao_num,ao_num)) + A = 0.d0 - iunit = getunitandopen('kinetic_ao','r') - do + do read (iunit,*,end=10) i,j, integral A(i,j) = integral - A(j,i) = integral enddo 10 continue close(iunit) - call write_one_e_integrals('ao_kinetic_integral', A, size(A,1), size(A,2)) + call ezfio_set_ao_one_e_integrals_integral_kinetic(A(1:ao_num, 1:ao_num)) + A = 0.d0 + iunit = getunitandopen('overlap_ao','r') + do + read (iunit,*,end=11) i,j, integral + A(i,j) = integral + enddo + 11 continue + close(iunit) + call ezfio_set_ao_one_e_integrals_integral_overlap(A(1:ao_num, 1:ao_num)) + + A = 0.d0 + iunit = getunitandopen('pseudo_ao','r') + do + read (iunit,*,end=14) i,j, integral + A(i,j) = integral + enddo + 14 continue + close(iunit) + call ezfio_set_ao_one_e_integrals_integral_pseudo(A(1:ao_num,1:ao_num)) A = 0.d0 iunit = getunitandopen('nuclear_ao','r') - do + do read (iunit,*,end=12) i,j, integral A(i,j) = integral - A(j,i) = integral enddo 12 continue close(iunit) - call write_one_e_integrals('ao_ne_integral', A, size(A,1), size(A,2)) + call ezfio_set_ao_one_e_integrals_integral_nuclear(A(1:ao_num, 1:ao_num)) - call write_one_e_integrals('ao_pseudo_integral', ao_pseudo_integral,& - size(ao_pseudo_integral,1), size(ao_pseudo_integral,2)) - - - call ezfio_set_integrals_monoelec_disk_access_ao_one_integrals("Read") + call ezfio_set_ao_one_e_integrals_disk_access_ao_one_integrals("Read") allocate(buffer_i(ao_num**4), buffer_values(ao_num**4)) - iunit = getunitandopen('bielec_ao','r') n_integrals=0 - do + buffer_values = 0.d0 + do read (iunit,*,end=13) i,j,k,l, integral n_integrals += 1 call bielec_integrals_index(i, j, k, l, buffer_i(n_integrals) ) @@ -64,7 +77,8 @@ subroutine run enddo 13 continue close(iunit) - + + call insert_into_ao_integrals_map(n_integrals,buffer_i,buffer_values) call map_sort(ao_integrals_map) diff --git a/plugins/read_integral/read_integrals_mo.irp.f b/plugins/read_integral/read_integrals_mo.irp.f index c021941c..593ee20b 100644 --- a/plugins/read_integral/read_integrals_mo.irp.f +++ b/plugins/read_integral/read_integrals_mo.irp.f @@ -11,7 +11,7 @@ program read_integrals integer :: i,j,n PROVIDE ezfio_filename - call ezfio_set_integrals_monoelec_disk_access_mo_one_integrals("None") + call ezfio_set_mo_one_e_integrals_disk_access_mo_one_integrals("None") logical :: has call ezfio_has_mo_basis_mo_tot_num(has) @@ -74,7 +74,7 @@ subroutine run enddo 10 continue close(iunit) - call write_one_e_integrals('mo_kinetic_integral', A, size(A,1), size(A,2)) + call ezfio_set_mo_one_e_integrals_integral_kinetic(mo_kinetic_integral) iunit = getunitandopen('nuclear_mo','r') @@ -84,10 +84,10 @@ subroutine run enddo 12 continue close(iunit) - call write_one_e_integrals('mo_ne_integral', A, size(A,1), size(A,2)) + call ezfio_set_mo_one_e_integrals_integral_nuclear(A) + call ezfio_set_mo_one_e_integrals_integral_pseudo(mo_pseudo_integral) - call write_one_e_integrals('mo_pseudo_integral', mo_pseudo_integral,& - size(mo_pseudo_integral,1), size(mo_pseudo_integral,2)) + call ezfio_set_mo_one_e_integrals_disk_access_mo_one_integrals("Read") call ezfio_set_integrals_monoelec_disk_access_mo_one_integrals("Read") diff --git a/plugins/read_integral/read_integrals_mo_chocol.irp.f b/plugins/read_integral/read_integrals_mo_chocol.irp.f index 8e5fde8e..c781cccc 100644 --- a/plugins/read_integral/read_integrals_mo_chocol.irp.f +++ b/plugins/read_integral/read_integrals_mo_chocol.irp.f @@ -11,7 +11,7 @@ program read_integrals integer :: i,j,n PROVIDE ezfio_filename - call ezfio_set_integrals_monoelec_disk_access_mo_one_integrals("None") + call ezfio_set_mo_one_e_integrals_disk_access_mo_one_integrals("None") logical :: has call ezfio_has_mo_basis_mo_tot_num(has) @@ -66,7 +66,7 @@ subroutine run enddo 10 continue close(iunit) - call write_one_e_integrals('mo_kinetic_integral', A, size(A,1), size(A,2)) + call ezfio_set_mo_one_e_integrals_integral_kinetic(mo_kinetic_integral) iunit = getunitandopen('nuclear_mo','r') @@ -76,11 +76,8 @@ subroutine run enddo 12 continue close(iunit) - call write_one_e_integrals('mo_ne_integral', A, size(A,1), size(A,2)) + call ezfio_set_mo_one_e_integrals_integral_nuclear(A) + call ezfio_set_mo_one_e_integrals_integral_pseudo(mo_pseudo_integral) - call write_one_e_integrals('mo_pseudo_integral', mo_pseudo_integral,& - size(mo_pseudo_integral,1), size(mo_pseudo_integral,2)) - - - call ezfio_set_integrals_monoelec_disk_access_mo_one_integrals("Read") + call ezfio_set_mo_one_e_integrals_disk_access_mo_one_integrals("Read") end diff --git a/scripts/module/module_handler.py b/scripts/module/module_handler.py index c142cdb4..9e7e3c04 100755 --- a/scripts/module/module_handler.py +++ b/scripts/module/module_handler.py @@ -301,7 +301,6 @@ if __name__ == '__main__': # Don't update if we are not in the main repository from is_master_repository import is_master_repository if not is_master_repository: - print >> sys.stderr, 'Not in the master repo' sys.exit(0) path = os.path.join(module_abs, ".gitignore") diff --git a/src/AO_Basis/EZFIO.cfg b/src/AO_Basis/EZFIO.cfg index 81fcffa0..e2e86633 100644 --- a/src/AO_Basis/EZFIO.cfg +++ b/src/AO_Basis/EZFIO.cfg @@ -55,33 +55,3 @@ doc: If true, use AOs in Cartesian coordinates (6d,10f,...) interface: ezfio, provider default: false -[integral_overlap] -type: double precision -doc: Overlap integrals in AO basis set -size: (ao_basis.ao_num,ao_basis.ao_num) -interface: ezfio -default: false - -[integral_nuclear] -type: double precision -doc: Nucleus-electron integrals in AO basis set -size: (ao_basis.ao_num,ao_basis.ao_num) -interface: ezfio -default: false - -[integral_kinetic] -type: double precision -doc: Kinetic energy integrals in AO basis set -size: (ao_basis.ao_num,ao_basis.ao_num) -interface: ezfio -default: false - - -[integral_pseudo] -type: double precision -doc: Pseudopotential integrals in AO basis set -size: (ao_basis.ao_num,ao_basis.ao_num) -interface: ezfio -default: false - - diff --git a/src/AO_one_e_integrals/EZFIO.cfg b/src/AO_one_e_integrals/EZFIO.cfg new file mode 100644 index 00000000..7689ac0c --- /dev/null +++ b/src/AO_one_e_integrals/EZFIO.cfg @@ -0,0 +1,35 @@ +[integral_nuclear] +type: double precision +doc: Nucleus-electron integrals in AO basis set +size: (ao_basis.ao_num,ao_basis.ao_num) +interface: ezfio +default: false + +[integral_kinetic] +type: double precision +doc: Kinetic energy integrals in AO basis set +size: (ao_basis.ao_num,ao_basis.ao_num) +interface: ezfio +default: false + +[integral_pseudo] +type: double precision +doc: Pseudopotential integrals in AO basis set +size: (ao_basis.ao_num,ao_basis.ao_num) +interface: ezfio +default: false + +[integral_overlap] +type: double precision +doc: Overlap integrals in AO basis set +size: (ao_basis.ao_num,ao_basis.ao_num) +interface: ezfio +default: false + +[disk_access_ao_one_integrals] +type: Disk_access +doc: Read/Write AO one-electron integrals from/to disk [ Write | Read | None ] +interface: ezfio,provider,ocaml +default: None + + diff --git a/src/AO_one_e_integrals/NEEDED_CHILDREN_MODULES b/src/AO_one_e_integrals/NEEDED_CHILDREN_MODULES new file mode 100644 index 00000000..4ed799d7 --- /dev/null +++ b/src/AO_one_e_integrals/NEEDED_CHILDREN_MODULES @@ -0,0 +1 @@ +AO_Basis Pseudo diff --git a/src/AO_one_e_integrals/README.rst b/src/AO_one_e_integrals/README.rst new file mode 100644 index 00000000..0001ebbd --- /dev/null +++ b/src/AO_one_e_integrals/README.rst @@ -0,0 +1,14 @@ +================== +AO_one_e_integrals +================== + +All the one-electron integrals in AO basis are here. + +Needed Modules +============== +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. +Documentation +============= +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. diff --git a/src/Integrals_Monoelec/ao_mono_ints.irp.f b/src/AO_one_e_integrals/ao_mono_ints.irp.f similarity index 100% rename from src/Integrals_Monoelec/ao_mono_ints.irp.f rename to src/AO_one_e_integrals/ao_mono_ints.irp.f diff --git a/src/MO_Basis/ao_ortho_canonical.irp.f b/src/AO_one_e_integrals/ao_ortho_canonical.irp.f similarity index 100% rename from src/MO_Basis/ao_ortho_canonical.irp.f rename to src/AO_one_e_integrals/ao_ortho_canonical.irp.f diff --git a/src/AO_Basis/ao_overlap.irp.f b/src/AO_one_e_integrals/ao_overlap.irp.f similarity index 87% rename from src/AO_Basis/ao_overlap.irp.f rename to src/AO_one_e_integrals/ao_overlap.irp.f index 2d169244..b92429bc 100644 --- a/src/AO_Basis/ao_overlap.irp.f +++ b/src/AO_one_e_integrals/ao_overlap.irp.f @@ -1,4 +1,4 @@ - BEGIN_PROVIDER [ double precision, ao_overlap_matrix,(ao_num,ao_num) ] + BEGIN_PROVIDER [ double precision, ao_overlap,(ao_num,ao_num) ] &BEGIN_PROVIDER [ double precision, ao_overlap_x,(ao_num,ao_num) ] &BEGIN_PROVIDER [ double precision, ao_overlap_y,(ao_num,ao_num) ] &BEGIN_PROVIDER [ double precision, ao_overlap_z,(ao_num,ao_num) ] @@ -14,6 +14,15 @@ double precision :: alpha, beta, c double precision :: A_center(3), B_center(3) integer :: power_A(3), power_B(3) + ao_overlap = 0.d0 + ao_overlap_x = 0.d0 + ao_overlap_y = 0.d0 + ao_overlap_z = 0.d0 + if (read_ao_one_integrals) then + call ezfio_get_ao_one_e_integrals_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) + print *, 'AO overlap integrals read from disk' + else + dim1=100 !$OMP PARALLEL DO SCHEDULE(GUIDED) & !$OMP DEFAULT(NONE) & @@ -21,7 +30,7 @@ !$OMP overlap_x,overlap_y, overlap_z, overlap, & !$OMP alpha, beta,i,j,c) & !$OMP SHARED(nucl_coord,ao_power,ao_prim_num, & - !$OMP ao_overlap_x,ao_overlap_y,ao_overlap_z,ao_overlap_matrix,ao_num,ao_coef_normalized_ordered_transp,ao_nucl, & + !$OMP ao_overlap_x,ao_overlap_y,ao_overlap_z,ao_overlap,ao_num,ao_coef_normalized_ordered_transp,ao_nucl, & !$OMP ao_expo_ordered_transp,dim1) do j=1,ao_num A_center(1) = nucl_coord( ao_nucl(j), 1 ) @@ -31,10 +40,6 @@ power_A(2) = ao_power( j, 2 ) power_A(3) = ao_power( j, 3 ) do i= 1,ao_num - ao_overlap_matrix(i,j)= 0.d0 - ao_overlap_x(i,j)= 0.d0 - ao_overlap_y(i,j)= 0.d0 - ao_overlap_z(i,j)= 0.d0 B_center(1) = nucl_coord( ao_nucl(i), 1 ) B_center(2) = nucl_coord( ao_nucl(i), 2 ) B_center(3) = nucl_coord( ao_nucl(i), 3 ) @@ -47,7 +52,7 @@ beta = ao_expo_ordered_transp(l,i) call overlap_gaussian_xyz(A_center,B_center,alpha,beta,power_A,power_B,overlap_x,overlap_y,overlap_z,overlap,dim1) c = ao_coef_normalized_ordered_transp(n,j) * ao_coef_normalized_ordered_transp(l,i) - ao_overlap_matrix(i,j) += c * overlap + ao_overlap(i,j) += c * overlap ao_overlap_x(i,j) += c * overlap_x ao_overlap_y(i,j) += c * overlap_y ao_overlap_z(i,j) += c * overlap_z @@ -56,6 +61,11 @@ enddo enddo !$OMP END PARALLEL DO + endif + if (write_ao_one_integrals) then + call ezfio_set_ao_one_e_integrals_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) + print *, 'AO overlap integrals written to disk' + endif END_PROVIDER @@ -119,7 +129,7 @@ BEGIN_PROVIDER [ double precision, S_inv,(ao_num,ao_num) ] BEGIN_DOC ! S^-1 END_DOC - call get_pseudo_inverse(ao_overlap_matrix,size(ao_overlap_matrix,1),ao_num,ao_num,S_inv,size(S_inv,1)) + call get_pseudo_inverse(ao_overlap,size(ao_overlap,1),ao_num,ao_num,S_inv,size(S_inv,1)) END_PROVIDER BEGIN_PROVIDER [ double precision, S_half_inv, (AO_num,AO_num) ] @@ -136,7 +146,7 @@ BEGIN_PROVIDER [ double precision, S_half_inv, (AO_num,AO_num) ] integer :: info, i, j, k double precision, parameter :: threshold_overlap_AO_eigenvalues = 1.d-6 - LDA = size(AO_overlap_matrix,1) + LDA = size(AO_overlap,1) LDC = size(S_half_inv,1) allocate( & @@ -145,7 +155,7 @@ BEGIN_PROVIDER [ double precision, S_half_inv, (AO_num,AO_num) ] D(AO_num)) call svd( & - AO_overlap_matrix,LDA, & + AO_overlap,LDA, & U,LDC, & D, & Vt,LDA, & @@ -194,7 +204,7 @@ BEGIN_PROVIDER [ double precision, S_half, (ao_num,ao_num) ] allocate(U(ao_num,ao_num),Vt(ao_num,ao_num),D(ao_num)) - call svd(ao_overlap_matrix,size(ao_overlap_matrix,1),U,size(U,1),D,Vt,size(Vt,1),ao_num,ao_num) + call svd(ao_overlap,size(ao_overlap,1),U,size(U,1),D,Vt,size(Vt,1),ao_num,ao_num) do i=1,ao_num D(i) = dsqrt(D(i)) diff --git a/src/Integrals_Monoelec/kin_ao_ints.irp.f b/src/AO_one_e_integrals/kin_ao_ints.irp.f similarity index 97% rename from src/Integrals_Monoelec/kin_ao_ints.irp.f rename to src/AO_one_e_integrals/kin_ao_ints.irp.f index de980e37..019531be 100644 --- a/src/Integrals_Monoelec/kin_ao_ints.irp.f +++ b/src/AO_one_e_integrals/kin_ao_ints.irp.f @@ -128,7 +128,7 @@ BEGIN_PROVIDER [double precision, ao_kinetic_integral, (ao_num,ao_num)] integer :: i,j,k,l if (read_ao_one_integrals) then - call ezfio_get_ao_basis_integral_kinetic(ao_kinetic_integral) + call ezfio_get_ao_one_e_integrals_integral_kinetic(ao_kinetic_integral) print *, 'AO kinetic integrals read from disk' else !$OMP PARALLEL DO DEFAULT(NONE) & @@ -142,7 +142,7 @@ BEGIN_PROVIDER [double precision, ao_kinetic_integral, (ao_num,ao_num)] !$OMP END PARALLEL DO endif if (write_ao_one_integrals) then - call ezfio_set_ao_basis_integral_kinetic(ao_kinetic_integral) + call ezfio_set_ao_one_e_integrals_integral_kinetic(ao_kinetic_integral) print *, 'AO kinetic integrals written to disk' endif END_PROVIDER diff --git a/src/Integrals_Monoelec/pot_ao_ints.irp.f b/src/AO_one_e_integrals/pot_ao_ints.irp.f similarity index 99% rename from src/Integrals_Monoelec/pot_ao_ints.irp.f rename to src/AO_one_e_integrals/pot_ao_ints.irp.f index 2afd7ebf..27f27096 100644 --- a/src/Integrals_Monoelec/pot_ao_ints.irp.f +++ b/src/AO_one_e_integrals/pot_ao_ints.irp.f @@ -11,7 +11,7 @@ BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num,ao_num)] double precision :: overlap_x,overlap_y,overlap_z,overlap,dx,NAI_pol_mult if (read_ao_one_integrals) then - call ezfio_get_ao_basis_integral_nuclear(ao_nucl_elec_integral) + call ezfio_get_ao_one_e_integrals_integral_nuclear(ao_nucl_elec_integral) print *, 'AO N-e integrals read from disk' else @@ -73,7 +73,7 @@ BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num,ao_num)] !$OMP END PARALLEL endif if (write_ao_one_integrals) then - call ezfio_set_ao_basis_integral_nuclear(ao_nucl_elec_integral) + call ezfio_set_ao_one_e_integrals_integral_nuclear(ao_nucl_elec_integral) print *, 'AO N-e integrals written to disk' endif diff --git a/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f b/src/AO_one_e_integrals/pot_ao_pseudo_ints.irp.f similarity index 98% rename from src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f rename to src/AO_one_e_integrals/pot_ao_pseudo_ints.irp.f index 252a3e4f..97b3353a 100644 --- a/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f +++ b/src/AO_one_e_integrals/pot_ao_pseudo_ints.irp.f @@ -5,7 +5,7 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral, (ao_num,ao_num)] END_DOC if (read_ao_one_integrals) then - call ezfio_get_ao_basis_integral_pseudo(ao_pseudo_integral) + call ezfio_get_ao_one_e_integrals_integral_pseudo(ao_pseudo_integral) print *, 'AO pseudopotential integrals read from disk' else @@ -21,7 +21,7 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral, (ao_num,ao_num)] endif if (write_ao_one_integrals) then - call ezfio_set_ao_basis_integral_pseudo(ao_pseudo_integral) + call ezfio_set_ao_one_e_integrals_integral_pseudo(ao_pseudo_integral) print *, 'AO pseudopotential integrals written to disk' endif diff --git a/src/Integrals_Monoelec/pseudopot.f90 b/src/AO_one_e_integrals/pseudopot.f90 similarity index 100% rename from src/Integrals_Monoelec/pseudopot.f90 rename to src/AO_one_e_integrals/pseudopot.f90 diff --git a/src/AO_one_e_integrals/read_write.irp.f b/src/AO_one_e_integrals/read_write.irp.f new file mode 100644 index 00000000..e0fb75ce --- /dev/null +++ b/src/AO_one_e_integrals/read_write.irp.f @@ -0,0 +1,28 @@ + BEGIN_PROVIDER [ logical, read_ao_one_integrals ] +&BEGIN_PROVIDER [ logical, write_ao_one_integrals ] + + BEGIN_DOC + ! One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals + END_DOC + implicit none + + if (disk_access_ao_one_integrals.EQ.'Read') then + read_ao_one_integrals = .True. + write_ao_one_integrals = .False. + + else if (disk_access_ao_one_integrals.EQ.'Write') then + read_ao_one_integrals = .False. + write_ao_one_integrals = .True. + + else if (disk_access_ao_one_integrals.EQ.'None') then + read_ao_one_integrals = .False. + write_ao_one_integrals = .False. + + else + print *, 'bielec_integrals/disk_access_ao_integrals has a wrong type' + stop 1 + + endif + +END_PROVIDER + diff --git a/src/Integrals_Monoelec/spread_dipole_ao.irp.f b/src/AO_one_e_integrals/spread_dipole_ao.irp.f similarity index 100% rename from src/Integrals_Monoelec/spread_dipole_ao.irp.f rename to src/AO_one_e_integrals/spread_dipole_ao.irp.f diff --git a/src/Bitmask/bitmasks.irp.f b/src/Bitmask/bitmasks.irp.f index d5472a25..d121ad25 100644 --- a/src/Bitmask/bitmasks.irp.f +++ b/src/Bitmask/bitmasks.irp.f @@ -46,7 +46,7 @@ BEGIN_PROVIDER [ integer(bit_kind), full_ijkl_bitmask_4, (N_int,4) ] enddo END_PROVIDER - BEGIN_PROVIDER [ integer(bit_kind), core_inact_act_bitmask_4, (N_int,4) ] +BEGIN_PROVIDER [ integer(bit_kind), core_inact_act_bitmask_4, (N_int,4) ] implicit none integer :: i do i=1,N_int diff --git a/src/Determinants/NEEDED_CHILDREN_MODULES b/src/Determinants/NEEDED_CHILDREN_MODULES index 8711010f..49c21b08 100644 --- a/src/Determinants/NEEDED_CHILDREN_MODULES +++ b/src/Determinants/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Integrals_Monoelec Integrals_Bielec +MO_Basis MO_one_e_integrals Integrals_Bielec diff --git a/src/Integrals_Bielec/NEEDED_CHILDREN_MODULES b/src/Integrals_Bielec/NEEDED_CHILDREN_MODULES index 245e3014..9d249718 100644 --- a/src/Integrals_Bielec/NEEDED_CHILDREN_MODULES +++ b/src/Integrals_Bielec/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Pseudo Bitmask ZMQ FourIdx +AO_one_e_integrals MO_one_e_integrals Pseudo Bitmask ZMQ FourIdx AO_Basis MO_Basis diff --git a/src/Integrals_Monoelec/EZFIO.cfg b/src/Integrals_Monoelec/EZFIO.cfg deleted file mode 100644 index 04e49ec1..00000000 --- a/src/Integrals_Monoelec/EZFIO.cfg +++ /dev/null @@ -1,12 +0,0 @@ -[disk_access_mo_one_integrals] -type: Disk_access -doc: Read/Write MO one-electron integrals from/to disk [ Write | Read | None ] -interface: ezfio,provider,ocaml -default: None - -[disk_access_ao_one_integrals] -type: Disk_access -doc: Read/Write AO one-electron integrals from/to disk [ Write | Read | None ] -interface: ezfio,provider,ocaml -default: None - diff --git a/src/Integrals_Monoelec/NEEDED_CHILDREN_MODULES b/src/Integrals_Monoelec/NEEDED_CHILDREN_MODULES deleted file mode 100644 index 1702863b..00000000 --- a/src/Integrals_Monoelec/NEEDED_CHILDREN_MODULES +++ /dev/null @@ -1 +0,0 @@ -MO_Basis Pseudo diff --git a/src/Integrals_Monoelec/README.rst b/src/Integrals_Monoelec/README.rst deleted file mode 100644 index 9a2ef0c5..00000000 --- a/src/Integrals_Monoelec/README.rst +++ /dev/null @@ -1,332 +0,0 @@ -Needed Modules -============== - -.. Do not edit this section It was auto-generated -.. by the `update_README.py` script. - -.. image:: tree_dependency.png - -* `MO_Basis `_ -* `Pseudo `_ - -Needed Modules -============== -.. Do not edit this section It was auto-generated -.. by the `update_README.py` script. - - -.. image:: tree_dependency.png - -* `MO_Basis `_ -* `Pseudo `_ - -Documentation -============= -.. Do not edit this section It was auto-generated -.. by the `update_README.py` script. - - -`ao_deriv2_x `_ - second derivatives matrix elements in the ao basis - .. math:: - .br - {\tt ao_deriv2_x} = \langle \chi_i(x,y,z) \frac{\partial^2}{\partial x^2} |\chi_j (x,y,z) \rangle - - -`ao_deriv2_y `_ - second derivatives matrix elements in the ao basis - .. math:: - .br - {\tt ao_deriv2_x} = \langle \chi_i(x,y,z) \frac{\partial^2}{\partial x^2} |\chi_j (x,y,z) \rangle - - -`ao_deriv2_z `_ - second derivatives matrix elements in the ao basis - .. math:: - .br - {\tt ao_deriv2_x} = \langle \chi_i(x,y,z) \frac{\partial^2}{\partial x^2} |\chi_j (x,y,z) \rangle - - -`ao_deriv_1_x `_ - array of the integrals of AO_i * d/dx AO_j - array of the integrals of AO_i * d/dy AO_j - array of the integrals of AO_i * d/dz AO_j - - -`ao_deriv_1_y `_ - array of the integrals of AO_i * d/dx AO_j - array of the integrals of AO_i * d/dy AO_j - array of the integrals of AO_i * d/dz AO_j - - -`ao_deriv_1_z `_ - array of the integrals of AO_i * d/dx AO_j - array of the integrals of AO_i * d/dy AO_j - array of the integrals of AO_i * d/dz AO_j - - -`ao_dipole_x `_ - array of the integrals of AO_i * x AO_j - array of the integrals of AO_i * y AO_j - array of the integrals of AO_i * z AO_j - - -`ao_dipole_y `_ - array of the integrals of AO_i * x AO_j - array of the integrals of AO_i * y AO_j - array of the integrals of AO_i * z AO_j - - -`ao_dipole_z `_ - array of the integrals of AO_i * x AO_j - array of the integrals of AO_i * y AO_j - array of the integrals of AO_i * z AO_j - - -`ao_kinetic_integral `_ - array of the priminitve basis kinetic integrals - \langle \chi_i |\hat{T}| \chi_j \rangle - - -`ao_mono_elec_integral `_ - array of the mono electronic hamiltonian on the AOs basis - : sum of the kinetic and nuclear electronic potential - - -`ao_mono_elec_integral_diag `_ - array of the mono electronic hamiltonian on the AOs basis - : sum of the kinetic and nuclear electronic potential - - -`ao_nucl_elec_integral `_ - interaction nuclear electron - - -`ao_nucl_elec_integral_per_atom `_ - ao_nucl_elec_integral_per_atom(i,j,k) = - - where Rk is the geometry of the kth atom - - -`ao_pseudo_integral `_ - Pseudo-potential integrals - - -`ao_pseudo_integral_local `_ - Local pseudo-potential - - -`ao_pseudo_integral_non_local `_ - Local pseudo-potential - - -`ao_spread_x `_ - array of the integrals of AO_i * x^2 AO_j - array of the integrals of AO_i * y^2 AO_j - array of the integrals of AO_i * z^2 AO_j - - -`ao_spread_y `_ - array of the integrals of AO_i * x^2 AO_j - array of the integrals of AO_i * y^2 AO_j - array of the integrals of AO_i * z^2 AO_j - - -`ao_spread_z `_ - array of the integrals of AO_i * x^2 AO_j - array of the integrals of AO_i * y^2 AO_j - array of the integrals of AO_i * z^2 AO_j - - -`check_ortho `_ - Undocumented - - -`disk_access_ao_one_integrals `_ - Read/Write AO one-electron integrals from/to disk [ Write | Read | None ] - - -`disk_access_mo_one_integrals `_ - Read/Write MO one-electron integrals from/to disk [ Write | Read | None ] - - -`do_print `_ - Undocumented - - -`give_polynom_mult_center_mono_elec `_ - Undocumented - - -`i_x1_pol_mult_mono_elec `_ - Undocumented - - -`i_x2_pol_mult_mono_elec `_ - Undocumented - - -`int_gaus_pol `_ - Undocumented - - -`mo_dipole_x `_ - array of the integrals of MO_i * x MO_j - array of the integrals of MO_i * y MO_j - array of the integrals of MO_i * z MO_j - - -`mo_dipole_y `_ - array of the integrals of MO_i * x MO_j - array of the integrals of MO_i * y MO_j - array of the integrals of MO_i * z MO_j - - -`mo_dipole_z `_ - array of the integrals of MO_i * x MO_j - array of the integrals of MO_i * y MO_j - array of the integrals of MO_i * z MO_j - - -`mo_kinetic_integral `_ - Kinetic energy integrals in the MO basis - - -`mo_mono_elec_integral `_ - array of the mono electronic hamiltonian on the MOs basis : - sum of the kinetic and nuclear electronic potential (and pseudo potential if needed) - - -`mo_nucl_elec_integral `_ - interaction nuclear electron on the MO basis - - -`mo_nucl_elec_integral_per_atom `_ - mo_nucl_elec_integral_per_atom(i,j,k) = - - where Rk is the geometry of the kth atom - - -`mo_pseudo_integral `_ - interaction nuclear electron on the MO basis - - -`mo_spread_x `_ - array of the integrals of MO_i * x^2 MO_j - array of the integrals of MO_i * y^2 MO_j - array of the integrals of MO_i * z^2 MO_j - - -`mo_spread_y `_ - array of the integrals of MO_i * x^2 MO_j - array of the integrals of MO_i * y^2 MO_j - array of the integrals of MO_i * z^2 MO_j - - -`mo_spread_z `_ - array of the integrals of MO_i * x^2 MO_j - array of the integrals of MO_i * y^2 MO_j - array of the integrals of MO_i * z^2 MO_j - - -`nai_pol_mult `_ - Undocumented - - -`orthonormalize_mos `_ - Undocumented - - -`overlap_bourrin_deriv_x `_ - Undocumented - - -`overlap_bourrin_dipole `_ - Undocumented - - -`overlap_bourrin_spread `_ - Undocumented - - -`overlap_bourrin_x `_ - Undocumented - - -`overlap_bourrin_x_abs `_ - Undocumented - - -`power `_ - Undocumented - - -`pseudo_dz_k_transp `_ - Transposed arrays for pseudopotentials - - -`pseudo_dz_kl_transp `_ - Transposed arrays for pseudopotentials - - -`pseudo_n_k_transp `_ - Transposed arrays for pseudopotentials - - -`pseudo_n_kl_transp `_ - Transposed arrays for pseudopotentials - - -`pseudo_v_k_transp `_ - Transposed arrays for pseudopotentials - - -`pseudo_v_kl_transp `_ - Transposed arrays for pseudopotentials - - -`read_ao_one_integrals `_ - One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals - - -`read_mo_one_integrals `_ - One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals - - -`read_one_e_integrals `_ - Read the 1-electron integrals into in A(m,n) from file 'filename' - - -`save_ortho_mos `_ - Undocumented - - -`v_e_n `_ - Undocumented - - -`v_phi `_ - Undocumented - - -`v_r `_ - Undocumented - - -`v_theta `_ - Undocumented - - -`wallis `_ - Undocumented - - -`write_ao_one_integrals `_ - One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals - - -`write_mo_one_integrals `_ - One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals - - -`write_one_e_integrals `_ - Write the 1-electron integrals stored in A(m,n) into file 'filename' - diff --git a/src/Integrals_Monoelec/read_write.irp.f b/src/Integrals_Monoelec/read_write.irp.f deleted file mode 100644 index 697bf356..00000000 --- a/src/Integrals_Monoelec/read_write.irp.f +++ /dev/null @@ -1,84 +0,0 @@ - BEGIN_PROVIDER [ logical, read_ao_one_integrals ] -&BEGIN_PROVIDER [ logical, read_mo_one_integrals ] -&BEGIN_PROVIDER [ logical, write_ao_one_integrals ] -&BEGIN_PROVIDER [ logical, write_mo_one_integrals ] - - BEGIN_DOC - ! One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals - END_DOC - implicit none - - if (disk_access_ao_one_integrals.EQ.'Read') then - read_ao_one_integrals = .True. - write_ao_one_integrals = .False. - - else if (disk_access_ao_one_integrals.EQ.'Write') then - read_ao_one_integrals = .False. - write_ao_one_integrals = .True. - - else if (disk_access_ao_one_integrals.EQ.'None') then - read_ao_one_integrals = .False. - write_ao_one_integrals = .False. - - else - print *, 'bielec_integrals/disk_access_ao_integrals has a wrong type' - stop 1 - - endif - - if (disk_access_mo_one_integrals.EQ.'Read') then - read_mo_one_integrals = .True. - write_mo_one_integrals = .False. - - else if (disk_access_mo_one_integrals.EQ.'Write') then - read_mo_one_integrals = .False. - write_mo_one_integrals = .True. - - else if (disk_access_mo_one_integrals.EQ.'None') then - read_mo_one_integrals = .False. - write_mo_one_integrals = .False. - - else - print *, 'bielec_integrals/disk_access_mo_integrals has a wrong type' - stop 1 - - endif - -END_PROVIDER - -subroutine write_one_e_integrals(filename, A, m, n) - implicit none - BEGIN_DOC -! Write the 1-electron integrals stored in A(m,n) into file 'filename' - END_DOC - character(len=*), intent(in) :: filename - integer, intent(in) :: m,n - double precision, intent(in) :: A(m,n) - - integer :: iunit - integer, external :: getUnitAndOpen - character*(256) :: f - - iunit = getUnitAndOpen( trim(ezfio_work_dir)//trim(filename), 'W' ) - write(iunit) A - close(iunit) -end - -subroutine read_one_e_integrals(filename, A, m, n) - implicit none - BEGIN_DOC -! Read the 1-electron integrals into in A(m,n) from file 'filename' - END_DOC - character(len=*), intent(in) :: filename - integer, intent(in) :: m,n - double precision, intent(out) :: A(m,n) - - integer :: iunit - integer, external :: getUnitAndOpen - character*(256) :: f - - iunit = getUnitAndOpen( trim(ezfio_work_dir)//trim(filename), 'R' ) - read(iunit) A - close(iunit) -end - diff --git a/src/Integrals_Monoelec/tree_dependency.png b/src/Integrals_Monoelec/tree_dependency.png deleted file mode 100644 index f56c1e77e17229e3e44275dcee42e48a74379680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36832 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