From ea1a4523c1dfe1043a957a4ef99bc493744549df Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 30 Oct 2014 12:08:18 +0100 Subject: [PATCH] Added ~mo_tot_num in MO_number.of_int --- ocaml/Bitlist.ml | 3 +- ocaml/Input_determinants.ml | 11 +++--- ocaml/qptypes_generator.ml | 64 +++++++++++++++++++--------------- src/MOGuess/H_CORE_guess.irp.f | 2 +- 4 files changed, 45 insertions(+), 35 deletions(-) diff --git a/ocaml/Bitlist.ml b/ocaml/Bitlist.ml index f5f08285..3e69487e 100644 --- a/ocaml/Bitlist.ml +++ b/ocaml/Bitlist.ml @@ -106,13 +106,14 @@ let of_mo_number_list n_int l = let to_mo_number_list l = let a = Array.of_list l in + let mo_tot_num = MO_number.get_mo_tot_num () in let rec do_work accu = function | 0 -> accu | i -> begin let new_accu = match a.(i-1) with - | Bit.One -> (MO_number.of_int i)::accu + | Bit.One -> (MO_number.of_int ~mo_tot_num:mo_tot_num i)::accu | Bit.Zero -> accu in do_work new_accu (i-1) diff --git a/ocaml/Input_determinants.ml b/ocaml/Input_determinants.ml index ec4b380c..2f55527e 100644 --- a/ocaml/Input_determinants.ml +++ b/ocaml/Input_determinants.ml @@ -177,9 +177,10 @@ end = struct let n_int = read_n_int () in if not (Ezfio.has_determinants_psi_det ()) then begin + let mo_tot_num = MO_number.get_mo_tot_num () in let rec build_data accu = function | 0 -> accu - | n -> build_data ((MO_number.of_int n)::accu) (n-1) + | n -> build_data ((MO_number.of_int ~mo_tot_num:mo_tot_num n)::accu) (n-1) in let det_a = build_data [] (Ezfio.get_electrons_elec_alpha_num ()) |> Bitlist.of_mo_number_list n_int @@ -246,8 +247,8 @@ end = struct ;; let to_rst b = - let mo_tot_num = Ezfio.get_mo_basis_mo_tot_num () - |> MO_number.of_int in + let mo_tot_num = Ezfio.get_mo_basis_mo_tot_num () in + let mo_tot_num = MO_number.of_int mo_tot_num ~mo_tot_num:mo_tot_num in let det_text = List.map2_exn ~f:(fun coef det -> Printf.sprintf " %f\n%s\n" @@ -313,8 +314,8 @@ Determinants :: ;; let to_string b = - let mo_tot_num = Ezfio.get_mo_basis_mo_tot_num () - |> MO_number.of_int in + let mo_tot_num = Ezfio.get_mo_basis_mo_tot_num () in + let mo_tot_num = MO_number.of_int mo_tot_num ~mo_tot_num:mo_tot_num in Printf.sprintf " n_int = %s bit_kind = %s diff --git a/ocaml/qptypes_generator.ml b/ocaml/qptypes_generator.ml index 2633bdcc..ffab3bf2 100644 --- a/ocaml/qptypes_generator.ml +++ b/ocaml/qptypes_generator.ml @@ -36,12 +36,6 @@ let input_data = " * Non_empty_string : string assert (x <> \"\") ; -* MO_number : int - assert (x > 0) ; - if (x > 1000) then - warning \"More than 1000 MOs\"; - if (Ezfio.has_mo_basis_mo_tot_num ()) then - assert (x <= (Ezfio.get_mo_basis_mo_tot_num ())); * AO_number : int assert (x > 0) ; @@ -138,27 +132,36 @@ let input_data = " ;; let untouched = " -(* -module Determinant : sig +module MO_number : sig type t with sexp - val to_int64_array : t -> int64 array - val of_int64_array : int64 array -> t + val to_int : t -> int + val get_mo_tot_num : unit -> int + val of_int : ?mo_tot_num:int -> int -> t val to_string : t -> string end = struct - type t = int64 array with sexp - let to_int64_array x = x - let of_int64_array x = - if (Ezfio.has_determinants_n_int ()) then - begin - let n_int = Ezfio.get_determinants_n_int () in - assert ((Array.length x) = n_int*2) - end - ; x - let to_string x = Array.to_list x - |> List.map ~f:Int64.to_string - |> String.concat ~sep:\", \" + type t = int with sexp + let get_mo_tot_num () = + if (Ezfio.has_mo_basis_mo_tot_num ()) then + Ezfio.get_mo_basis_mo_tot_num () + else + 0 + let to_int x = x + let of_int ?mo_tot_num x = ( assert (x > 0) ; + if (x > 1000) then + warning \"More than 1000 MOs\"; + let mo_tot_num = match mo_tot_num with + | Some i -> i + | None -> get_mo_tot_num () + in + begin + match mo_tot_num with + | 0 -> () + | i -> assert ( x <= i ) + end + ; x ) + + let to_string x = Int.to_string x end -*) " @@ -166,12 +169,12 @@ let template = format_of_string " module %s : sig type t with sexp val to_%s : t -> %s - val of_%s : %s -> t + val of_%s : %s %s -> t val to_string : t -> string end = struct type t = %s with sexp let to_%s x = x - let of_%s x = ( %s x ) + let of_%s %s x = ( %s x ) let to_string x = %s.to_string x end @@ -184,13 +187,18 @@ let parse_input input= | [] -> result | ( "" , "" )::tail -> parse result tail | ( t , text )::tail -> - let name , typ = String.lsplit2_exn ~on:':' t + let name,typ,params,params_val = + match String.split ~on:':' t with + | [name;typ] -> (name,typ,"","") + | name::typ::params::params_val -> (name,typ,params, + (String.concat params_val ~sep:":") ) + | _ -> assert false in let typ = String.strip typ and name = String.strip name in let typ_cap = String.capitalize typ in - let newstring = Printf.sprintf template name typ typ typ typ typ typ typ - ( String.strip text ) typ_cap + let newstring = Printf.sprintf template name typ typ typ params_val typ typ + typ typ params ( String.strip text ) typ_cap in List.rev (parse (newstring::result) tail ) in diff --git a/src/MOGuess/H_CORE_guess.irp.f b/src/MOGuess/H_CORE_guess.irp.f index 2c823baf..5e144cc6 100644 --- a/src/MOGuess/H_CORE_guess.irp.f +++ b/src/MOGuess/H_CORE_guess.irp.f @@ -3,7 +3,7 @@ program H_CORE_guess character*(64) :: label mo_coef = ao_ortho_lowdin_coef TOUCH mo_coef - label = "H_CORE_GUESS" + label = "Guess" call mo_as_eigvectors_of_mo_matrix(mo_mono_elec_integral,size(mo_mono_elec_integral,1),size(mo_mono_elec_integral,2),label) call save_mos