mirror of
https://gitlab.com/scemama/irpf90.git
synced 2024-09-01 17:23:42 +02:00
Merge branch 'master' of ssh://irpf90.git.sourceforge.net/gitroot/irpf90/irpf90
Conflicts: src/makefile.py src/parsed_text.py src/util.py Version:1.1.51
This commit is contained in:
commit
969e31490b
@ -32,5 +32,11 @@ wd = os.path.abspath(os.path.dirname(__file__))
|
||||
sys.path.insert(0,(wd+"/../src/"))
|
||||
sys.path.insert(0,(wd+"/../share/irpf90/src/"))
|
||||
|
||||
debug = int(os.getenv("IRP_DEBUG",0))
|
||||
if debug == 0:
|
||||
import irpf90
|
||||
irpf90.main()
|
||||
else:
|
||||
import profile
|
||||
print "Profiling irpf90"
|
||||
profile.run('import irpf90 ; irpf90.main()')
|
||||
|
@ -54,9 +54,11 @@ subroutine irp_enter(irp_where)
|
||||
integer :: nthread
|
||||
character*(*) :: irp_where
|
||||
$OMP_DECL
|
||||
!$OMP CRITICAL
|
||||
ithread = $OMP_GET_THREAD_NUM
|
||||
nthread = $OMP_GET_NUM_THREADS
|
||||
$1
|
||||
!$OMP END CRITICAL
|
||||
"""
|
||||
if command_line.do_memory:
|
||||
txt+="""
|
||||
@ -75,9 +77,11 @@ subroutine irp_leave (irp_where)
|
||||
integer :: ithread
|
||||
double precision :: cpu
|
||||
$OMP_DECL
|
||||
!$OMP CRITICAL
|
||||
ithread = $OMP_GET_THREAD_NUM
|
||||
$3
|
||||
$4
|
||||
!$OMP END CRITICAL
|
||||
end subroutine
|
||||
"""
|
||||
|
||||
@ -97,14 +101,12 @@ end subroutine
|
||||
# $1
|
||||
if do_assert or do_debug:
|
||||
txt = txt.replace("$1","""
|
||||
!$OMP CRITICAL
|
||||
if (.not.alloc) then
|
||||
allocate(irp_stack(STACKMAX,nthread))
|
||||
allocate(irp_cpu(STACKMAX,nthread))
|
||||
allocate(stack_index(nthread))
|
||||
allocate(irp_stack(STACKMAX,nthread+1))
|
||||
allocate(irp_cpu(STACKMAX,nthread+1))
|
||||
allocate(stack_index(nthread+1))
|
||||
alloc = .True.
|
||||
endif
|
||||
!$OMP END CRITICAL
|
||||
stack_index(ithread+1) = stack_index(ithread+1)+1
|
||||
irp_stack(stack_index(ithread+1),ithread+1) = irp_where""")
|
||||
if command_line.do_memory:
|
||||
|
@ -24,6 +24,8 @@
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
import sys
|
||||
sys.setcheckinterval(1000)
|
||||
|
||||
def main():
|
||||
from command_line import command_line
|
||||
|
@ -33,6 +33,7 @@ class Line(object):
|
||||
def __init__(self,i,text,filename):
|
||||
self.i = i
|
||||
self.text = text
|
||||
self.lower = text.lower()
|
||||
self.filename = filename
|
||||
self._lower = None
|
||||
|
||||
|
@ -152,4 +152,3 @@ def run():
|
||||
|
||||
file.close()
|
||||
sys.exit(0)
|
||||
|
||||
|
@ -38,29 +38,32 @@ stuple = map(lambda s: (s, subroutines[s].regexp), subroutines.keys())
|
||||
stuple = filter(lambda s: subroutines[s[0]].is_function, stuple)
|
||||
re_string_sub = regexps.re_string.sub
|
||||
|
||||
regexps_re_string_sub = regexps.re_string.sub
|
||||
def find_variables_in_line(line):
|
||||
assert isinstance(line,Line)
|
||||
result = []
|
||||
sub_done = False
|
||||
buffer = line.text_lower
|
||||
ap = result.append
|
||||
for v,same_as,regexp in vtuple:
|
||||
if v in buffer:
|
||||
if not sub_done:
|
||||
buffer = re_string_sub('',buffer)
|
||||
buffer = regexps_re_string_sub('',buffer)
|
||||
sub_done = True
|
||||
if regexp.search(buffer) is not None:
|
||||
result.append(same_as)
|
||||
ap(same_as)
|
||||
return result
|
||||
|
||||
def find_funcs_in_line(line):
|
||||
assert isinstance(line,Line)
|
||||
result = []
|
||||
append = result.append
|
||||
sub_done = False
|
||||
buffer = line.text_lower
|
||||
for s,regexp in stuple:
|
||||
if s in buffer:
|
||||
if regexp.search(buffer) is not None:
|
||||
result.append(s)
|
||||
append(s)
|
||||
return result
|
||||
|
||||
|
||||
@ -90,6 +93,7 @@ def get_parsed_text():
|
||||
def func(filename, text):
|
||||
varlist = []
|
||||
result = []
|
||||
append = result.append
|
||||
for line in filter(
|
||||
lambda x: type(x) not in [ Doc, Begin_doc, End_doc ],
|
||||
text):
|
||||
@ -110,28 +114,28 @@ def get_parsed_text():
|
||||
Function,
|
||||
End,
|
||||
]:
|
||||
result.append( ([],line) )
|
||||
append( ([],line) )
|
||||
elif isinstance(line,End_provider):
|
||||
varlist = []
|
||||
result.append( ([],line) )
|
||||
append( ([],line) )
|
||||
elif isinstance(line,Provide):
|
||||
l = line.text_lower.split()[1:]
|
||||
l = filter(lambda x: x not in varlist, l)
|
||||
for v in l:
|
||||
if v not in variables.keys():
|
||||
error.fail(line,"Variable %s is unknown"%(v))
|
||||
result.append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
||||
append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
||||
elif isinstance(line,Call):
|
||||
l = find_variables_in_line(line)
|
||||
l = filter(lambda x: x not in varlist, l)
|
||||
sub = find_subroutine_in_line(line)
|
||||
if sub not in subroutines:
|
||||
t = Simple_line
|
||||
result.append( (l,Simple_line(line.i,line.text,line.filename)) )
|
||||
append( (l,Simple_line(line.i,line.text,line.filename)) )
|
||||
else:
|
||||
result.append( (l,line) )
|
||||
append( (l,line) )
|
||||
if subroutines[sub].touches != []:
|
||||
result.append( ([],Provide_all(line.i,"",line.filename)) )
|
||||
append( ([],Provide_all(line.i,"",line.filename)) )
|
||||
elif isinstance(line,Free):
|
||||
vars = line.text_lower.split()
|
||||
if len(vars) < 2:
|
||||
@ -139,7 +143,7 @@ def get_parsed_text():
|
||||
vars = vars[1:]
|
||||
for v in vars:
|
||||
variables[v].is_freed = True
|
||||
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
||||
append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
||||
use = map(lambda x: " use %s"%(variables[x].fmodule),vars)
|
||||
for var in vars:
|
||||
result += map(lambda x: ([],Use(line.i,x,line.filename)),
|
||||
@ -148,10 +152,10 @@ def get_parsed_text():
|
||||
variables[var].free)
|
||||
elif isinstance(line,Irp_read):
|
||||
variables[line.filename]._is_read = True
|
||||
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
||||
append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
||||
elif isinstance(line,Irp_write):
|
||||
variables[line.filename]._is_written = True
|
||||
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
||||
append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
||||
elif isinstance(line,Touch):
|
||||
vars = line.text_lower.split()
|
||||
if len(vars) < 2:
|
||||
@ -197,7 +201,7 @@ def get_parsed_text():
|
||||
except ValueError:
|
||||
print v, variables[v].same_as
|
||||
raise
|
||||
result.append( (variable_list,line) )
|
||||
append( (variable_list,line) )
|
||||
else:
|
||||
l = find_variables_in_line(line)
|
||||
l = filter(lambda x: x not in varlist, l)
|
||||
@ -210,7 +214,6 @@ def get_parsed_text():
|
||||
#return main_result
|
||||
return parallel_loop(func,preprocessed_text)
|
||||
|
||||
|
||||
parsed_text = get_parsed_text()
|
||||
|
||||
|
||||
@ -252,6 +255,7 @@ def move_variables():
|
||||
|
||||
def func(filename, text):
|
||||
result = []
|
||||
append = result.append
|
||||
# 1st pass
|
||||
varlist = []
|
||||
ifvars = []
|
||||
@ -264,20 +268,20 @@ def move_variables():
|
||||
for vars,line in revtext:
|
||||
if type(line) in [ End_provider,End ]:
|
||||
varlist = []
|
||||
result.append( ([],line) )
|
||||
append( ([],line) )
|
||||
elif type(line) in [ Endif, End_select ]:
|
||||
old_ifvars.append( list(ifvars) )
|
||||
old_elsevars.append( list(elsevars) )
|
||||
old_varlist.append( list(varlist) )
|
||||
varlist = []
|
||||
result.append( ([],line) )
|
||||
append( ([],line) )
|
||||
elif type(line) == Else:
|
||||
elsevars += list(varlist)
|
||||
result.append( (varlist,line) )
|
||||
append( (varlist,line) )
|
||||
varlist = []
|
||||
elif type(line) in [ Elseif, Case ]:
|
||||
ifvars += list(varlist)
|
||||
result.append( (varlist,line) )
|
||||
append( (varlist,line) )
|
||||
if vars != []:
|
||||
varlist = old_varlist.pop()
|
||||
varlist += vars
|
||||
@ -285,29 +289,30 @@ def move_variables():
|
||||
varlist = []
|
||||
elif type(line) in [ If, Select ]:
|
||||
ifvars += list(varlist)
|
||||
result.append( (varlist,line) )
|
||||
append( (varlist,line) )
|
||||
vars += filter(lambda x: x in elsevars, ifvars)
|
||||
ifvars = old_ifvars.pop()
|
||||
elsevars = old_elsevars.pop()
|
||||
varlist = old_varlist.pop() + vars
|
||||
elif type(line) in [ Begin_provider, Subroutine, Function ]:
|
||||
varlist += vars
|
||||
result.append( (varlist,line) )
|
||||
append( (varlist,line) )
|
||||
if old_varlist != [] \
|
||||
or old_ifvars != [] \
|
||||
or old_elsevars != []:
|
||||
error.fail(line,"End if missing")
|
||||
varlist = []
|
||||
elif isinstance(line,Provide_all):
|
||||
result.append( (vars,line) )
|
||||
append( (vars,line) )
|
||||
else:
|
||||
varlist += vars
|
||||
result.append( ([],line) )
|
||||
append( ([],line) )
|
||||
result.reverse()
|
||||
|
||||
# 2nd pass
|
||||
text = result
|
||||
result = []
|
||||
append = result.append
|
||||
old_varlist = []
|
||||
varlist = []
|
||||
for vars,line in text:
|
||||
@ -368,11 +373,12 @@ def add_subroutine_needs():
|
||||
main_result = []
|
||||
for filename, text in parsed_text:
|
||||
result = []
|
||||
append = result.append
|
||||
for vars,line in text:
|
||||
if isinstance(line,Call):
|
||||
subname = find_subname(line)
|
||||
vars = subroutines[subname].to_provide
|
||||
result.append( (vars,line) )
|
||||
append( (vars,line) )
|
||||
main_result.append( (filename, result) )
|
||||
return main_result
|
||||
|
||||
|
@ -538,12 +538,12 @@ def irp_simple_statements(text):
|
||||
|
||||
def process_begin_provider(line):
|
||||
assert isinstance(line,Begin_provider)
|
||||
buffer = line.text.replace('['," ")
|
||||
buffer = line.lower.replace('['," ")
|
||||
buffer = buffer.replace(']',"")
|
||||
buffer = buffer.split(',')
|
||||
if len(buffer) < 2:
|
||||
error.fail(line,"Error in Begin_provider statement")
|
||||
varname = buffer[1].strip().lower()
|
||||
varname = buffer[1].strip()
|
||||
length = len(varname)
|
||||
i = line.i
|
||||
f = line.filename
|
||||
@ -557,12 +557,12 @@ def irp_simple_statements(text):
|
||||
|
||||
def process_cont_provider(line):
|
||||
assert isinstance(line,Cont_provider)
|
||||
buffer = line.text.replace('['," ")
|
||||
buffer = line.lower.replace('['," ")
|
||||
buffer = buffer.replace(']',"")
|
||||
buffer = buffer.split(',')
|
||||
if len(buffer) < 2:
|
||||
error.fail(line,"Error in Cont_provider statement")
|
||||
varname = buffer[1].strip().lower()
|
||||
varname = buffer[1].strip()
|
||||
i = line.i
|
||||
f = line.filename
|
||||
return [ Cont_provider(i,line.text,(f,varname)) ]
|
||||
@ -599,7 +599,7 @@ def irp_simple_statements(text):
|
||||
|
||||
def process_program(line):
|
||||
assert isinstance(line,Program)
|
||||
program_name = line.text.split()[1].lower()
|
||||
program_name = line.lower.split()[1]
|
||||
result = [ Program(0,"",program_name) ] + \
|
||||
process_subroutine( Subroutine(line.i,"subroutine %s"%(program_name,),line.filename) )
|
||||
return result
|
||||
@ -691,7 +691,7 @@ endif'''
|
||||
result = []
|
||||
for line in text:
|
||||
if isinstance(line,If):
|
||||
if line.text.lower().endswith("then"):
|
||||
if line.lower.endswith("then"):
|
||||
result.append(line)
|
||||
else:
|
||||
buffer = line.text
|
||||
|
@ -49,7 +49,7 @@ class Sub(object):
|
||||
############################################################
|
||||
def is_function(self):
|
||||
if '_is_function' not in self.__dict__:
|
||||
self._is_function = "function" in self.line.text.lower()
|
||||
self._is_function = "function" in self.line.lower
|
||||
return self._is_function
|
||||
is_function = property(is_function)
|
||||
|
||||
|
@ -121,10 +121,11 @@ class Variable(object):
|
||||
def others(self):
|
||||
if '_others' not in self.__dict__:
|
||||
result = []
|
||||
append = result.append
|
||||
f = lambda l: type(l) in [Begin_provider, Cont_provider]
|
||||
lines = filter(f, self.text)
|
||||
for line in lines:
|
||||
result.append(line.filename[1])
|
||||
append(line.filename[1])
|
||||
result.remove(self.name)
|
||||
self._others = result
|
||||
return self._others
|
||||
|
@ -66,13 +66,14 @@ def call_provides(vars,opt=False):
|
||||
all_children = flatten( map(lambda x: variables[x].children, vars ))
|
||||
vars = filter(lambda x: x not in all_children,vars)
|
||||
def fun(x):
|
||||
if command_line.do_openmp:
|
||||
result = [ "!$OMP TASK" ]
|
||||
else:
|
||||
result = []
|
||||
if command_line.do_openmp:
|
||||
result += [ "!$OMP TASK" ]
|
||||
result += [ \
|
||||
" if (.not.%s_is_built) then"%(x) ]
|
||||
result += [ \
|
||||
" call provide_%s"%(x) ]
|
||||
result += [ \
|
||||
" if (.not.%s_is_built) then"%(x),
|
||||
" call provide_%s"%(x),
|
||||
" endif" ]
|
||||
if command_line.do_openmp:
|
||||
result += [ "!$OMP END TASK" ]
|
||||
|
@ -1 +1 @@
|
||||
version = "1.1.50"
|
||||
version = "1.1.51"
|
||||
|
Loading…
Reference in New Issue
Block a user