mirror of
https://gitlab.com/scemama/QCaml.git
synced 2024-09-12 14:38:31 +02:00
Electrons org-mode
This commit is contained in:
parent
65d04a76f2
commit
79f1b581f9
160
particles/electrons.org
Normal file
160
particles/electrons.org
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
#+begin_src elisp tangle: no :results none :exports none
|
||||||
|
(setq pwd (file-name-directory buffer-file-name))
|
||||||
|
(setq name (file-name-nondirectory (substring buffer-file-name 0 -4)))
|
||||||
|
(setq lib (concat pwd "lib/"))
|
||||||
|
(setq testdir (concat pwd "test/"))
|
||||||
|
(setq mli (concat lib name ".mli"))
|
||||||
|
(setq ml (concat lib name ".ml"))
|
||||||
|
(setq test-ml (concat testdir name ".ml"))
|
||||||
|
(org-babel-tangle)
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
* Electrons
|
||||||
|
:PROPERTIES:
|
||||||
|
:header-args: :noweb yes :comments both
|
||||||
|
:END:
|
||||||
|
|
||||||
|
Data structure which contains the number of \alpha and \beta electrons.
|
||||||
|
|
||||||
|
** Type
|
||||||
|
|
||||||
|
#+NAME: types
|
||||||
|
#+begin_src ocaml :tangle (eval mli)
|
||||||
|
type t
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval ml) :exports none
|
||||||
|
type t = {
|
||||||
|
n_alfa : int ;
|
||||||
|
n_beta : int ;
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval test-ml) :exports none
|
||||||
|
open Common
|
||||||
|
open Particles
|
||||||
|
open Alcotest
|
||||||
|
|
||||||
|
let test_all () =
|
||||||
|
let nuclei =
|
||||||
|
"3
|
||||||
|
Water
|
||||||
|
O 0. 0. 0.
|
||||||
|
H -0.756950272703377558 0. -0.585882234512562827
|
||||||
|
H 0.756950272703377558 0. -0.585882234512562827
|
||||||
|
"
|
||||||
|
|> Nuclei.of_xyz_string
|
||||||
|
in
|
||||||
|
let e = Electrons.of_atoms nuclei in
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Creation
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval mli)
|
||||||
|
open Common
|
||||||
|
|
||||||
|
val make : int -> int -> t
|
||||||
|
|
||||||
|
val of_atoms : ?multiplicity:int -> ?charge:int -> Nuclei.t -> t
|
||||||
|
(* @param multiplicity default is 1
|
||||||
|
@param charge default is 0
|
||||||
|
@raise Invalid_argument if the spin multiplicity is not compatible with
|
||||||
|
the molecule and the total charge.
|
||||||
|
*)
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
| ~make~ | ~make n_alfa n_beta~ |
|
||||||
|
| ~of_atoms~ | Creates the data relative to electrons for a molecular system described by ~Nuclei.t~ for a given total charge and spin multiplicity. |
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval ml) :exports none
|
||||||
|
open Common
|
||||||
|
|
||||||
|
let make n_alfa n_beta =
|
||||||
|
{ n_alfa ; n_beta }
|
||||||
|
|
||||||
|
|
||||||
|
let of_atoms ?multiplicity:(multiplicity=1) ?charge:(charge=0) nuclei =
|
||||||
|
let positive_charges =
|
||||||
|
Array.fold_left (fun accu (e, _) -> accu + Charge.to_int (Element.to_charge e) )
|
||||||
|
0 nuclei
|
||||||
|
in
|
||||||
|
let negative_charges = charge - positive_charges in
|
||||||
|
let n_elec = - negative_charges in
|
||||||
|
let n_beta = ((n_elec - multiplicity)+1)/2 in
|
||||||
|
let n_alfa = n_elec - n_beta in
|
||||||
|
let result = { n_alfa ; n_beta } in
|
||||||
|
if multiplicity <> (n_alfa - n_beta)+1 then
|
||||||
|
invalid_arg (__FILE__^": make");
|
||||||
|
result
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval test-ml) :exports none
|
||||||
|
check int "of_atoms alfa" 5 (Electrons.n_alfa e);
|
||||||
|
check int "of_atoms beta" 5 (Electrons.n_beta e);
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Access
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval mli)
|
||||||
|
val charge : t -> Charge.t
|
||||||
|
val n_elec : t -> int
|
||||||
|
val n_alfa : t -> int
|
||||||
|
val n_beta : t -> int
|
||||||
|
val multiplicity : t -> int
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
| ~charge~ | Sum of the charges of the electrons |
|
||||||
|
| ~n_elec~ | Number of electrons |
|
||||||
|
| ~n_alfa~ | Number of alpha electrons |
|
||||||
|
| ~n_beta~ | Number of beta electrons |
|
||||||
|
| ~multiplicity~ | Spin multiplicity: $2S+1$ |
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval ml) :exports none
|
||||||
|
let charge e =
|
||||||
|
- (e.n_alfa + e.n_beta)
|
||||||
|
|> Charge.of_int
|
||||||
|
|
||||||
|
let n_alfa t = t.n_alfa
|
||||||
|
|
||||||
|
let n_beta t = t.n_beta
|
||||||
|
|
||||||
|
let n_elec t = t.n_alfa + t.n_beta
|
||||||
|
|
||||||
|
let multiplicity t = t.n_alfa - t.n_beta + 1
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval test-ml) :exports none
|
||||||
|
check int "charge " (-10) (Charge.to_int @@ Electrons.charge e);
|
||||||
|
check int "n_elec" 10 (Electrons.n_elec e);
|
||||||
|
check int "multiplicity" 1 (Electrons.multiplicity e);
|
||||||
|
check int "of_atoms alfa m3" 6 (Electrons.(of_atoms ~multiplicity:3 nuclei |> n_alfa));
|
||||||
|
check int "of_atoms beta m3" 4 (Electrons.(of_atoms ~multiplicity:3 nuclei |> n_beta));
|
||||||
|
check int "of_atoms n_elec m3" 10 (Electrons.(of_atoms ~multiplicity:3 nuclei |> n_elec));
|
||||||
|
check int "of_atoms alfa m2 c1" 5 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> n_alfa));
|
||||||
|
check int "of_atoms beta m2 c1" 4 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> n_beta));
|
||||||
|
check int "of_atoms beta m2 c1" 9 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> n_elec));
|
||||||
|
check int "of_atoms mult m2 c1" 2 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> multiplicity));
|
||||||
|
check bool "make" true (Electrons.make 6 4 = Electrons.(of_atoms ~multiplicity:3 nuclei));
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Printers
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval mli)
|
||||||
|
val pp : Format.formatter -> t -> unit
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval ml) :exports none
|
||||||
|
let pp ppf t =
|
||||||
|
Format.fprintf ppf "@[n_alfa=%d, n_beta=%d@]" t.n_alfa t.n_beta
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Tests
|
||||||
|
|
||||||
|
#+begin_src ocaml :tangle (eval test-ml) :exports none
|
||||||
|
()
|
||||||
|
|
||||||
|
let tests = [
|
||||||
|
"all", `Quick, test_all
|
||||||
|
]
|
||||||
|
#+end_src
|
@ -1,13 +1,19 @@
|
|||||||
(** Number of {% $\alpha$ %} and {% $\beta$ %} electrons *)
|
(* [[file:../electrons.org::*Type][Type:2]] *)
|
||||||
|
|
||||||
open Common
|
|
||||||
|
|
||||||
type t = {
|
type t = {
|
||||||
n_alfa : int ;
|
n_alfa : int ;
|
||||||
n_beta : int ;
|
n_beta : int ;
|
||||||
}
|
}
|
||||||
|
(* Type:2 ends here *)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(* | ~make~ | ~make n_alfa n_beta~ |
|
||||||
|
* | ~of_atoms~ | Creates the data relative to electrons for a molecular system described by ~Nuclei.t~ for a given total charge and spin multiplicity. | *)
|
||||||
|
|
||||||
|
|
||||||
|
(* [[file:../electrons.org::*Creation][Creation:2]] *)
|
||||||
|
open Common
|
||||||
|
|
||||||
let make n_alfa n_beta =
|
let make n_alfa n_beta =
|
||||||
{ n_alfa ; n_beta }
|
{ n_alfa ; n_beta }
|
||||||
|
|
||||||
@ -25,14 +31,32 @@ let of_atoms ?multiplicity:(multiplicity=1) ?charge:(charge=0) nuclei =
|
|||||||
if multiplicity <> (n_alfa - n_beta)+1 then
|
if multiplicity <> (n_alfa - n_beta)+1 then
|
||||||
invalid_arg (__FILE__^": make");
|
invalid_arg (__FILE__^": make");
|
||||||
result
|
result
|
||||||
|
(* Creation:2 ends here *)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(* | ~charge~ | Sum of the charges of the electrons |
|
||||||
|
* | ~n_elec~ | Number of electrons |
|
||||||
|
* | ~n_alfa~ | Number of alpha electrons |
|
||||||
|
* | ~n_beta~ | Number of beta electrons |
|
||||||
|
* | ~multiplicity~ | Spin multiplicity: $2S+1$ | *)
|
||||||
|
|
||||||
|
|
||||||
|
(* [[file:../electrons.org::*Access][Access:2]] *)
|
||||||
let charge e =
|
let charge e =
|
||||||
- (e.n_alfa + e.n_beta)
|
- (e.n_alfa + e.n_beta)
|
||||||
|> Charge.of_int
|
|> Charge.of_int
|
||||||
|
|
||||||
|
|
||||||
let n_alfa t = t.n_alfa
|
let n_alfa t = t.n_alfa
|
||||||
|
|
||||||
let n_beta t = t.n_beta
|
let n_beta t = t.n_beta
|
||||||
|
|
||||||
let n_elec t = t.n_alfa + t.n_beta
|
let n_elec t = t.n_alfa + t.n_beta
|
||||||
|
|
||||||
let multiplicity t = t.n_alfa - t.n_beta + 1
|
let multiplicity t = t.n_alfa - t.n_beta + 1
|
||||||
|
(* Access:2 ends here *)
|
||||||
|
|
||||||
|
(* [[file:../electrons.org::*Printers][Printers:2]] *)
|
||||||
|
let pp ppf t =
|
||||||
|
Format.fprintf ppf "@[n_alfa=%d, n_beta=%d@]" t.n_alfa t.n_beta
|
||||||
|
(* Printers:2 ends here *)
|
||||||
|
@ -1,33 +1,41 @@
|
|||||||
(** Information related to electrons. *)
|
(* Type
|
||||||
|
*
|
||||||
|
* #+NAME: types *)
|
||||||
|
|
||||||
|
(* [[file:../electrons.org::types][types]] *)
|
||||||
|
type t
|
||||||
|
(* types ends here *)
|
||||||
|
|
||||||
|
(* Creation *)
|
||||||
|
|
||||||
|
|
||||||
|
(* [[file:../electrons.org::*Creation][Creation:1]] *)
|
||||||
open Common
|
open Common
|
||||||
|
|
||||||
type t
|
|
||||||
|
|
||||||
val make : int -> int -> t
|
val make : int -> int -> t
|
||||||
(** make [n_alfa] [n_beta] *)
|
|
||||||
|
|
||||||
val of_atoms : ?multiplicity:int -> ?charge:int -> Nuclei.t -> t
|
val of_atoms : ?multiplicity:int -> ?charge:int -> Nuclei.t -> t
|
||||||
(** Creates the data relative to electrons for a molecular system
|
(* @param multiplicity default is 1
|
||||||
described by {!Nuclei.t} for a given total charge and spin multiplicity.
|
@param charge default is 0
|
||||||
@param multiplicity default is 1
|
@raise Invalid_argument if the spin multiplicity is not compatible with
|
||||||
@param charge default is 0
|
|
||||||
@raise Invalid_argument if the spin multiplicity is not compatible with
|
|
||||||
the molecule and the total charge.
|
the molecule and the total charge.
|
||||||
*)
|
*)
|
||||||
|
(* Creation:1 ends here *)
|
||||||
|
|
||||||
val charge : t -> Charge.t
|
(* Access *)
|
||||||
(** Sum of the charges of the electrons. *)
|
|
||||||
|
|
||||||
val n_elec : t -> int
|
|
||||||
(** Number of electrons *)
|
|
||||||
|
|
||||||
val n_alfa : t -> int
|
|
||||||
(** Number of alpha electrons *)
|
|
||||||
|
|
||||||
val n_beta : t -> int
|
|
||||||
(** Number of beta electrons *)
|
|
||||||
|
|
||||||
|
(* [[file:../electrons.org::*Access][Access:1]] *)
|
||||||
|
val charge : t -> Charge.t
|
||||||
|
val n_elec : t -> int
|
||||||
|
val n_alfa : t -> int
|
||||||
|
val n_beta : t -> int
|
||||||
val multiplicity : t -> int
|
val multiplicity : t -> int
|
||||||
(** Spin multiplicity: {% $2S+1$ %} *)
|
(* Access:1 ends here *)
|
||||||
|
|
||||||
|
(* Printers *)
|
||||||
|
|
||||||
|
|
||||||
|
(* [[file:../electrons.org::*Printers][Printers:1]] *)
|
||||||
|
val pp : Format.formatter -> t -> unit
|
||||||
|
(* Printers:1 ends here *)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
|
(* [[file:../electrons.org::*Type][Type:3]] *)
|
||||||
open Common
|
open Common
|
||||||
open Particles
|
open Particles
|
||||||
open Alcotest
|
open Alcotest
|
||||||
|
|
||||||
|
|
||||||
let test_all () =
|
let test_all () =
|
||||||
let nuclei =
|
let nuclei =
|
||||||
"3
|
"3
|
||||||
@ -14,21 +14,34 @@ H 0.756950272703377558 0. -0.585882234512562827
|
|||||||
|> Nuclei.of_xyz_string
|
|> Nuclei.of_xyz_string
|
||||||
in
|
in
|
||||||
let e = Electrons.of_atoms nuclei in
|
let e = Electrons.of_atoms nuclei in
|
||||||
check int "of_atoms alfa" 5 (Electrons.n_alfa e);
|
(* Type:3 ends here *)
|
||||||
check int "of_atoms beta" 5 (Electrons.n_beta e);
|
|
||||||
check int "charge " (-10) (Charge.to_int @@ Electrons.charge e);
|
(* [[file:../electrons.org::*Creation][Creation:3]] *)
|
||||||
check int "n_elec" 10 (Electrons.n_elec e);
|
check int "of_atoms alfa" 5 (Electrons.n_alfa e);
|
||||||
check int "multiplicity" 1 (Electrons.multiplicity e);
|
check int "of_atoms beta" 5 (Electrons.n_beta e);
|
||||||
check int "of_atoms alfa m3" 6 (Electrons.(of_atoms ~multiplicity:3 nuclei |> n_alfa));
|
(* Creation:3 ends here *)
|
||||||
check int "of_atoms beta m3" 4 (Electrons.(of_atoms ~multiplicity:3 nuclei |> n_beta));
|
|
||||||
check int "of_atoms n_elec m3" 10 (Electrons.(of_atoms ~multiplicity:3 nuclei |> n_elec));
|
(* [[file:../electrons.org::*Access][Access:3]] *)
|
||||||
check int "of_atoms alfa m2 c1" 5 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> n_alfa));
|
check int "charge " (-10) (Charge.to_int @@ Electrons.charge e);
|
||||||
check int "of_atoms beta m2 c1" 4 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> n_beta));
|
check int "n_elec" 10 (Electrons.n_elec e);
|
||||||
check int "of_atoms beta m2 c1" 9 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> n_elec));
|
check int "multiplicity" 1 (Electrons.multiplicity e);
|
||||||
check int "of_atoms mult m2 c1" 2 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> multiplicity));
|
check int "of_atoms alfa m3" 6 (Electrons.(of_atoms ~multiplicity:3 nuclei |> n_alfa));
|
||||||
check bool "make" true (Electrons.make 6 4 = Electrons.(of_atoms ~multiplicity:3 nuclei));
|
check int "of_atoms beta m3" 4 (Electrons.(of_atoms ~multiplicity:3 nuclei |> n_beta));
|
||||||
|
check int "of_atoms n_elec m3" 10 (Electrons.(of_atoms ~multiplicity:3 nuclei |> n_elec));
|
||||||
|
check int "of_atoms alfa m2 c1" 5 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> n_alfa));
|
||||||
|
check int "of_atoms beta m2 c1" 4 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> n_beta));
|
||||||
|
check int "of_atoms beta m2 c1" 9 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> n_elec));
|
||||||
|
check int "of_atoms mult m2 c1" 2 (Electrons.(of_atoms ~multiplicity:2 ~charge:1 nuclei |> multiplicity));
|
||||||
|
check bool "make" true (Electrons.make 6 4 = Electrons.(of_atoms ~multiplicity:3 nuclei));
|
||||||
|
(* Access:3 ends here *)
|
||||||
|
|
||||||
|
(* Tests *)
|
||||||
|
|
||||||
|
|
||||||
|
(* [[file:../electrons.org::*Tests][Tests:1]] *)
|
||||||
()
|
()
|
||||||
|
|
||||||
let tests = [
|
let tests = [
|
||||||
"all", `Quick, test_all
|
"all", `Quick, test_all
|
||||||
]
|
]
|
||||||
|
(* Tests:1 ends here *)
|
||||||
|
Loading…
Reference in New Issue
Block a user