mirror of
https://github.com/LCPQ/quantum_package
synced 2025-01-03 10:05:57 +01:00
Added ocaml qp_run
This commit is contained in:
parent
c1d8e6d29a
commit
12d6f6a568
@ -1,6 +1,9 @@
|
||||
all: inputs
|
||||
all: inputs executables
|
||||
|
||||
FORCE:
|
||||
.PHONY: inputs executables
|
||||
|
||||
inputs: FORCE
|
||||
inputs:
|
||||
cd inputs ; $(MAKE) all_ezfio
|
||||
|
||||
executables:
|
||||
$(MAKE) -C $(QPACKAGE_ROOT)/src executables && mv $(QPACKAGE_ROOT)/src/executables .
|
||||
|
@ -8,6 +8,7 @@ These include:
|
||||
|
||||
* Input data for the test suites
|
||||
* Atomic basis sets
|
||||
* List of built executables
|
||||
|
||||
*Important*: EZFIO files are large and should not be tracked by git.
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
open Core.Std;;
|
||||
open Qptypes;;
|
||||
open Qputils;;
|
||||
|
||||
(** Variables related to the quantum package installation *)
|
||||
|
||||
@ -11,7 +12,7 @@ Please source the quantum_package.rc file."
|
||||
;;
|
||||
|
||||
let bit_kind_size = lazy (
|
||||
let filename = root^"/src/Bitmask/bitmasks_module.f90" in
|
||||
let filename = root / "src/Bitmask/bitmasks_module.f90" in
|
||||
if not (Sys.file_exists_exn filename) then
|
||||
raise (Failure ("File "^filename^" not found"));
|
||||
|
||||
@ -39,3 +40,26 @@ let bit_kind_size = lazy (
|
||||
in
|
||||
get_data lines )
|
||||
;;
|
||||
|
||||
let executables = lazy (
|
||||
let filename = root / "data/executables"
|
||||
and func in_channel =
|
||||
In_channel.input_lines in_channel
|
||||
|> List.map ~f:(fun x ->
|
||||
let e = String.split ~on:' ' x
|
||||
|> List.map ~f:String.strip
|
||||
|> List.filter ~f:(fun x -> x <> "")
|
||||
in
|
||||
match e with
|
||||
| [a;b] -> (a,String.substr_replace_all ~pattern:"$QPACKAGE_ROOT" ~with_:root b)
|
||||
| _ -> ("","")
|
||||
)
|
||||
in
|
||||
In_channel.with_file filename ~f:func
|
||||
|> List.sort ~cmp:(fun (x,_) (y,_) ->
|
||||
if x < y then -1
|
||||
else if x > y then 1
|
||||
else 0)
|
||||
)
|
||||
|
||||
|
||||
|
92
ocaml/qp_run.ml
Normal file
92
ocaml/qp_run.ml
Normal file
@ -0,0 +1,92 @@
|
||||
open Core.Std;;
|
||||
open Qputils;;
|
||||
|
||||
let print_list () =
|
||||
Lazy.force Qpackage.executables
|
||||
|> List.iter ~f:(fun (x,_) -> Printf.printf " * %s\n" x)
|
||||
;;
|
||||
|
||||
let run exe ezfio_file =
|
||||
|
||||
let time_start = Time.now() in
|
||||
|
||||
if (not (Sys.file_exists_exn ezfio_file)) then
|
||||
failwith ("EZFIO directory "^ezfio_file^" not found");
|
||||
|
||||
let executables = Lazy.force Qpackage.executables in
|
||||
if (not (List.exists ~f:(fun (x,_) -> x = exe) executables)) then
|
||||
failwith ("Executable "^exe^" not found");
|
||||
|
||||
Printf.printf "===============\nQuantum Package\n===============\n\n";
|
||||
Printf.printf "Date : %s\n\n%!" (Time.to_string time_start);
|
||||
|
||||
let output_dir = ezfio_file / "output" in
|
||||
if (Sys.file_exists_exn output_dir) then
|
||||
begin
|
||||
Sys.ls_dir output_dir
|
||||
|> List.iter ~f:(fun x -> Sys.remove (output_dir / x));
|
||||
Unix.rmdir output_dir
|
||||
end;
|
||||
|
||||
let fifo_name = ezfio_file / ".fifo" in
|
||||
if (Sys.file_exists_exn fifo_name) then
|
||||
Sys.remove fifo_name;
|
||||
Unix.mkfifo ~perm:0o664 fifo_name;
|
||||
let script = Printf.sprintf "%s/scripts/follow_output.py %s &
|
||||
echo $! > %s &" Qpackage.root ezfio_file fifo_name in
|
||||
ignore (Sys.command script);
|
||||
|
||||
let pid =
|
||||
In_channel.with_file fifo_name ~f:(fun in_channel ->
|
||||
In_channel.input_all in_channel |> String.strip )
|
||||
|> Int.of_string
|
||||
|> Pid.of_int
|
||||
in
|
||||
Sys.remove fifo_name;
|
||||
|
||||
let exe =
|
||||
match (List.find ~f:(fun (x,_) -> x = exe) executables) with
|
||||
| None -> assert false
|
||||
| Some (_,x) -> x
|
||||
in
|
||||
match (Sys.command (exe^" "^ezfio_file)) with
|
||||
| 0 -> ()
|
||||
| i -> Printf.printf "Program exited with code %d.\n%!" i;
|
||||
;
|
||||
|
||||
Signal.send_exn (Signal.of_system_int 2) (`Pid pid);
|
||||
|
||||
|
||||
|
||||
(* Run the executable in the foreground
|
||||
* ==================================== *)
|
||||
|
||||
let duration = Time.diff (Time.now()) time_start
|
||||
|> Core.Span.to_string in
|
||||
Printf.printf "Wall time : %s\n\n" duration;
|
||||
;;
|
||||
|
||||
let spec =
|
||||
let open Command.Spec in
|
||||
empty
|
||||
+> anon ("exectuable" %: string)
|
||||
+> anon ("ezfio_file" %: string)
|
||||
;;
|
||||
|
||||
let () =
|
||||
Command.basic
|
||||
~summary: "Quantum Package command"
|
||||
~readme:( fun () -> "
|
||||
Executes a Quantum Package binary file among these:\ni\n"
|
||||
^ (Lazy.force Qpackage.executables
|
||||
|> List.map ~f:(fun (x,_) -> Printf.sprintf " * %s" x )
|
||||
|> String.concat ~sep:"\n"
|
||||
)
|
||||
)
|
||||
spec
|
||||
(fun exe ezfio_file () ->
|
||||
run exe ezfio_file
|
||||
)
|
||||
|> Command.run
|
||||
;;
|
||||
|
@ -54,7 +54,10 @@ def main():
|
||||
# Handle signals
|
||||
import signal
|
||||
def handler(signum,frame):
|
||||
if F.running:
|
||||
F.running = False
|
||||
else:
|
||||
sys.exit(0)
|
||||
|
||||
for i in [2, 15]:
|
||||
try:
|
||||
|
@ -5,6 +5,8 @@ OBJ=
|
||||
|
||||
include $(QPACKAGE_ROOT)/src/Makefile.common
|
||||
|
||||
.PHONY: executables
|
||||
|
||||
all: all_modules
|
||||
|
||||
all_clean:
|
||||
@ -15,3 +17,9 @@ all_modules: $(NEEDED_MODULES)
|
||||
$(NEEDED_MODULES): FORCE
|
||||
@cd $@ ; unset NEEDED_MODULES INCLUDE_DIRS ; make
|
||||
|
||||
executables:
|
||||
rm -f executables ; \
|
||||
for EXE in $$(find $(QPACKAGE_ROOT)/src -type f -executable | grep -e "$(QPACKAGE_ROOT)/src/[^/]*/[^/]*$$" ) ; \
|
||||
do printf "%-30s %s\n" $$(basename $$EXE) $$EXE | sed "s|$(QPACKAGE_ROOT)|\$$QPACKAGE_ROOT|g" >> executables ;\
|
||||
done
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user