mirror of
https://github.com/LCPQ/quantum_package
synced 2024-08-25 05:51:46 +02:00
xyz to ezfio works
This commit is contained in:
parent
12c7bcf99d
commit
0fb8c3b7ae
@ -26,7 +26,8 @@ type t =
|
|||||||
coord : Point3d.t ;
|
coord : Point3d.t ;
|
||||||
}
|
}
|
||||||
|
|
||||||
let of_string s =
|
(** Read xyz coordinates of the atom with unit u *)
|
||||||
|
let of_string u s =
|
||||||
let buffer = s
|
let buffer = s
|
||||||
|> String.split ~on:' '
|
|> String.split ~on:' '
|
||||||
|> List.filter ~f:(fun x -> x <> "")
|
|> List.filter ~f:(fun x -> x <> "")
|
||||||
@ -35,13 +36,13 @@ let of_string s =
|
|||||||
| [ name; charge; x; y; z ] ->
|
| [ name; charge; x; y; z ] ->
|
||||||
{ element = Element.of_string name ;
|
{ element = Element.of_string name ;
|
||||||
charge = Charge.of_string charge ;
|
charge = Charge.of_string charge ;
|
||||||
coord = Point3d.of_string (String.concat [x; y; z] ~sep:" ")
|
coord = Point3d.of_string u (String.concat [x; y; z] ~sep:" ")
|
||||||
}
|
}
|
||||||
| [ name; x; y; z ] ->
|
| [ name; x; y; z ] ->
|
||||||
let e = Element.of_string name in
|
let e = Element.of_string name in
|
||||||
{ element = e ;
|
{ element = e ;
|
||||||
charge = Charge.of_int (Element.charge e);
|
charge = Charge.of_int (Element.charge e);
|
||||||
coord = Point3d.of_string (String.concat [x; y; z] ~sep:" ")
|
coord = Point3d.of_string u (String.concat [x; y; z] ~sep:" ")
|
||||||
}
|
}
|
||||||
| _ -> raise (AtomError s)
|
| _ -> raise (AtomError s)
|
||||||
;;
|
;;
|
||||||
|
@ -6,7 +6,7 @@ exception End_Of_Basis
|
|||||||
|
|
||||||
type t =
|
type t =
|
||||||
{ sym : Symmetry.t ;
|
{ sym : Symmetry.t ;
|
||||||
lc : ((Primitive.t * float) list)
|
lc : ((Primitive.t * AO_coef.t) list)
|
||||||
}
|
}
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ let read_one in_channel =
|
|||||||
Primitive.expo = Positive_float.of_float
|
Primitive.expo = Positive_float.of_float
|
||||||
(Float.of_string expo)
|
(Float.of_string expo)
|
||||||
}
|
}
|
||||||
and c = Float.of_string coef in
|
and c = AO_coef.of_float (Float.of_string coef) in
|
||||||
read_lines ( (p,c)::result) (i-1)
|
read_lines ( (p,c)::result) (i-1)
|
||||||
end
|
end
|
||||||
| _ -> raise (GTO_Read_Failure line_buffer)
|
| _ -> raise (GTO_Read_Failure line_buffer)
|
||||||
@ -68,7 +68,7 @@ let read_one in_channel =
|
|||||||
|
|
||||||
(** Transform the gto to a string *)
|
(** Transform the gto to a string *)
|
||||||
let to_string { sym = sym ; lc = lc } =
|
let to_string { sym = sym ; lc = lc } =
|
||||||
let f (p,c) = Printf.sprintf "( %s, %f )" (Primitive.to_string p) c
|
let f (p,c) = Printf.sprintf "( %s, %f )" (Primitive.to_string p) (AO_coef.to_float c)
|
||||||
in
|
in
|
||||||
Printf.sprintf "[ %s : %s ]" (Symmetry.to_string sym)
|
Printf.sprintf "[ %s : %s ]" (Symmetry.to_string sym)
|
||||||
(String.concat (List.map ~f:f lc) ~sep:", ")
|
(String.concat (List.map ~f:f lc) ~sep:", ")
|
||||||
|
@ -12,7 +12,7 @@ endif
|
|||||||
|
|
||||||
LIBS=
|
LIBS=
|
||||||
PKGS=
|
PKGS=
|
||||||
OCAMLCFLAGS=-g
|
OCAMLCFLAGS=-g
|
||||||
OCAMLBUILD=ocamlbuild -j 0 -cflags $(OCAMLCFLAGS) -lflags -g
|
OCAMLBUILD=ocamlbuild -j 0 -cflags $(OCAMLCFLAGS) -lflags -g
|
||||||
MLFILES=$(wildcard *.ml) ezfio.ml Qptypes.ml
|
MLFILES=$(wildcard *.ml) ezfio.ml Qptypes.ml
|
||||||
MLIFILES=$(wildcard *.mli)
|
MLIFILES=$(wildcard *.mli)
|
||||||
|
@ -76,10 +76,11 @@ let to_string m =
|
|||||||
|
|
||||||
let of_xyz_string
|
let of_xyz_string
|
||||||
?(charge=0) ?(multiplicity=(Multiplicity.of_int 1))
|
?(charge=0) ?(multiplicity=(Multiplicity.of_int 1))
|
||||||
|
?(units=Point3d.Angstrom)
|
||||||
s =
|
s =
|
||||||
let l = String.split s ~on:'\n'
|
let l = String.split s ~on:'\n'
|
||||||
|> List.filter ~f:(fun x -> x <> "")
|
|> List.filter ~f:(fun x -> x <> "")
|
||||||
|> List.map ~f:Atom.of_string
|
|> List.map ~f:(fun x -> Atom.of_string units x)
|
||||||
in
|
in
|
||||||
let ne = ( get_charge {
|
let ne = ( get_charge {
|
||||||
nuclei=l ;
|
nuclei=l ;
|
||||||
|
@ -1,21 +1,33 @@
|
|||||||
open Core.Std;;
|
open Core.Std;;
|
||||||
|
|
||||||
|
type units =
|
||||||
|
| Bohr
|
||||||
|
| Angstrom
|
||||||
|
;;
|
||||||
|
|
||||||
type t = {
|
type t = {
|
||||||
x : float ;
|
x : float ;
|
||||||
y : float ;
|
y : float ;
|
||||||
z : float ;
|
z : float ;
|
||||||
}
|
}
|
||||||
|
|
||||||
let of_string s =
|
(** Read x y z coordinates in string s with units u *)
|
||||||
|
let of_string u s =
|
||||||
|
let f =
|
||||||
|
begin match u with
|
||||||
|
| Bohr -> 1.
|
||||||
|
| Angstrom -> 1. /. 0.52917721092
|
||||||
|
end
|
||||||
|
in
|
||||||
let l = s
|
let l = s
|
||||||
|> String.split ~on:' '
|
|> String.split ~on:' '
|
||||||
|> List.filter ~f:(fun x -> x <> "")
|
|> List.filter ~f:(fun x -> x <> "")
|
||||||
|> List.map ~f:Float.of_string
|
|> List.map ~f:Float.of_string
|
||||||
|> Array.of_list
|
|> Array.of_list
|
||||||
in
|
in
|
||||||
{ x = l.(0) ;
|
{ x = l.(0) *. f ;
|
||||||
y = l.(1) ;
|
y = l.(1) *. f ;
|
||||||
z = l.(2) }
|
z = l.(2) *. f }
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,14 @@
|
|||||||
let (/) (a:string) (b:string) = a^"/"^b;;
|
let (/) (a:string) (b:string) = a^"/"^b;;
|
||||||
|
|
||||||
|
let rec transpose = function
|
||||||
|
| [] -> []
|
||||||
|
| []::tail -> transpose tail
|
||||||
|
| (x::t1)::t2 ->
|
||||||
|
let new_head = (x::(List.map List.hd t2))
|
||||||
|
and new_tail = (transpose (t1 :: (List.map List.tl t2) ))
|
||||||
|
in
|
||||||
|
new_head @ new_tail
|
||||||
|
;;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,7 +58,9 @@ type st = t
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
module Xyz : sig
|
module Xyz : sig
|
||||||
type t
|
type t = { x: Positive_int.t ;
|
||||||
|
y: Positive_int.t ;
|
||||||
|
z: Positive_int.t }
|
||||||
val of_string : string -> t
|
val of_string : string -> t
|
||||||
val to_string : t -> string
|
val to_string : t -> string
|
||||||
val get_l : t -> Positive_int.t
|
val get_l : t -> Positive_int.t
|
||||||
@ -67,7 +69,6 @@ end = struct
|
|||||||
type t = { x: Positive_int.t ;
|
type t = { x: Positive_int.t ;
|
||||||
y: Positive_int.t ;
|
y: Positive_int.t ;
|
||||||
z: Positive_int.t }
|
z: Positive_int.t }
|
||||||
|
|
||||||
type state_type = Null | X | Y | Z
|
type state_type = Null | X | Y | Z
|
||||||
|
|
||||||
(** Builds an XYZ triplet from a string.
|
(** Builds an XYZ triplet from a string.
|
||||||
|
18
ocaml/Symmetry.mli
Normal file
18
ocaml/Symmetry.mli
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
open Qptypes;;
|
||||||
|
|
||||||
|
type t = S | P | D | F | G | H | I | J | K | L
|
||||||
|
val to_string : t -> string
|
||||||
|
val of_string : string -> t
|
||||||
|
val of_char : char -> t
|
||||||
|
val to_l : t -> Positive_int.t
|
||||||
|
type st = t
|
||||||
|
module Xyz :
|
||||||
|
sig
|
||||||
|
type t = { x: Positive_int.t ;
|
||||||
|
y: Positive_int.t ;
|
||||||
|
z: Positive_int.t }
|
||||||
|
val of_string : string -> t
|
||||||
|
val to_string : t -> string
|
||||||
|
val get_l : t -> Positive_int.t
|
||||||
|
val of_symmetry : st -> t list
|
||||||
|
end
|
@ -98,21 +98,59 @@ File : %s\n" c m b xyz_file;
|
|||||||
Ezfio.set_ao_basis_ao_num ao_num;
|
Ezfio.set_ao_basis_ao_num ao_num;
|
||||||
let ao_prim_num = List.map long_basis ~f:(fun (_,g,_) -> List.length g.Gto.lc)
|
let ao_prim_num = List.map long_basis ~f:(fun (_,g,_) -> List.length g.Gto.lc)
|
||||||
and ao_nucl = List.map long_basis ~f:(fun (_,_,n) -> Atom_number.to_int n)
|
and ao_nucl = List.map long_basis ~f:(fun (_,_,n) -> Atom_number.to_int n)
|
||||||
|
and ao_power=
|
||||||
|
let l = List.map long_basis ~f:(fun (x,_,_) -> x) in
|
||||||
|
(List.map l ~f:(fun t -> Positive_int.to_int Symmetry.Xyz.(t.x)) )@
|
||||||
|
(List.map l ~f:(fun t -> Positive_int.to_int Symmetry.Xyz.(t.y)) )@
|
||||||
|
(List.map l ~f:(fun t -> Positive_int.to_int Symmetry.Xyz.(t.z)) )
|
||||||
|
in
|
||||||
|
let ao_prim_num_max = List.fold ~init:0 ~f:(fun s x ->
|
||||||
|
if x > s then x
|
||||||
|
else s) ao_prim_num
|
||||||
|
in
|
||||||
|
let gtos = List.map long_basis ~f:(fun (_,x,_) -> x) in
|
||||||
|
|
||||||
|
let create_expo_coef ec =
|
||||||
|
let coefs =
|
||||||
|
begin match ec with
|
||||||
|
| `Coefs -> List.map gtos ~f:(fun x->
|
||||||
|
List.map x.Gto.lc ~f:(fun (_,coef) -> AO_coef.to_float coef) )
|
||||||
|
| `Expos -> List.map gtos ~f:(fun x->
|
||||||
|
List.map x.Gto.lc ~f:(fun (prim,_) -> Positive_float.to_float
|
||||||
|
prim.Primitive.expo) )
|
||||||
|
end
|
||||||
|
in
|
||||||
|
let rec get_n n accu = function
|
||||||
|
| [] -> List.rev accu
|
||||||
|
| h::tail ->
|
||||||
|
let y =
|
||||||
|
begin match List.nth h n with
|
||||||
|
| Some x -> x
|
||||||
|
| None -> 0.
|
||||||
|
end
|
||||||
|
in
|
||||||
|
get_n n (y::accu) tail
|
||||||
|
in
|
||||||
|
let rec build accu = function
|
||||||
|
| n when n=ao_prim_num_max -> accu
|
||||||
|
| n -> build ( accu @ (get_n n [] coefs) ) (n+1)
|
||||||
|
in
|
||||||
|
build [] 0
|
||||||
|
in
|
||||||
|
|
||||||
|
let ao_coef = create_expo_coef `Coefs
|
||||||
|
and ao_expo = create_expo_coef `Expos
|
||||||
in
|
in
|
||||||
Ezfio.set_ao_basis_ao_prim_num (Ezfio.ezfio_array_of_list
|
Ezfio.set_ao_basis_ao_prim_num (Ezfio.ezfio_array_of_list
|
||||||
~rank:1 ~dim:[| ao_num |] ~data:ao_prim_num) ;
|
~rank:1 ~dim:[| ao_num |] ~data:ao_prim_num) ;
|
||||||
Ezfio.set_ao_basis_ao_nucl(Ezfio.ezfio_array_of_list
|
Ezfio.set_ao_basis_ao_nucl(Ezfio.ezfio_array_of_list
|
||||||
~rank:1 ~dim:[| ao_num |] ~data:ao_nucl) ;
|
~rank:1 ~dim:[| ao_num |] ~data:ao_nucl) ;
|
||||||
|
Ezfio.set_ao_basis_ao_power(Ezfio.ezfio_array_of_list
|
||||||
(*
|
~rank:2 ~dim:[| ao_num ; 3 |] ~data:ao_power) ;
|
||||||
ao_basis
|
Ezfio.set_ao_basis_ao_coef(Ezfio.ezfio_array_of_list
|
||||||
ao_power integer (ao_basis_ao_num,3)
|
~rank:2 ~dim:[| ao_num ; ao_prim_num_max |] ~data:ao_coef) ;
|
||||||
ao_prim_num_max integer = maxval(ao_basis_ao_prim_num)
|
Ezfio.set_ao_basis_ao_expo(Ezfio.ezfio_array_of_list
|
||||||
ao_coef double precision (ao_basis_ao_num,ao_basis_ao_prim_num_max)
|
~rank:2 ~dim:[| ao_num ; ao_prim_num_max |] ~data:ao_expo) ;
|
||||||
ao_expo double precision (ao_basis_ao_num,ao_basis_ao_prim_num_max)
|
|
||||||
|
|
||||||
*)
|
|
||||||
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let command =
|
let command =
|
||||||
|
@ -54,7 +54,7 @@ let input_data = "
|
|||||||
if (x > 100) then
|
if (x > 100) then
|
||||||
warning \"N_int > 100\";
|
warning \"N_int > 100\";
|
||||||
if (Ezfio.has_determinants_n_int ()) then
|
if (Ezfio.has_determinants_n_int ()) then
|
||||||
assert (x == (Ezfio.get_determinants_n_int ()));
|
assert (x = (Ezfio.get_determinants_n_int ()));
|
||||||
|
|
||||||
* Det_number : int
|
* Det_number : int
|
||||||
assert (x > 0) ;
|
assert (x > 0) ;
|
||||||
@ -75,6 +75,10 @@ let input_data = "
|
|||||||
| _ -> raise (Failure \"Bit_kind should be (1|2|4|8).\")
|
| _ -> raise (Failure \"Bit_kind should be (1|2|4|8).\")
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
* MO_coef : float
|
||||||
|
|
||||||
|
* AO_coef : float
|
||||||
|
|
||||||
"
|
"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@ -84,17 +88,19 @@ module %s : sig
|
|||||||
type t
|
type t
|
||||||
val to_%s : t -> %s
|
val to_%s : t -> %s
|
||||||
val of_%s : %s -> t
|
val of_%s : %s -> t
|
||||||
|
val to_string : %s -> string
|
||||||
end = struct
|
end = struct
|
||||||
type t = %s
|
type t = %s
|
||||||
let to_%s x = x
|
let to_%s x = x
|
||||||
let of_%s x = ( %s x )
|
let of_%s x = ( %s x )
|
||||||
|
let to_string x = %s.to_string x
|
||||||
end
|
end
|
||||||
|
|
||||||
"
|
"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let parse_input input=
|
let parse_input input=
|
||||||
print_string "let warning = print_string;;\n" ;
|
print_string "open Core.Std;;\nlet warning = print_string;;\n" ;
|
||||||
let rec parse result = function
|
let rec parse result = function
|
||||||
| [] -> result
|
| [] -> result
|
||||||
| ( "" , "" )::tail -> parse result tail
|
| ( "" , "" )::tail -> parse result tail
|
||||||
@ -102,10 +108,10 @@ let parse_input input=
|
|||||||
let name , typ = String.lsplit2_exn ~on:':' t
|
let name , typ = String.lsplit2_exn ~on:':' t
|
||||||
in
|
in
|
||||||
let typ = String.strip typ
|
let typ = String.strip typ
|
||||||
and name = String.strip name
|
and name = String.strip name in
|
||||||
in
|
let typ_cap = String.capitalize typ in
|
||||||
let newstring = Printf.sprintf template name typ typ typ typ typ typ typ
|
let newstring = Printf.sprintf template name typ typ typ typ typ typ typ typ
|
||||||
( String.strip text )
|
( String.strip text ) typ_cap
|
||||||
in
|
in
|
||||||
List.rev (parse (newstring::result) tail )
|
List.rev (parse (newstring::result) tail )
|
||||||
in
|
in
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
let test_atom =
|
let test_atom =
|
||||||
let line = "C 6.0 1. 2. 3." in
|
let line = "C 6.0 1. 2. 3." in
|
||||||
let atom = Atom.of_string line in
|
let atom = Atom.of_string Point3d.Bohr line in
|
||||||
print_string (Atom.to_string atom)
|
print_string (Atom.to_string atom)
|
||||||
;;
|
;;
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
let test_point3d_1 () =
|
let test_point3d_1 () =
|
||||||
let input = "7.4950000 -0.1499810 0.5085570" in
|
let input = "7.4950000 -0.1499810 0.5085570" in
|
||||||
let p3d = Point3d.of_string input in
|
let p3d = Point3d.of_string Point3d.Angstrom input in
|
||||||
print_string (Point3d.to_string p3d)
|
print_endline(Point3d.to_string p3d);
|
||||||
|
let p3d = Point3d.of_string Point3d.Bohr input in
|
||||||
|
print_endline (Point3d.to_string p3d)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let test_point3d () =
|
let test_point3d () =
|
||||||
let p1 = Point3d.of_string "1. 2. 3."
|
let p1 = Point3d.of_string Point3d.Bohr "1. 2. 3."
|
||||||
and p2 = Point3d.of_string "-2. 1. 1.5" in
|
and p2 = Point3d.of_string Point3d.Bohr "-2. 1. 1.5" in
|
||||||
Printf.printf "%f\n" (Point3d.distance p1 p2)
|
Printf.printf "%f\n" (Point3d.distance p1 p2)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
test_point3d ();
|
test_point3d_1 ();
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
User-agent: *
|
|
||||||
Allow: /
|
|
@ -4,7 +4,13 @@ BEGIN_PROVIDER [ integer, mo_tot_num ]
|
|||||||
! Total number of molecular orbitals and the size of the keys corresponding
|
! Total number of molecular orbitals and the size of the keys corresponding
|
||||||
END_DOC
|
END_DOC
|
||||||
PROVIDE ezfio_filename
|
PROVIDE ezfio_filename
|
||||||
call ezfio_get_mo_basis_mo_tot_num(mo_tot_num)
|
logical :: exists
|
||||||
|
call ezfio_has_mo_basis_mo_tot_num(exists)
|
||||||
|
if (exists) then
|
||||||
|
call ezfio_get_mo_basis_mo_tot_num(mo_tot_num)
|
||||||
|
else
|
||||||
|
mo_tot_num = ao_num
|
||||||
|
endif
|
||||||
ASSERT (mo_tot_num > 0)
|
ASSERT (mo_tot_num > 0)
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
@ -42,18 +48,23 @@ END_PROVIDER
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
! Coefs
|
! Coefs
|
||||||
allocate(buffer(ao_num,mo_tot_num))
|
call ezfio_has_mo_basis_mo_coef(exists)
|
||||||
buffer = 0.d0
|
if (exists) then
|
||||||
call ezfio_get_mo_basis_mo_coef(buffer)
|
allocate(buffer(ao_num,mo_tot_num))
|
||||||
do i=1,mo_tot_num
|
buffer = 0.d0
|
||||||
do j=1,ao_num
|
call ezfio_get_mo_basis_mo_coef(buffer)
|
||||||
mo_coef(j,i) = buffer(j,i)
|
do i=1,mo_tot_num
|
||||||
|
do j=1,ao_num
|
||||||
|
mo_coef(j,i) = buffer(j,i)
|
||||||
|
enddo
|
||||||
|
do j=ao_num+1,ao_num_align
|
||||||
|
mo_coef(j,i) = 0.d0
|
||||||
|
enddo
|
||||||
enddo
|
enddo
|
||||||
do j=ao_num+1,ao_num_align
|
deallocate(buffer)
|
||||||
mo_coef(j,i) = 0.d0
|
else
|
||||||
enddo
|
mo_coef = 0.d0
|
||||||
enddo
|
endif
|
||||||
deallocate(buffer)
|
|
||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ subroutine save_mos
|
|||||||
|
|
||||||
call system('$QPACKAGE_ROOT/scripts/save_current_mos.sh '//trim(ezfio_filename))
|
call system('$QPACKAGE_ROOT/scripts/save_current_mos.sh '//trim(ezfio_filename))
|
||||||
|
|
||||||
|
call ezfio_set_mo_basis_mo_tot_num(mo_tot_num)
|
||||||
call ezfio_set_mo_basis_mo_label(mo_label)
|
call ezfio_set_mo_basis_mo_label(mo_label)
|
||||||
allocate ( buffer(ao_num,mo_tot_num) )
|
allocate ( buffer(ao_num,mo_tot_num) )
|
||||||
buffer = 0.d0
|
buffer = 0.d0
|
||||||
|
Loading…
Reference in New Issue
Block a user