mirror of
https://github.com/QuantumPackage/qp2.git
synced 2024-11-03 12:43:48 +01:00
allow no basis set
This commit is contained in:
parent
52da1de877
commit
46e3faed3c
5
data/basis/none
Normal file
5
data/basis/none
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
$DATA
|
||||||
|
|
||||||
|
HYDROGEN
|
||||||
|
|
||||||
|
$END
|
@ -247,8 +247,7 @@ end = struct
|
|||||||
|
|
||||||
|
|
||||||
let read () =
|
let read () =
|
||||||
if (Ezfio.has_ao_basis_ao_basis ()) then
|
try
|
||||||
begin
|
|
||||||
let result =
|
let result =
|
||||||
{ ao_basis = read_ao_basis ();
|
{ ao_basis = read_ao_basis ();
|
||||||
ao_num = read_ao_num () ;
|
ao_num = read_ao_num () ;
|
||||||
@ -267,9 +266,8 @@ end = struct
|
|||||||
|> MD5.to_string
|
|> MD5.to_string
|
||||||
|> Ezfio.set_ao_basis_ao_md5 ;
|
|> Ezfio.set_ao_basis_ao_md5 ;
|
||||||
Some result
|
Some result
|
||||||
end
|
with
|
||||||
else
|
| _ -> (Ezfio.set_ao_basis_ao_md5 "None" ; None)
|
||||||
None
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|
||||||
|
@ -478,6 +478,7 @@ let run ?o b au c d m p cart xyz_file =
|
|||||||
let nmax =
|
let nmax =
|
||||||
Nucl_number.get_max ()
|
Nucl_number.get_max ()
|
||||||
in
|
in
|
||||||
|
|
||||||
let rec do_work (accu:(Atom.t*Nucl_number.t) list) (n:int) = function
|
let rec do_work (accu:(Atom.t*Nucl_number.t) list) (n:int) = function
|
||||||
| [] -> accu
|
| [] -> accu
|
||||||
| e::tail ->
|
| e::tail ->
|
||||||
@ -520,141 +521,144 @@ let run ?o b au c d m p cart xyz_file =
|
|||||||
in
|
in
|
||||||
let long_basis = Long_basis.of_basis basis in
|
let long_basis = Long_basis.of_basis basis in
|
||||||
let ao_num = List.length long_basis in
|
let ao_num = List.length long_basis in
|
||||||
Ezfio.set_ao_basis_ao_num ao_num;
|
if ao_num > 0 then
|
||||||
Ezfio.set_ao_basis_ao_basis b;
|
begin
|
||||||
Ezfio.set_basis_basis b;
|
Ezfio.set_ao_basis_ao_num ao_num;
|
||||||
let ao_prim_num = list_map (fun (_,g,_) -> List.length g.Gto.lc) long_basis
|
Ezfio.set_ao_basis_ao_basis b;
|
||||||
and ao_nucl = list_map (fun (_,_,n) -> Nucl_number.to_int n) long_basis
|
Ezfio.set_basis_basis b;
|
||||||
and ao_power=
|
let ao_prim_num = list_map (fun (_,g,_) -> List.length g.Gto.lc) long_basis
|
||||||
let l = list_map (fun (x,_,_) -> x) long_basis in
|
and ao_nucl = list_map (fun (_,_,n) -> Nucl_number.to_int n) long_basis
|
||||||
(list_map (fun t -> Positive_int.to_int Angmom.Xyz.(t.x)) l)@
|
and ao_power=
|
||||||
(list_map (fun t -> Positive_int.to_int Angmom.Xyz.(t.y)) l)@
|
let l = list_map (fun (x,_,_) -> x) long_basis in
|
||||||
(list_map (fun t -> Positive_int.to_int Angmom.Xyz.(t.z)) l)
|
(list_map (fun t -> Positive_int.to_int Angmom.Xyz.(t.x)) l)@
|
||||||
in
|
(list_map (fun t -> Positive_int.to_int Angmom.Xyz.(t.y)) l)@
|
||||||
let ao_prim_num_max = List.fold_left (fun s x ->
|
(list_map (fun t -> Positive_int.to_int Angmom.Xyz.(t.z)) l)
|
||||||
if x > s then x
|
|
||||||
else s) 0 ao_prim_num
|
|
||||||
in
|
|
||||||
let gtos =
|
|
||||||
list_map (fun (_,x,_) -> x) long_basis
|
|
||||||
in
|
|
||||||
|
|
||||||
let create_expo_coef ec =
|
|
||||||
let coefs =
|
|
||||||
begin match ec with
|
|
||||||
| `Coefs -> list_map (fun x->
|
|
||||||
list_map (fun (_,coef) ->
|
|
||||||
AO_coef.to_float coef) x.Gto.lc) gtos
|
|
||||||
| `Expos -> list_map (fun x->
|
|
||||||
list_map (fun (prim,_) -> AO_expo.to_float
|
|
||||||
prim.GaussianPrimitive.expo) x.Gto.lc) gtos
|
|
||||||
end
|
|
||||||
in
|
in
|
||||||
let rec get_n n accu = function
|
let ao_prim_num_max = List.fold_left (fun s x ->
|
||||||
| [] -> List.rev accu
|
if x > s then x
|
||||||
| h::tail ->
|
else s) 0 ao_prim_num
|
||||||
let y =
|
in
|
||||||
begin match List.nth_opt h n with
|
let gtos =
|
||||||
| Some x -> x
|
list_map (fun (_,x,_) -> x) long_basis
|
||||||
| None -> 0.
|
in
|
||||||
|
|
||||||
|
let create_expo_coef ec =
|
||||||
|
let coefs =
|
||||||
|
begin match ec with
|
||||||
|
| `Coefs -> list_map (fun x->
|
||||||
|
list_map (fun (_,coef) ->
|
||||||
|
AO_coef.to_float coef) x.Gto.lc) gtos
|
||||||
|
| `Expos -> list_map (fun x->
|
||||||
|
list_map (fun (prim,_) -> AO_expo.to_float
|
||||||
|
prim.GaussianPrimitive.expo) x.Gto.lc) gtos
|
||||||
end
|
end
|
||||||
in
|
in
|
||||||
get_n n (y::accu) tail
|
let rec get_n n accu = function
|
||||||
|
| [] -> List.rev accu
|
||||||
|
| h::tail ->
|
||||||
|
let y =
|
||||||
|
begin match List.nth_opt 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
|
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
|
let ao_coef = create_expo_coef `Coefs
|
||||||
and ao_expo = create_expo_coef `Expos
|
and ao_expo = create_expo_coef `Expos
|
||||||
in
|
|
||||||
let () =
|
|
||||||
let shell_num = List.length basis in
|
|
||||||
let lc : (GaussianPrimitive.t * Qptypes.AO_coef.t) list list =
|
|
||||||
list_map ( fun (g,_) -> g.Gto.lc ) basis
|
|
||||||
in
|
|
||||||
let ang_mom =
|
|
||||||
list_map (fun (l : (GaussianPrimitive.t * Qptypes.AO_coef.t) list) ->
|
|
||||||
let x, _ = List.hd l in
|
|
||||||
Angmom.to_l x.GaussianPrimitive.sym |> Qptypes.Positive_int.to_int
|
|
||||||
) lc
|
|
||||||
in
|
|
||||||
let expo =
|
|
||||||
list_map (fun l -> list_map (fun (x,_) -> Qptypes.AO_expo.to_float x.GaussianPrimitive.expo) l ) lc
|
|
||||||
|> List.concat
|
|
||||||
in
|
|
||||||
let coef =
|
|
||||||
list_map (fun l ->
|
|
||||||
list_map (fun (_,x) -> Qptypes.AO_coef.to_float x) l
|
|
||||||
) lc
|
|
||||||
|> List.concat
|
|
||||||
in
|
|
||||||
let shell_prim_num =
|
|
||||||
list_map List.length lc
|
|
||||||
in
|
|
||||||
let shell_idx =
|
|
||||||
let rec make_list n accu = function
|
|
||||||
| 0 -> accu
|
|
||||||
| i -> make_list n (n :: accu) (i-1)
|
|
||||||
in
|
in
|
||||||
let rec aux count accu = function
|
let () =
|
||||||
| [] -> List.rev accu
|
let shell_num = List.length basis in
|
||||||
| l::rest ->
|
let lc : (GaussianPrimitive.t * Qptypes.AO_coef.t) list list =
|
||||||
let new_l = make_list count accu (List.length l) in
|
list_map ( fun (g,_) -> g.Gto.lc ) basis
|
||||||
aux (count+1) new_l rest
|
in
|
||||||
in
|
let ang_mom =
|
||||||
aux 1 [] lc
|
list_map (fun (l : (GaussianPrimitive.t * Qptypes.AO_coef.t) list) ->
|
||||||
in
|
let x, _ = List.hd l in
|
||||||
let prim_num = List.length coef in
|
Angmom.to_l x.GaussianPrimitive.sym |> Qptypes.Positive_int.to_int
|
||||||
Ezfio.set_basis_typ "Gaussian";
|
) lc
|
||||||
Ezfio.set_basis_shell_num shell_num;
|
in
|
||||||
Ezfio.set_basis_prim_num prim_num ;
|
let expo =
|
||||||
Ezfio.set_basis_shell_prim_num (Ezfio.ezfio_array_of_list
|
list_map (fun l -> list_map (fun (x,_) -> Qptypes.AO_expo.to_float x.GaussianPrimitive.expo) l ) lc
|
||||||
~rank:1 ~dim:[| shell_num |] ~data:shell_prim_num);
|
|> List.concat
|
||||||
Ezfio.set_basis_shell_ang_mom (Ezfio.ezfio_array_of_list
|
in
|
||||||
~rank:1 ~dim:[| shell_num |] ~data:ang_mom ) ;
|
let coef =
|
||||||
Ezfio.set_basis_shell_index (Ezfio.ezfio_array_of_list
|
list_map (fun l ->
|
||||||
~rank:1 ~dim:[| prim_num |] ~data:shell_idx) ;
|
list_map (fun (_,x) -> Qptypes.AO_coef.to_float x) l
|
||||||
Ezfio.set_basis_basis_nucleus_index (Ezfio.ezfio_array_of_list
|
) lc
|
||||||
~rank:1 ~dim:[| shell_num |]
|
|> List.concat
|
||||||
~data:( list_map (fun (_,n) -> Nucl_number.to_int n) basis)
|
in
|
||||||
) ;
|
let shell_prim_num =
|
||||||
Ezfio.set_basis_nucleus_shell_num(Ezfio.ezfio_array_of_list
|
list_map List.length lc
|
||||||
~rank:1 ~dim:[| nucl_num |]
|
in
|
||||||
~data:(
|
let shell_idx =
|
||||||
list_map (fun (_,n) -> Nucl_number.to_int n) basis
|
let rec make_list n accu = function
|
||||||
|> List.fold_left (fun accu i ->
|
| 0 -> accu
|
||||||
match accu with
|
| i -> make_list n (n :: accu) (i-1)
|
||||||
| [] -> [(1,i)]
|
in
|
||||||
| (h,j) :: rest -> if j == i then ((h+1,j)::rest) else ((1,i)::(h,j)::rest)
|
let rec aux count accu = function
|
||||||
) []
|
| [] -> List.rev accu
|
||||||
|> List.rev
|
| l::rest ->
|
||||||
|> List.map fst
|
let new_l = make_list count accu (List.length l) in
|
||||||
)) ;
|
aux (count+1) new_l rest
|
||||||
Ezfio.set_basis_prim_coef (Ezfio.ezfio_array_of_list
|
in
|
||||||
~rank:1 ~dim:[| prim_num |] ~data:coef) ;
|
aux 1 [] lc
|
||||||
Ezfio.set_basis_prim_expo (Ezfio.ezfio_array_of_list
|
in
|
||||||
~rank:1 ~dim:[| prim_num |] ~data:expo) ;
|
let prim_num = List.length coef in
|
||||||
|
Ezfio.set_basis_typ "Gaussian";
|
||||||
|
Ezfio.set_basis_shell_num shell_num;
|
||||||
|
Ezfio.set_basis_prim_num prim_num ;
|
||||||
|
Ezfio.set_basis_shell_prim_num (Ezfio.ezfio_array_of_list
|
||||||
|
~rank:1 ~dim:[| shell_num |] ~data:shell_prim_num);
|
||||||
|
Ezfio.set_basis_shell_ang_mom (Ezfio.ezfio_array_of_list
|
||||||
|
~rank:1 ~dim:[| shell_num |] ~data:ang_mom ) ;
|
||||||
|
Ezfio.set_basis_shell_index (Ezfio.ezfio_array_of_list
|
||||||
|
~rank:1 ~dim:[| prim_num |] ~data:shell_idx) ;
|
||||||
|
Ezfio.set_basis_basis_nucleus_index (Ezfio.ezfio_array_of_list
|
||||||
|
~rank:1 ~dim:[| shell_num |]
|
||||||
|
~data:( list_map (fun (_,n) -> Nucl_number.to_int n) basis)
|
||||||
|
) ;
|
||||||
|
Ezfio.set_basis_nucleus_shell_num(Ezfio.ezfio_array_of_list
|
||||||
|
~rank:1 ~dim:[| nucl_num |]
|
||||||
|
~data:(
|
||||||
|
list_map (fun (_,n) -> Nucl_number.to_int n) basis
|
||||||
|
|> List.fold_left (fun accu i ->
|
||||||
|
match accu with
|
||||||
|
| [] -> [(1,i)]
|
||||||
|
| (h,j) :: rest -> if j == i then ((h+1,j)::rest) else ((1,i)::(h,j)::rest)
|
||||||
|
) []
|
||||||
|
|> List.rev
|
||||||
|
|> List.map fst
|
||||||
|
)) ;
|
||||||
|
Ezfio.set_basis_prim_coef (Ezfio.ezfio_array_of_list
|
||||||
|
~rank:1 ~dim:[| prim_num |] ~data:coef) ;
|
||||||
|
Ezfio.set_basis_prim_expo (Ezfio.ezfio_array_of_list
|
||||||
|
~rank:1 ~dim:[| prim_num |] ~data:expo) ;
|
||||||
|
|
||||||
|
|
||||||
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
|
Ezfio.set_ao_basis_ao_power(Ezfio.ezfio_array_of_list
|
||||||
~rank:2 ~dim:[| ao_num ; 3 |] ~data:ao_power) ;
|
~rank:2 ~dim:[| ao_num ; 3 |] ~data:ao_power) ;
|
||||||
Ezfio.set_ao_basis_ao_coef(Ezfio.ezfio_array_of_list
|
Ezfio.set_ao_basis_ao_coef(Ezfio.ezfio_array_of_list
|
||||||
~rank:2 ~dim:[| ao_num ; ao_prim_num_max |] ~data:ao_coef) ;
|
~rank:2 ~dim:[| ao_num ; ao_prim_num_max |] ~data:ao_coef) ;
|
||||||
Ezfio.set_ao_basis_ao_expo(Ezfio.ezfio_array_of_list
|
Ezfio.set_ao_basis_ao_expo(Ezfio.ezfio_array_of_list
|
||||||
~rank:2 ~dim:[| ao_num ; ao_prim_num_max |] ~data:ao_expo) ;
|
~rank:2 ~dim:[| ao_num ; ao_prim_num_max |] ~data:ao_expo) ;
|
||||||
Ezfio.set_ao_basis_ao_cartesian(cart);
|
Ezfio.set_ao_basis_ao_cartesian(cart);
|
||||||
in
|
in
|
||||||
match Input.Ao_basis.read () with
|
match Input.Ao_basis.read () with
|
||||||
| None -> failwith "Error in basis"
|
| None -> failwith "Error in basis"
|
||||||
| Some x -> Input.Ao_basis.write x
|
| Some x -> Input.Ao_basis.write x
|
||||||
|
end
|
||||||
in
|
in
|
||||||
let () =
|
let () =
|
||||||
try write_file () with
|
try write_file () with
|
||||||
@ -781,7 +785,7 @@ If a file with the same name as the basis set exists, this file will be read. O
|
|||||||
run ?o:output basis au charge dummy multiplicity pseudo cart xyz_filename
|
run ?o:output basis au charge dummy multiplicity pseudo cart xyz_filename
|
||||||
)
|
)
|
||||||
with
|
with
|
||||||
| Failure txt -> Printf.eprintf "Fatal error: %s\n%!" txt
|
(* | Failure txt -> Printf.eprintf "Fatal error: %s\n%!" txt *)
|
||||||
| Command_line.Error txt -> Printf.eprintf "Command line error: %s\n%!" txt
|
| Command_line.Error txt -> Printf.eprintf "Command line error: %s\n%!" txt
|
||||||
|
|
||||||
|
|
||||||
|
@ -172,25 +172,23 @@ let run check_only ?ndet ?state ezfio_filename =
|
|||||||
|
|
||||||
(* Reorder basis set *)
|
(* Reorder basis set *)
|
||||||
begin
|
begin
|
||||||
let aos =
|
match Input.Ao_basis.read() with
|
||||||
match Input.Ao_basis.read() with
|
| Some aos ->
|
||||||
| Some x -> x
|
let ordering = Input.Ao_basis.ordering aos in
|
||||||
| _ -> assert false
|
let test = Array.copy ordering in
|
||||||
in
|
Array.sort compare test ;
|
||||||
let ordering = Input.Ao_basis.ordering aos in
|
if test <> ordering then
|
||||||
let test = Array.copy ordering in
|
begin
|
||||||
Array.sort compare test ;
|
Printf.eprintf "Warning: Basis set is not properly ordered. Redordering.\n";
|
||||||
if test <> ordering then
|
let new_aos = Input.Ao_basis.reorder aos in
|
||||||
begin
|
Input.Ao_basis.write new_aos;
|
||||||
Printf.eprintf "Warning: Basis set is not properly ordered. Redordering.\n";
|
match Input.Mo_basis.read() with
|
||||||
let new_aos = Input.Ao_basis.reorder aos in
|
| None -> ()
|
||||||
Input.Ao_basis.write new_aos;
|
| Some mos ->
|
||||||
match Input.Mo_basis.read() with
|
let new_mos = Input.Mo_basis.reorder mos ordering in
|
||||||
| None -> ()
|
Input.Mo_basis.write new_mos
|
||||||
| Some mos ->
|
end
|
||||||
let new_mos = Input.Mo_basis.reorder mos ordering in
|
| _ -> ()
|
||||||
Input.Mo_basis.write new_mos
|
|
||||||
end
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -22,4 +22,4 @@ ezfio_name: direct
|
|||||||
type: logical
|
type: logical
|
||||||
doc: Perform Cholesky decomposition of AO integrals
|
doc: Perform Cholesky decomposition of AO integrals
|
||||||
interface: ezfio,provider,ocaml
|
interface: ezfio,provider,ocaml
|
||||||
default: True
|
default: False
|
||||||
|
@ -3,7 +3,6 @@ subroutine save_mos
|
|||||||
double precision, allocatable :: buffer(:,:)
|
double precision, allocatable :: buffer(:,:)
|
||||||
integer :: i,j
|
integer :: i,j
|
||||||
|
|
||||||
call system('$QP_ROOT/scripts/save_current_mos.sh '//trim(ezfio_filename))
|
|
||||||
call ezfio_set_mo_basis_mo_num(mo_num)
|
call ezfio_set_mo_basis_mo_num(mo_num)
|
||||||
call ezfio_set_mo_basis_mo_label(mo_label)
|
call ezfio_set_mo_basis_mo_label(mo_label)
|
||||||
call ezfio_set_mo_basis_ao_md5(ao_md5)
|
call ezfio_set_mo_basis_ao_md5(ao_md5)
|
||||||
@ -27,7 +26,7 @@ subroutine save_mos_no_occ
|
|||||||
double precision, allocatable :: buffer(:,:)
|
double precision, allocatable :: buffer(:,:)
|
||||||
integer :: i,j
|
integer :: i,j
|
||||||
|
|
||||||
call system('$QP_ROOT/scripts/save_current_mos.sh '//trim(ezfio_filename))
|
! call system('$QP_ROOT/scripts/save_current_mos.sh '//trim(ezfio_filename))
|
||||||
!call ezfio_set_mo_basis_mo_num(mo_num)
|
!call ezfio_set_mo_basis_mo_num(mo_num)
|
||||||
!call ezfio_set_mo_basis_mo_label(mo_label)
|
!call ezfio_set_mo_basis_mo_label(mo_label)
|
||||||
!call ezfio_set_mo_basis_ao_md5(ao_md5)
|
!call ezfio_set_mo_basis_ao_md5(ao_md5)
|
||||||
@ -48,7 +47,7 @@ subroutine save_mos_truncated(n)
|
|||||||
double precision, allocatable :: buffer(:,:)
|
double precision, allocatable :: buffer(:,:)
|
||||||
integer :: i,j,n
|
integer :: i,j,n
|
||||||
|
|
||||||
call system('$QP_ROOT/scripts/save_current_mos.sh '//trim(ezfio_filename))
|
! call system('$QP_ROOT/scripts/save_current_mos.sh '//trim(ezfio_filename))
|
||||||
|
|
||||||
call ezfio_set_mo_basis_mo_num(n)
|
call ezfio_set_mo_basis_mo_num(n)
|
||||||
call ezfio_set_mo_basis_mo_label(mo_label)
|
call ezfio_set_mo_basis_mo_label(mo_label)
|
||||||
|
Loading…
Reference in New Issue
Block a user