2021-01-04 23:15:27 +01:00
(* [[file:~/QCaml/ao/basis.org:: * Types][Types:2]] *)
2020-10-02 23:35:56 +02:00
type t =
2020-10-19 18:33:02 +02:00
{ ao_basis : Basis_poly . t ;
2020-10-02 23:35:56 +02:00
cartesian : bool
}
2020-10-07 17:54:15 +02:00
2020-10-18 01:58:22 +02:00
type ao = Ao_dim . t
2021-01-04 09:19:35 +01:00
open Linear_algebra
open Common
2021-01-04 23:15:27 +01:00
(* Types:2 ends here *)
2021-01-04 09:19:35 +01:00
2021-01-04 23:15:27 +01:00
(* | ~of_nuclei_and_basis_filename~ | Creates the data structure for the atomic orbitals basis from a molecule ~Nuclei.t~ and the name of the basis-set file |
*
* Defaults :
* - ~ kind ~ : ~ ` Gaussian ~
* - ~ operators ~ : ~ [] ~
* - ~ cartesian ~ : ~ false ~
*
* # + begin_example
* let b = Ao . Basis . of_nuclei_and_basis_filename ~ nuclei filename ;;
* val b : Ao . Basis . t = Gaussian Basis , spherical , 15 AOs
* # + end_example * )
2021-01-04 09:19:35 +01:00
(* [[file:~/QCaml/ao/basis.org:: * Conversions][Conversions:2]] *)
2020-10-07 17:54:15 +02:00
let of_nuclei_and_basis_filename ? ( kind = ` Gaussian ) ? operators ? ( cartesian = false )
~ nuclei filename =
match kind with
| ` Gaussian ->
let basis =
2020-10-10 10:59:09 +02:00
Gaussian . Basis . of_nuclei_and_basis_filename ~ nuclei filename
2020-10-07 17:54:15 +02:00
in
let ao_basis =
2020-10-19 18:33:02 +02:00
Basis_poly . Gaussian ( Basis_gaussian . make ~ basis ? operators ~ cartesian nuclei )
2020-10-07 17:54:15 +02:00
in
{ ao_basis ; cartesian }
| _ -> failwith " of_nuclei_and_basis_filename needs to be called with `Gaussian "
2021-01-04 09:19:35 +01:00
(* Conversions:2 ends here *)
(* | ~size~ | Number of atomic orbitals in the AO basis set |
* | ~ ao_basis ~ | One - electron basis set |
* | ~ overlap ~ | Overlap matrix |
* | ~ multipole ~ | Multipole matrices |
* | ~ ortho ~ | Orthonormalization matrix of the overlap |
* | ~ eN_ints ~ | Electron - nucleus potential integrals |
* | ~ kin_ints ~ | Kinetic energy integrals |
* | ~ ee_ints ~ | Electron - electron potential integrals |
* | ~ ee_lr_ints ~ | Electron - electron long - range potential integrals |
* | ~ f12_ints ~ | Electron - electron potential integrals |
* | ~ f12_over_r12_ints ~ | Electron - electron potential integrals |
* | ~ cartesian ~ | If true , use cartesian Gaussians ( 6d , 10f , .. . ) |
* | ~ values ~ | Values of the AOs evaluated at a given point | * )
2020-10-07 17:54:15 +02:00
2021-01-04 09:19:35 +01:00
(* [[file:~/QCaml/ao/basis.org:: * Access][Access:2]] *)
2021-01-01 16:39:33 +01:00
let not_implemented () =
Util . not_implemented " Only Gaussian is implemented "
2020-10-07 17:54:15 +02:00
let ao_basis t = t . ao_basis
let size t =
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . size b
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
let overlap t =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . overlap b
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
| > Matrix . relabel
let multipole t =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b ->
let m = Basis_gaussian . multipole b in
fun s ->
Gaussian_integrals . Multipole . matrix m s
| > Matrix . relabel
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
let ortho t =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . ortho b
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
| > Matrix . relabel
let eN_ints t =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . eN_ints b
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
| > Matrix . relabel
let kin_ints t =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . kin_ints b
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
| > Matrix . relabel
let ee_ints t =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . ee_ints b
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
| > Four_idx_storage . relabel
let ee_lr_ints t =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . ee_lr_ints b
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
| > Four_idx_storage . relabel
let f12_ints t =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . f12_ints b
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
| > Four_idx_storage . relabel
let f12_over_r12_ints t =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . f12_over_r12_ints b
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
| > Four_idx_storage . relabel
let cartesian t = t . cartesian
let values t point =
begin
match t . ao_basis with
2020-10-19 18:33:02 +02:00
| Basis_poly . Gaussian b -> Basis_gaussian . values b point
2020-10-07 17:54:15 +02:00
| _ -> not_implemented ()
end
| > Vector . relabel
2021-01-04 09:19:35 +01:00
(* Access:2 ends here *)
(* [[file:~/QCaml/ao/basis.org:: * Printers][Printers:2]] *)
let pp ppf t =
2021-01-04 23:15:27 +01:00
begin
match t . ao_basis with
| Basis_poly . Gaussian b -> Basis_gaussian . pp ppf b
| _ -> not_implemented ()
end
2021-01-04 09:19:35 +01:00
(* Printers:2 ends here *)