2017-08-18 18:28:33 +02:00
|
|
|
open Core;;
|
2014-10-27 01:14:18 +01:00
|
|
|
open Qptypes;;
|
2014-08-23 17:07:47 +02:00
|
|
|
|
|
|
|
type t = {
|
|
|
|
x : float ;
|
|
|
|
y : float ;
|
|
|
|
z : float ;
|
2017-08-18 18:28:33 +02:00
|
|
|
} [@@deriving sexp]
|
2014-08-23 17:07:47 +02:00
|
|
|
|
2015-11-17 22:25:26 +01:00
|
|
|
let of_tuple ~units (x,y,z) =
|
|
|
|
let f = match units with
|
|
|
|
| Units.Bohr -> 1.
|
|
|
|
| Units.Angstrom -> Units.angstrom_to_bohr
|
|
|
|
in
|
|
|
|
{ x = x *. f ; y = y *. f ; z = z *. f }
|
|
|
|
|
2014-09-18 17:01:43 +02:00
|
|
|
(** Read x y z coordinates in string s with units u *)
|
2015-11-17 22:25:26 +01:00
|
|
|
let of_string ~units s =
|
|
|
|
let f = match units with
|
2014-10-07 19:33:11 +02:00
|
|
|
| Units.Bohr -> 1.
|
|
|
|
| Units.Angstrom -> Units.angstrom_to_bohr
|
2014-09-18 17:01:43 +02:00
|
|
|
in
|
2014-08-23 17:07:47 +02:00
|
|
|
let l = s
|
|
|
|
|> String.split ~on:' '
|
|
|
|
|> List.filter ~f:(fun x -> x <> "")
|
|
|
|
|> List.map ~f:Float.of_string
|
|
|
|
|> Array.of_list
|
|
|
|
in
|
2014-09-18 17:01:43 +02:00
|
|
|
{ x = l.(0) *. f ;
|
|
|
|
y = l.(1) *. f ;
|
|
|
|
z = l.(2) *. f }
|
2014-08-23 17:07:47 +02:00
|
|
|
|
|
|
|
|
|
|
|
let distance2 p1 p2 =
|
|
|
|
let { x=x1 ; y=y1 ; z=z1 } = p1
|
|
|
|
and { x=x2 ; y=y2 ; z=z2 } = p2 in
|
|
|
|
(x2-.x1)*.(x2-.x1) +. (y2-.y1)*.(y2-.y1) +. (z2-.z1)*.(z2-.z1)
|
2014-10-27 01:14:18 +01:00
|
|
|
|> Positive_float.of_float
|
2014-08-23 17:07:47 +02:00
|
|
|
|
|
|
|
|
2015-11-17 22:25:26 +01:00
|
|
|
let distance p1 p2 =
|
|
|
|
sqrt (Positive_float.to_float (distance2 p1 p2))
|
|
|
|
|
|
|
|
|
|
|
|
let to_string ~units p =
|
|
|
|
let f = match units with
|
2014-10-07 19:33:11 +02:00
|
|
|
| Units.Bohr -> 1.
|
|
|
|
| Units.Angstrom -> Units.bohr_to_angstrom
|
|
|
|
in
|
2014-08-23 17:07:47 +02:00
|
|
|
let { x=x ; y=y ; z=z } = p in
|
2014-10-29 18:55:31 +01:00
|
|
|
Printf.sprintf "%16.8f %16.8f %16.8f" (x*.f) (y*.f) (z*.f)
|
2015-11-17 22:25:26 +01:00
|
|
|
|
2014-08-23 17:07:47 +02:00
|
|
|
|