From cdab9bb2c0ba76fb186659b1c337d3d00d43ef89 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 3 Mar 2011 15:46:21 +0100 Subject: [PATCH 1/6] Introduced nodep Version:1.1.64 --- src/irpf90_t.py | 6 ++++++ src/parsed_text.py | 17 +++++++++++++++-- src/preprocessed_text.py | 1 + src/version.py | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/irpf90_t.py b/src/irpf90_t.py index 63e5093..9af0fe1 100644 --- a/src/irpf90_t.py +++ b/src/irpf90_t.py @@ -284,6 +284,12 @@ class Provide(Line): def __repr__(self): return "%20s:%5d : %s"%("Provide",self.i,self.text) +class NoDep(Line): + def __init__(self,i,text,filename): + Line.__init__(self,i,text,filename) + def __repr__(self): + return "%20s:%5d : %s"%("NoDep",self.i,self.text) + class Return (Line): def __init__(self,i,text,filename): Line.__init__(self,i,text,filename) diff --git a/src/parsed_text.py b/src/parsed_text.py index 2d3bf2a..2a03c00 100644 --- a/src/parsed_text.py +++ b/src/parsed_text.py @@ -169,6 +169,13 @@ def get_parsed_text(): if v not in variables.keys(): error.fail(line,"Variable %s is unknown"%(v)) append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) ) + elif type(line) == NoDep: + l = line.lower.split()[1:] + for v in l: + if v not in variables.keys(): + error.fail(line,"Variable %s is unknown"%(v)) + l = map(lambda x: "-%s"%(x), l) + append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) ) elif type(line) in [ Touch, SoftTouch ]: vars = line.lower.split() if len(vars) < 2: @@ -244,7 +251,7 @@ parsed_text = get_parsed_text() def move_to_top(text,t): assert type(text) == list - assert t in [ Declaration, Implicit, Use, Cont_provider ] + assert t in [ NoDep, Declaration, Implicit, Use, Cont_provider ] inside = False for i in range(len(text)): @@ -264,6 +271,7 @@ def move_to_top(text,t): result = [] for filename,text in parsed_text: + text = move_to_top(text,NoDep) text = move_to_top(text,Declaration) text = move_to_top(text,Implicit) text = move_to_top(text,Use) @@ -396,6 +404,10 @@ def move_variables(): elif type(line) in [ End_provider, End ]: assert old_varlist == [] varlist = [] + for v in vars[:]: + if v[0] == '-': + vars.remove(v) + vars.remove(v[1:]) result.append( (vars,line) ) return result @@ -462,6 +474,7 @@ build_needs() result = [] for filename,text in parsed_text: + text = move_to_top(text,NoDep) text = move_to_top(text,Declaration) text = move_to_top(text,Implicit) text = move_to_top(text,Use) @@ -494,7 +507,7 @@ check_opt() ###################################################################### if __name__ == '__main__': for i in range(len(parsed_text)): - if parsed_text[i][0] == 'eplf_function.irp.f': + if parsed_text[i][0] == 'mo.irp.f': print '!-------- %s -----------'%(parsed_text[i][0]) for line in parsed_text[i][1]: print line[1] diff --git a/src/preprocessed_text.py b/src/preprocessed_text.py index 23203a8..9d3775f 100644 --- a/src/preprocessed_text.py +++ b/src/preprocessed_text.py @@ -59,6 +59,7 @@ simple_dict = { "touch": Touch , "soft_touch": SoftTouch , "provide": Provide , + "no_dep": NoDep , "free": Free , "irp_if": Irp_If , "irp_else": Irp_Else , diff --git a/src/version.py b/src/version.py index 69f627b..6da2d73 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.63" +version = "1.1.64" From 4179c6703737c6927ac292367f06522820daaf9e Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 9 Apr 2011 23:45:50 +0200 Subject: [PATCH 2/6] dict acceleration Version:1.1.65 --- src/command_line.py | 4 ++-- src/create_man.py | 6 +++--- src/makefile.py | 4 ++-- src/modules.py | 2 +- src/parsed_text.py | 16 ++++++++-------- src/preprocessed_text.py | 5 ++--- src/version.py | 2 +- 7 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/command_line.py b/src/command_line.py index 05ece4a..5c79137 100644 --- a/src/command_line.py +++ b/src/command_line.py @@ -102,7 +102,7 @@ Options: def opts(self): if self._opts is None: optlist = ["",[]] - for o in options.keys(): + for o in options: b = [o]+options[o] if b[3] == 1: b[0] = b[0]+":" @@ -132,7 +132,7 @@ def do_$LONG(self): return self._do_$LONG do_$LONG = property(fget=do_$LONG) """ - for short in options.keys(): + for short in options: long = options[short][0] exec t.replace("$LONG",long).replace("$SHORT",short) diff --git a/src/create_man.py b/src/create_man.py index d56d1bf..4e461c9 100644 --- a/src/create_man.py +++ b/src/create_man.py @@ -97,13 +97,13 @@ def do_print(var): def run(): import parsed_text import os,sys - l = variables.keys() if os.fork() == 0: - for v in l: - do_print(variables[v]) + for v in variables.values(): + do_print(v) sys.exit(0) if os.fork() == 0: + l = variables.keys() file = open("irpf90_entities","w") l.sort() for v in l: diff --git a/src/makefile.py b/src/makefile.py index a89865d..02d1631 100644 --- a/src/makefile.py +++ b/src/makefile.py @@ -63,8 +63,8 @@ def run(): from modules import modules if os.fork() == 0: mod = [] - for m in modules.keys(): - mod.append(modules[m]) + for m in modules.values(): + mod.append(m) file = open('irpf90.make','w') diff --git a/src/modules.py b/src/modules.py index 1231e44..ec060a2 100644 --- a/src/modules.py +++ b/src/modules.py @@ -63,6 +63,6 @@ def write_module(m): ###################################################################### if __name__ == '__main__': - write_module(modules['electrons.irp.f']) + write_module(modules['psi.irp.f']) diff --git a/src/parsed_text.py b/src/parsed_text.py index 2a03c00..c8a0380 100644 --- a/src/parsed_text.py +++ b/src/parsed_text.py @@ -166,13 +166,13 @@ def get_parsed_text(): l = line.lower.split()[1:] l = filter(lambda x: x not in varlist, l) for v in l: - if v not in variables.keys(): + if v not in variables: error.fail(line,"Variable %s is unknown"%(v)) append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) ) elif type(line) == NoDep: l = line.lower.split()[1:] for v in l: - if v not in variables.keys(): + if v not in variables: error.fail(line,"Variable %s is unknown"%(v)) l = map(lambda x: "-%s"%(x), l) append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) ) @@ -447,25 +447,25 @@ def build_needs(): funcs = find_funcs_in_line(line) for f in funcs: var.needs += subroutines[f].needs - for v in variables.keys(): + for v in variables: main = variables[v].same_as if main != v: variables[v].needs = variables[main].needs variables[v].to_provide = variables[main].to_provide # Needed_by - for v in variables.keys(): + for v in variables: variables[v].needed_by = [] - for v in variables.keys(): + for v in variables: main = variables[v].same_as if main != v: variables[v].needed_by = variables[main].needed_by - for v in variables.keys(): + for v in variables: var = variables[v] if var.is_main: for x in var.needs: variables[x].needed_by.append(var.same_as) - for v in variables.keys(): + for v in variables: var = variables[v] var.needed_by = make_single(var.needed_by) @@ -507,7 +507,7 @@ check_opt() ###################################################################### if __name__ == '__main__': for i in range(len(parsed_text)): - if parsed_text[i][0] == 'mo.irp.f': + if parsed_text[i][0] == 'psi.irp.f': print '!-------- %s -----------'%(parsed_text[i][0]) for line in parsed_text[i][1]: print line[1] diff --git a/src/preprocessed_text.py b/src/preprocessed_text.py index 9d3775f..1dff0cb 100644 --- a/src/preprocessed_text.py +++ b/src/preprocessed_text.py @@ -85,7 +85,6 @@ simple_dict = { "function": Function , "recursive": Function , } -simple_dict_keys = simple_dict.keys() def get_type (i, filename, line, is_doc): '''Find the type of a text line''' @@ -126,7 +125,7 @@ def get_type (i, filename, line, is_doc): if is_doc: return [ Doc (i,line,filename) ], is_doc - if firstword in simple_dict_keys: + if firstword in simple_dict: return [ simple_dict[firstword](i,line,filename) ], is_doc if firstword in [ "select", "selectcase" ]: @@ -621,7 +620,7 @@ def irp_simple_statements(text): result = [] for line in text: buffer = [ line ] - for t in d.keys(): + for t in d: if type(line) == t: buffer = d[t](line) break diff --git a/src/version.py b/src/version.py index 6da2d73..f51103f 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.64" +version = "1.1.65" From 3b532d1ac909aec83522b4c66f79feaf2fda01b4 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 14 Apr 2011 16:53:31 +0200 Subject: [PATCH 3/6] Better parallelization. Dummy touches when empty Version:1.1.65 --- src/touches.py | 8 +++++++- src/util.py | 38 +++++++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/touches.py b/src/touches.py index a199cfa..714aa0e 100644 --- a/src/touches.py +++ b/src/touches.py @@ -40,7 +40,13 @@ def create(): if var.is_touched: out += var.toucher - out = map(lambda x: "%s\n"%(x),out) + if out != []: + out = map(lambda x: "%s\n"%(x),out) + else: + out = """ + subroutine irpf90_dummy_touch() + end + """ if not same_file(FILENAME,out): file = open(FILENAME,'w') file.writelines(out) diff --git a/src/util.py b/src/util.py index f2c0e76..14f0069 100644 --- a/src/util.py +++ b/src/util.py @@ -25,7 +25,7 @@ # scemama@irsamc.ups-tlse.fr import os -NTHREADS=int(os.getenv('OMP_NUM_THREADS',4)) +NTHREADS=int(os.getenv('OMP_NUM_THREADS',2)) def strip(x): return x.strip() @@ -135,6 +135,12 @@ def parallel_loop(f,source): src = [ [] for i in xrange(NTHREADS) ] index = 0 + try: + source = map( lambda x: (len(x[1]),(x[0], x[1])), source ) + source.sort() + source = map( lambda x: x[1], source ) + except: + pass for i in source: index += 1 if index == NTHREADS: @@ -143,34 +149,36 @@ def parallel_loop(f,source): thread_id = 0 fork = 1 + r = range(0,NTHREADS) for thread_id in xrange(1,NTHREADS): + r[thread_id], w = os.pipe() fork = os.fork() if fork == 0: + os.close(r[thread_id]) + w = os.fdopen(w,'w') break else: + os.close(w) + r[thread_id] = os.fdopen(r[thread_id],'r') pidlist[thread_id] = fork thread_id = 0 + result = [] for filename, text in src[thread_id]: - result = f(filename,text) - file = open('%s.pickle'%filename,'w') - pickle.dump(result,file,-1) - file.close() + result.append( (filename, f(filename,text)) ) + + result.sort() if fork == 0: + pickle.dump(result,w,-1) + w.close() os._exit(0) - + for i in xrange(1,NTHREADS): + result += pickle.load(r[i]) + r[i].close() if os.waitpid(pidlist[i],0)[1] != 0: - os._exit(0) - - result = [] - for filename,text in source: - file = open('%s.pickle'%filename,'r') - data = pickle.load(file) - file.close() - os.remove('%s.pickle'%filename) - result.append( (filename, data) ) + raise OSError return result From a458373fec43c7c69bc7cffb54233479f2417f26 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 14 Apr 2011 16:53:52 +0200 Subject: [PATCH 4/6] Version:1.1.66 --- src/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.py b/src/version.py index f51103f..e976f47 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.65" +version = "1.1.66" From 5cdd491f177a2b93f70b632ae60867c0fc0bcdf2 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 16 May 2011 16:17:10 +0200 Subject: [PATCH 5/6] Little bug Version:1.1.69 --- src/touches.py | 2 +- src/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/touches.py b/src/touches.py index 714aa0e..1d46672 100644 --- a/src/touches.py +++ b/src/touches.py @@ -47,7 +47,7 @@ def create(): subroutine irpf90_dummy_touch() end """ - if not same_file(FILENAME,out): + if not same_file(FILENAME,out.splitlines()): file = open(FILENAME,'w') file.writelines(out) file.close() diff --git a/src/version.py b/src/version.py index e976f47..1880f9b 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.66" +version = "1.1.69" From dd57498a28a5b91fce3e58667a9d9f38ed72e419 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 16 May 2011 16:55:11 +0200 Subject: [PATCH 6/6] Bug Version:1.1.70 --- src/touches.py | 4 ++-- src/version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/touches.py b/src/touches.py index 1d46672..58c1c2b 100644 --- a/src/touches.py +++ b/src/touches.py @@ -46,8 +46,8 @@ def create(): out = """ subroutine irpf90_dummy_touch() end - """ - if not same_file(FILENAME,out.splitlines()): + """.splitlines() + if not same_file(FILENAME,out): file = open(FILENAME,'w') file.writelines(out) file.close() diff --git a/src/version.py b/src/version.py index 1880f9b..11ff4d0 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.69" +version = "1.1.70"