mirror of
https://github.com/LCPQ/quantum_package
synced 2024-12-25 22:03:51 +01:00
177 lines
4.1 KiB
OCaml
177 lines
4.1 KiB
OCaml
|
open Core
|
||
|
open Qptypes
|
||
|
|
||
|
let get_data () =
|
||
|
let mos =
|
||
|
Input.Mo_basis.read ()
|
||
|
in
|
||
|
let molecule =
|
||
|
let e =
|
||
|
match Input.Electrons.read () with
|
||
|
| Some x -> x
|
||
|
| None -> failwith "No electrons"
|
||
|
in
|
||
|
{ Molecule.nuclei =
|
||
|
begin
|
||
|
match Input.Nuclei_by_hand.read () with
|
||
|
| None -> failwith "No nuclei"
|
||
|
| Some l -> Input.Nuclei_by_hand.to_atom_list l
|
||
|
end ;
|
||
|
Molecule.elec_alpha = e.Input.Electrons.elec_alpha_num ;
|
||
|
Molecule.elec_beta = e.Input.Electrons.elec_beta_num ;
|
||
|
}
|
||
|
in
|
||
|
let charge =
|
||
|
Molecule.get_charge molecule
|
||
|
|> Charge.to_int
|
||
|
and mult =
|
||
|
Molecule.get_multiplicity molecule
|
||
|
|> Multiplicity.to_int
|
||
|
in
|
||
|
let hf =
|
||
|
if mult = 0 then "RHF" else "ROHF"
|
||
|
in
|
||
|
let guess =
|
||
|
if mos = None then `Huckel else `Read
|
||
|
in
|
||
|
(mos, molecule, charge, mult, hf, guess)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
let run_g09 () =
|
||
|
let (mos, molecule, charge, mult, hf, guess) =
|
||
|
get_data ()
|
||
|
in
|
||
|
let guess =
|
||
|
match guess with
|
||
|
| `Read -> "cards"
|
||
|
| `Huckel -> "huckel"
|
||
|
in
|
||
|
let result = [
|
||
|
Printf.sprintf "# %s/Gen guess=%s" hf guess;
|
||
|
"" ;
|
||
|
Molecule.name molecule ;
|
||
|
"" ;
|
||
|
Printf.sprintf "%d %d" charge mult ;
|
||
|
Printf.sprintf "%s" (
|
||
|
match String.split ~on:'\n' @@ Molecule.to_xyz molecule with
|
||
|
| _ :: _ :: rest -> String.concat ~sep:"\n" rest
|
||
|
| _ -> assert false
|
||
|
);
|
||
|
"";
|
||
|
begin
|
||
|
match Input.Ao_basis.read () with
|
||
|
| Some x -> Input.Ao_basis.to_basis x
|
||
|
| None -> failwith "No basis"
|
||
|
end
|
||
|
|> Basis.to_string ~fmt:Gto.Gaussian ~ele_array:(List.map ~f:(fun x -> x.Atom.element)
|
||
|
molecule.Molecule.nuclei |> Array.of_list) ;
|
||
|
"";
|
||
|
begin
|
||
|
match mos with
|
||
|
| None -> ""
|
||
|
| Some mos' ->
|
||
|
begin
|
||
|
Printf.sprintf "(E20.12)\n%s\n 0"
|
||
|
(
|
||
|
Array.map mos'.Input.Mo_basis.mo_coef ~f:(fun x ->
|
||
|
Array.map x ~f:(fun y -> Printf.sprintf "%20.12E" (MO_coef.to_float y))
|
||
|
|> Array.to_list
|
||
|
|> String.concat ~sep:"\n")
|
||
|
|> Array.mapi ~f:(fun i -> Printf.sprintf "%5d\n%s" (i+1))
|
||
|
|> Array.to_list
|
||
|
|> String.concat ~sep:"\n"
|
||
|
)
|
||
|
end
|
||
|
end;
|
||
|
"" ; "" ;
|
||
|
"" ; "" ;
|
||
|
]
|
||
|
in
|
||
|
List.iter ~f:(fun x -> print_endline x) result
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
let run_gamess () =
|
||
|
failwith "Not yet implemented"
|
||
|
(* TODO
|
||
|
let (mos, molecule, charge, mult, hf, guess) =
|
||
|
get_data ()
|
||
|
in
|
||
|
let guess =
|
||
|
match guess with
|
||
|
| `Read -> "MOREAD"
|
||
|
| `Huckel -> "HUCKEL"
|
||
|
in
|
||
|
and coord =
|
||
|
Printf.sprintf "%s" (
|
||
|
match String.split ~on:'\n' @@ Molecule.to_xyz molecule with
|
||
|
| _ :: _ :: rest -> String.concat ~sep:"\n" rest
|
||
|
| _ -> assert false
|
||
|
);
|
||
|
and basis =
|
||
|
begin
|
||
|
match !read_data.basis with
|
||
|
| None |> failwith "No basis set defined in command line"
|
||
|
| Some b |> b
|
||
|
end
|
||
|
and typ = !read_data.typ
|
||
|
and vecfile =
|
||
|
begin
|
||
|
match !read_data.filename with
|
||
|
| None |> ""
|
||
|
| Some filename |> filename
|
||
|
end
|
||
|
and nstate = !read_data.nstate
|
||
|
and guess = !read_data.guess
|
||
|
in
|
||
|
|
||
|
let system =
|
||
|
Gamess.{ mult ; charge ; basis ; coord }
|
||
|
in
|
||
|
Gamess.create_input ~vecfile ~system ~guess ~nstate typ
|
||
|
|> print_endline
|
||
|
*)
|
||
|
|
||
|
|
||
|
let spec =
|
||
|
let open Command.Spec in
|
||
|
empty
|
||
|
+> flag "-gamess" no_arg ~doc:"GAMESS(US) input"
|
||
|
+> flag "-g09" no_arg ~doc:"Gaussian 09 input"
|
||
|
+> anon ("ezfio_file" %: string)
|
||
|
|
||
|
let command =
|
||
|
Command.basic_spec
|
||
|
~summary: "Quantum Package command"
|
||
|
~readme:(fun () ->
|
||
|
"
|
||
|
Exports the computed data for other programs.
|
||
|
")
|
||
|
spec
|
||
|
(fun gamess g09 ezfio_file () ->
|
||
|
let count_flags l =
|
||
|
List.fold_left ~f:(fun a x ->
|
||
|
if x then a+1 else a) ~init:0 l
|
||
|
in
|
||
|
let () =
|
||
|
match count_flags [ g09 ; gamess ] with
|
||
|
| 0 -> raise (Invalid_argument "No file format specified")
|
||
|
| 1 -> ()
|
||
|
| _ -> raise (Invalid_argument "Too many file formats specified")
|
||
|
in
|
||
|
Ezfio.set_file ezfio_file;
|
||
|
if g09 then
|
||
|
run_g09 ()
|
||
|
else if gamess then
|
||
|
run_gamess ()
|
||
|
)
|
||
|
|
||
|
|
||
|
let () =
|
||
|
Command.run command;
|
||
|
exit 0
|
||
|
|