2018-03-15 15:25:49 +01:00
|
|
|
(** Data structure describing a pair of primitive shells.
|
|
|
|
|
|
|
|
A primitive shell pair is the cartesian product between two sets of functions, each
|
2018-03-21 15:01:39 +01:00
|
|
|
set containing all the functions of a primitive shell. These are one-electron functions.
|
2018-03-15 15:25:49 +01:00
|
|
|
|
|
|
|
{% \\[
|
|
|
|
\left\\{ p_{k_x,k_y,k_z}(\mathbf{r}) \right\\} =
|
|
|
|
\left\\{ g_{n_x,n_y,n_z}(\mathbf{r}) \right\\} \times
|
|
|
|
\left\\{ g_{m_x,m_y,m_z}'(\mathbf{r}) \right\\}
|
|
|
|
\\] %}
|
|
|
|
|
|
|
|
where
|
|
|
|
|
|
|
|
{%
|
|
|
|
\begin{align*}
|
|
|
|
g_{n_x,n_y,n_z}(\mathbf{r}) & =
|
|
|
|
(x-X_A)^{n_x} (y-Y_A)^{n_y} (z-Z_A)^{n_z}
|
|
|
|
\exp \left( -\alpha |\mathbf{r}-\mathbf{A}|^2 \right) \\
|
|
|
|
g_{m_x,m_y,m_z}'(\mathbf{r}) & =
|
|
|
|
(x-X_B)^{m_x} (y-Y_B)^{m_y} (z-Z_B)^{m_z}
|
|
|
|
\exp \left( -\beta |\mathbf{r}-\mathbf{B}|^2 \right)
|
|
|
|
\end{align*}
|
|
|
|
%}
|
|
|
|
|
|
|
|
|
2018-03-15 19:11:59 +01:00
|
|
|
{!a_minus_b}, {!a_minus_b_sq} and {!norm_coef_scale} depend only on the
|
2018-03-21 15:01:39 +01:00
|
|
|
centering of the two shells, and {!ang_mom} only depends on the angular
|
2018-03-15 19:11:59 +01:00
|
|
|
momenta of the two shells. Hence, these quantities need to be computed only
|
|
|
|
once when a {!ContractedShellPair.t} is built. Hence, there is the
|
|
|
|
{!create_make_of} function which creates a [make] function which is suitable
|
|
|
|
for a {!ContractedShellPair.t}.
|
2018-03-15 15:25:49 +01:00
|
|
|
|
|
|
|
References:
|
|
|
|
|
|
|
|
[1] {{:http://dx.doi.org/10.1002/qua.560400604} P.M. Gill, B.G. Johnson, and J.A. Pople, International Journal of Quantum Chemistry 40, 745 (1991)}.
|
|
|
|
*)
|
|
|
|
|
2018-03-15 19:11:59 +01:00
|
|
|
type t
|
2018-03-15 15:25:49 +01:00
|
|
|
|
|
|
|
|
|
|
|
val make : PrimitiveShell.t -> PrimitiveShell.t -> t
|
|
|
|
(** Creates a primitive shell pair using two primitive shells. *)
|
|
|
|
|
|
|
|
val create_make_of : PrimitiveShell.t -> PrimitiveShell.t ->
|
|
|
|
(PrimitiveShell.t -> PrimitiveShell.t -> float -> t option)
|
|
|
|
(** Creates a make function [PrimitiveShell.t -> PrimitiveShell.t -> float -> t] in which
|
|
|
|
all the quantities common to the shell and independent of the exponent
|
|
|
|
are pre-computed.
|
|
|
|
|
|
|
|
The result is None if the normalization coefficient of the resulting
|
2018-03-22 00:29:14 +01:00
|
|
|
function is below the cutoff given as a last argument.
|
2018-03-15 15:25:49 +01:00
|
|
|
*)
|
|
|
|
|
2018-03-21 15:01:39 +01:00
|
|
|
val ang_mom : t -> AngularMomentum.t
|
2018-03-15 19:11:59 +01:00
|
|
|
(** Total angular momentum of the shell pair: sum of the angular momenta of
|
|
|
|
the shells. *)
|
2018-03-15 15:25:49 +01:00
|
|
|
|
2018-03-15 19:11:59 +01:00
|
|
|
val center : t -> Coordinate.t
|
|
|
|
(** Coordinates of the center {% $\mathbf{P}$ %}. *)
|
2018-03-15 15:25:49 +01:00
|
|
|
|
|
|
|
val monocentric : t -> bool
|
2018-03-15 19:11:59 +01:00
|
|
|
(** True if both shells of the pair have the same center. *)
|
2018-03-15 15:25:49 +01:00
|
|
|
|
2018-03-15 19:11:59 +01:00
|
|
|
|
|
|
|
val shell_a : t -> PrimitiveShell.t
|
|
|
|
(** Returns the first primitive shell that was used to build the shell pair. *)
|
|
|
|
|
|
|
|
val shell_b : t -> PrimitiveShell.t
|
|
|
|
(** Returns the second primitive shell that was used to build the shell pair. *)
|
|
|
|
|
2018-03-20 15:16:24 +01:00
|
|
|
val normalization : t -> float
|
2018-03-15 19:11:59 +01:00
|
|
|
(** Normalization coefficient of the shell pair. *)
|
2018-03-15 15:25:49 +01:00
|
|
|
|
2018-03-20 15:16:24 +01:00
|
|
|
val norm_scales : t -> float array
|
2018-03-15 19:11:59 +01:00
|
|
|
(** Normalization factor, characteristic of the powers of x, y and z of
|
|
|
|
both shells of the pair. It is the outer product of the 2
|
|
|
|
{!PrimitiveShell.norm_coef_scale} arrays of the shells consituting the
|
|
|
|
pair.
|
|
|
|
*)
|
2018-03-15 15:25:49 +01:00
|
|
|
|
2018-03-20 15:16:24 +01:00
|
|
|
val exponent : t -> float
|
2018-03-15 19:11:59 +01:00
|
|
|
(** Exponent of the Gaussian output of the Gaussian product : {% \\[ \alpha + \beta \\] %}*)
|
2018-03-15 15:25:49 +01:00
|
|
|
|
2018-03-20 15:16:24 +01:00
|
|
|
val exponent_inv : t -> float
|
2018-03-15 19:11:59 +01:00
|
|
|
(** Inverse of the exponent : {% \\[ \sigma_P = \frac{1}{\alpha + \beta} \\] %}*)
|
2018-03-15 15:25:49 +01:00
|
|
|
|
|
|
|
val a_minus_b : t -> Coordinate.t
|
|
|
|
(** {% $\mathbf{A}-\mathbf{B}$ %} *)
|
|
|
|
|
|
|
|
val a_minus_b_sq : t -> float
|
|
|
|
(** {% $|\mathbf{A}-\mathbf{B}|^2$ %} *)
|
|
|
|
|
|
|
|
val center_minus_a : t -> Coordinate.t
|
|
|
|
(** {% $\mathbf{P}-\mathbf{A}$ %} *)
|
|
|
|
|
|
|
|
|
2018-03-15 19:11:59 +01:00
|
|
|
val equivalent : t -> t -> bool
|
|
|
|
(** True if two primitive shell pairs are equivalent. *)
|
2018-03-15 16:03:43 +01:00
|
|
|
|
2018-03-15 19:11:59 +01:00
|
|
|
val hash : t -> int
|
|
|
|
(** Returns an integer characteristic of the shell pair. *)
|
|
|
|
|
|
|
|
val cmp : t -> t -> int
|
|
|
|
(** Arbitray comparison function for sorting. *)
|
2018-03-15 16:03:43 +01:00
|
|
|
|
2018-03-21 15:01:39 +01:00
|
|
|
val zkey_array : t -> Zkey.t array
|
|
|
|
(** Returns the array of Zkeys associated with the shell pair. *)
|
|
|
|
|