import ctypes import os DISTGEN_DIR="/nfs/acc/temp/cg248/distgen/" ldistgen = ctypes.cdll.LoadLibrary(DISTGEN_DIR+"lib/distgen.so") ldistgen.form_dist_from_file.argtypes=[ctypes.c_char_p,ctypes.c_char_p,ctypes.c_bool, ctypes.c_bool] ldistgen.form_dist_from_file.restypes=ctypes.c_int def form_dist(sim_type="gpt", filename=None, verbose=True, very_verbose=False, cleanup=True): return ldistgen.form_dist_from_file(ctypes.c_char_p(sim_type.encode('utf-8')),ctypes.c_char_p(filename.encode('utf-8')),ctypes.c_bool(verbose),ctypes.c_bool(very_verbose)) def write_new_input_file(template, filename, replacements=None, verbose=True): lines = read_file(template,verbose) lines = perform_replacements(lines,replacements) write_file(filename,lines) def perform_replacements(lines,replacements=None,verbose=True): if(replacements is None): return lines # Only here if there is stuff to do! for rep in replacements.keys(): rep_found = False for ii in range(len(lines)): line = lines[ii] line_split_on_comments = line.split("#") params = line_split_on_comments[0] if(rep in params): rep_found = True if(len(line_split_on_comments)>1): comment = line_split_on_comments[1] else: comment="" tokens = params.split() if(len(tokens)==3): # should have a unit, likely a float vprint("pydistgen::perform replacements: "+str(tokens[0])+" "+str(tokens[1])+" "+tokens[2].strip(),verbose,0,new_line=False) tokens[1] = str(replacements[rep]["value"]) tokens[2] = "["+replacements[rep]["unit"]+"]" vprint("-> "+str(tokens[1])+" "+tokens[2]+".",verbose,0,new_line=True) new_line = tokens[0]+" "+tokens[1]+" "+tokens[2] if(len(tokens)==2): # could be a string or unit vprint("pydistgen::perform_replacements: "+str(tokens[0])+" "+str(tokens[1]),verbose,0,new_line=False) tokens[1] = str(replacements[rep]["value"]) vprint("-> "+str(tokens[1])+".",verbose,0,new_line=True) new_line = tokens[0]+" "+tokens[1] if(comment!=""): new_line = new_line + " " + "# "+comment lines[ii]=new_line+"\n" if(not rep_found): print("Could not find " + rep + " in the input file") return lines def read_file(filename,verbose=True): vprint("pydistgen::Reading file '"+filename+"':",verbose,0,new_line=False) f=open(filename,'r') lines = f.readlines() f.close() vprint("done.",verbose,0,True) return lines def write_file(filename,lines,verbose=True): vprint("pydistgen::Writing file '"+filename+"':",verbose,0,new_line=False) f=open(filename,'w') f.writelines(lines) f.close() vprint("done.",verbose,0,True) def distgen(template=None,replacements=None,output="distgen.out",verbose = 0,stype="gpt"): if(template is None): print("No template file provided, program ends.") return write_new_input_file(template, filename=output, replacements=replacements, verbose=verbose) try: res = form_dist(sim_type=stype, filename=output, verbose=(verbose==1), very_verbose=False, cleanup=True) if(res!=0): print("pydistgen::error occured in main distgen call") except Exception as ex: print(ex) #===================================== # HELPER FUNCTIONS: def vprint(out_str,verbose,indent_number,new_line): indent=" " total_indent = "" for x in range(0,indent_number): total_indent = total_indent + indent if(verbose): if(new_line): print(total_indent+out_str,end="\n") else: print(total_indent+out_str,end="") #===================================== def main(): # FOR TESTING replacements={"sigma_xy":{"value":5.9,"unit":"mm"}} distgen(template = "examples/gausstest.txt", replacements=replacements, output="pydistgen.test.txt", verbose=1, stype="gpt") # ---------------------------------------------------------------------------- # This allows the main function to be at the beginning of the file # ---------------------------------------------------------------------------- if __name__ == '__main__': main()