10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-12-23 21:03:33 +01:00
QCaml/common/lib/coordinate.ml

106 lines
1.6 KiB
OCaml
Raw Normal View History

2024-01-17 10:30:24 +01:00
(** Types *)
type bohr
type angstrom
2018-02-02 01:25:10 +01:00
type xyz = {
x : float ;
y : float ;
z : float ;
}
type 'a point = xyz
type t = bohr point
2018-02-13 17:36:25 +01:00
type axis = X | Y | Z
2018-01-17 18:19:38 +01:00
2018-02-14 18:08:43 +01:00
2020-12-27 23:08:12 +01:00
2024-01-17 10:30:24 +01:00
(** Creation *)
2020-12-27 23:08:12 +01:00
external make : 'a point -> t = "%identity"
2020-12-27 17:23:47 +01:00
external make_angstrom : 'a point -> angstrom point = "%identity"
2020-12-27 23:08:12 +01:00
let zero =
make { x = 0. ; y = 0. ; z = 0. }
2018-01-17 18:19:38 +01:00
2024-01-17 10:30:24 +01:00
(** Conversion *)
2020-12-27 23:08:12 +01:00
2024-01-17 10:30:24 +01:00
let b_to_a b = Constants.a0 *. b
let bohr_to_angstrom { x ; y ; z } =
2020-12-27 17:23:47 +01:00
make { x = b_to_a x ;
y = b_to_a y ;
z = b_to_a z ; }
2018-01-17 18:19:38 +01:00
2024-01-17 10:30:24 +01:00
let a_to_b a = Constants.a0_inv *. a
let angstrom_to_bohr { x ; y ; z } =
2020-12-27 17:23:47 +01:00
make { x = a_to_b x ;
y = a_to_b y ;
z = a_to_b z ; }
2024-01-17 10:30:24 +01:00
let get axis { x ; y ; z } =
2020-12-27 23:08:12 +01:00
match axis with
2024-01-17 10:30:24 +01:00
| X -> x
| Y -> y
| Z -> z
2020-12-27 17:23:47 +01:00
let ( |. ) s { x ; y ; z } =
2020-12-27 17:23:47 +01:00
make { x = s *. x ;
y = s *. y ;
z = s *. z ; }
2018-02-13 17:36:25 +01:00
2020-12-27 17:23:47 +01:00
let ( |+ )
{ x = x1 ; y = y1 ; z = z1 }
{ x = x2 ; y = y2 ; z = z2 } =
make { x = x1 +. x2 ;
y = y1 +. y2 ;
z = z1 +. z2 ; }
2018-01-17 18:19:38 +01:00
2020-12-27 17:23:47 +01:00
let ( |- )
{ x = x1 ; y = y1 ; z = z1 }
{ x = x2 ; y = y2 ; z = z2 } =
make { x = x1 -. x2 ;
y = y1 -. y2 ;
z = z1 -. z2 ; }
let neg a = -1. |. a
2020-12-27 23:08:12 +01:00
2020-12-27 17:23:47 +01:00
let dot
{ x = x1 ; y = y1 ; z = z1 }
{ x = x2 ; y = y2 ; z = z2 } =
x1 *. x2 +.
y1 *. y2 +.
z1 *. z2
2020-12-27 23:08:12 +01:00
let norm u =
sqrt ( dot u u )
2020-12-27 17:23:47 +01:00
2020-12-27 23:08:12 +01:00
2024-01-17 10:30:24 +01:00
(** Printers *)
2020-12-27 17:23:47 +01:00
2018-03-16 00:23:47 +01:00
open Format
2024-01-17 10:30:24 +01:00
let pp ppf c =
2018-03-16 00:23:47 +01:00
fprintf ppf "@[@[%8.4f@] @[%8.4f@] @[%8.4f@]@]" c.x c.y c.z
2024-01-17 10:30:24 +01:00
let pp_bohr ppf c =
2018-03-16 00:23:47 +01:00
fprintf ppf "@[(@[%10f@], @[%10f@], @[%10f@] Bohr)@]" c.x c.y c.z
2018-03-15 15:25:49 +01:00
2024-01-17 10:30:24 +01:00
let pp_angstrom ppf c =
2018-03-15 15:25:49 +01:00
let c = bohr_to_angstrom c in
2018-03-16 00:23:47 +01:00
fprintf ppf "@[(@[%10f@], @[%10f@], @[%10f@] Angs)@]" c.x c.y c.z