mirror of
https://gitlab.com/scemama/qmcchem.git
synced 2024-11-18 12:03:39 +01:00
150 lines
3.6 KiB
OCaml
150 lines
3.6 KiB
OCaml
open Core
|
|
|
|
(** Directory containing the list of input files. The directory is created is inexistant. *)
|
|
let input_directory = lazy (
|
|
|
|
let ezfio_filename =
|
|
Lazy.force Qputils.ezfio_filename
|
|
in
|
|
|
|
let dirname =
|
|
Filename.concat ezfio_filename "input"
|
|
in
|
|
|
|
begin
|
|
match ( Sys.is_directory dirname ) with
|
|
| `No -> Unix.mkdir dirname
|
|
| _ -> ()
|
|
end ;
|
|
|
|
dirname
|
|
)
|
|
|
|
|
|
(** List of files responsible for the MD5 key of the input *)
|
|
let files_to_track = [
|
|
"ao_basis/ao_coef.gz" ;
|
|
"ao_basis/ao_expo.gz" ;
|
|
"ao_basis/ao_nucl.gz" ;
|
|
"ao_basis/ao_num" ;
|
|
"ao_basis/ao_power.gz" ;
|
|
"ao_basis/ao_prim_num.gz" ;
|
|
"electrons/elec_alpha_num" ;
|
|
"electrons/elec_beta_num" ;
|
|
"electrons/elec_walk_num" ;
|
|
"jastrow/jast_type" ;
|
|
"mo_basis/mo_coef.gz" ;
|
|
"mo_basis/mo_tot_num" ;
|
|
"nuclei/nucl_charge.gz" ;
|
|
"nuclei/nucl_coord.gz" ;
|
|
"nuclei/nucl_num" ;
|
|
"simulation/ci_threshold" ;
|
|
"simulation/nucl_fitcusp_factor" ;
|
|
"simulation/jast_a_up_dn" ;
|
|
"simulation/jast_a_up_up" ;
|
|
"simulation/jast_b_up_dn" ;
|
|
"simulation/jast_b_up_up" ;
|
|
"simulation/jast_core_a1" ;
|
|
"simulation/jast_core_a2" ;
|
|
"simulation/jast_core_b1" ;
|
|
"simulation/jast_core_b2" ;
|
|
"simulation/jast_een_e_a.gz" ;
|
|
"simulation/jast_een_e_b.gz" ;
|
|
"simulation/jast_een_n.gz" ;
|
|
"simulation/jast_pen.gz" ;
|
|
"simulation/method" ;
|
|
"simulation/time_step" ;
|
|
"simulation/dmc_projection_time" ;
|
|
"spindeterminants/bit_kind" ;
|
|
"spindeterminants/n_det" ;
|
|
"spindeterminants/n_det_alpha" ;
|
|
"spindeterminants/n_det_beta" ;
|
|
"spindeterminants/n_int" ;
|
|
"spindeterminants/n_states" ;
|
|
"spindeterminants/psi_coef_matrix_columns.gz" ;
|
|
"spindeterminants/psi_coef_matrix_rows.gz" ;
|
|
"spindeterminants/psi_coef_matrix_values.gz" ;
|
|
"spindeterminants/psi_det_alpha.gz" ;
|
|
"spindeterminants/psi_det_beta.gz" ;
|
|
"/pseudo/do_pseudo" ;
|
|
"/pseudo/mo_pseudo_grid.gz" ;
|
|
"/pseudo/pseudo_dz_kl.gz";
|
|
"/pseudo/pseudo_klocmax" ;
|
|
"/pseudo/pseudo_n_k.gz" ;
|
|
"/pseudo/pseudo_v_kl.gz" ;
|
|
"/pseudo/pseudo_grid_rmax" ;
|
|
"/pseudo/pseudo_kmax" ;
|
|
"/pseudo/pseudo_n_kl.gz" ;
|
|
"/pseudo/pseudo_dz_k.gz" ;
|
|
"/pseudo/pseudo_grid_size" ;
|
|
"/pseudo/pseudo_v_k.gz" ;
|
|
]
|
|
|
|
|
|
(** Get an MD5 ke from the content of a file. *)
|
|
let hash_file filename =
|
|
match Sys.is_file filename with
|
|
| `Yes ->
|
|
begin
|
|
In_channel.with_file filename ~f:(fun ic ->
|
|
Cryptokit.hash_channel (Cryptokit.Hash.md5 ()) ic
|
|
|> Cryptokit.transform_string (Cryptokit.Hexa.encode ()) )
|
|
end
|
|
| _ -> ""
|
|
|
|
|
|
(** Cache containing the current value of the MD5 hash. *)
|
|
let _hash =
|
|
ref None
|
|
|
|
(** Get the hash correcponding to the EZFIO file. *)
|
|
let hash () =
|
|
let compute_hash () =
|
|
let ezfio_filename =
|
|
Lazy.force Qputils.ezfio_filename
|
|
in
|
|
let old_md5 =
|
|
if Ezfio.has_simulation_md5_key () then
|
|
Ezfio.get_simulation_md5_key ()
|
|
else
|
|
""
|
|
in
|
|
let md5_string =
|
|
files_to_track
|
|
|> List.map ~f:(fun x -> Printf.sprintf "%s/%s" ezfio_filename x)
|
|
|> List.map ~f:hash_file
|
|
|> String.concat
|
|
in
|
|
|
|
let new_md5 =
|
|
md5_string
|
|
|> Cryptokit.hash_string (Cryptokit.Hash.md5 ())
|
|
|> Cryptokit.transform_string (Cryptokit.Hexa.encode ())
|
|
in
|
|
if (new_md5 <> old_md5) then
|
|
begin
|
|
Printf.eprintf "Info : MD5 key changed\n %s\n-> %s\n%!" old_md5 new_md5 ;
|
|
Ezfio.set_simulation_md5_key new_md5
|
|
end
|
|
;
|
|
new_md5
|
|
in
|
|
match (!_hash) with
|
|
| Some key -> key
|
|
| None ->
|
|
begin
|
|
let key =
|
|
compute_hash ()
|
|
in
|
|
_hash := Some key ;
|
|
key
|
|
end
|
|
|
|
(** Reset the cache of the MD5 hash. *)
|
|
let reset_hash () =
|
|
_hash := None;
|
|
ignore (hash ())
|
|
|
|
|
|
|