simple average implemented
This commit is contained in:
parent
4ae6c1e95c
commit
05c6088a09
5 changed files with 109 additions and 12 deletions
|
|
@ -16,6 +16,7 @@ calc_grammar = """
|
|||
?varlist: "[" [NAME ("," NAME)*] "]"
|
||||
|
||||
?start: NAME "=" sum -> assign_var
|
||||
| NAME "=" avg -> assign_avg_var
|
||||
| varlist
|
||||
|
||||
?sum: product
|
||||
|
|
@ -35,8 +36,12 @@ calc_grammar = """
|
|||
| mathfunc "(" sum ")" -> fcall
|
||||
| derivative "(" NAME ")" -> dnx
|
||||
|
||||
?avg: "<" sum ">" -> ucavg
|
||||
| "<" sum ">u" -> cavgu
|
||||
| "<" sum ">b" -> cavgb
|
||||
|
||||
?inlinefunc: "sqr" -> sqr
|
||||
| "pow3" -> pow3
|
||||
| "pow3" -> pow3
|
||||
|
||||
?mathfunc: "log" -> log
|
||||
| "exp" -> exp
|
||||
|
|
@ -59,6 +64,10 @@ calc_grammar = """
|
|||
|
||||
real_array_decl = "real*8, allocatable, dimension(:,:,:) :: {}"
|
||||
real_array_alloc = "allocate({0}(nxp,nyp,nzp), stat=ierr) ; {0} = 0."
|
||||
|
||||
avg_array_decl = "real*8, allocatable, dimension(:) :: {}"
|
||||
avg_array_alloc = "allocate({0}(nxp), stat=ierr) ; {0} = 0."
|
||||
|
||||
real_array_free = "deallocate({})"
|
||||
|
||||
real_array_loop = """
|
||||
|
|
@ -71,6 +80,18 @@ end do
|
|||
end do
|
||||
"""
|
||||
|
||||
avg_array_sum = """
|
||||
do k = 1, nzp
|
||||
do j = 1, nyp
|
||||
do i = 1, nxp
|
||||
{0[0]}(i) = {0[0]}(i) + {0[1]}
|
||||
end do
|
||||
end do
|
||||
end do
|
||||
"""
|
||||
|
||||
avg_array_divide = "{0[0]} = {0[0]} / denum"
|
||||
|
||||
real_array_diff = "call {0[0]} ( {0[0]}_{0[1]}, {0[1]} )"
|
||||
|
||||
@v_args(inline=True) # Affects the signatures of the methods
|
||||
|
|
@ -93,6 +114,20 @@ class CalculateTree(Transformer):
|
|||
self.dependency[name.value] = dep
|
||||
return "{} = {}".format(name, value)
|
||||
|
||||
def assign_avg_var(self, name, (value, dep)):
|
||||
self.averaged[name.value] = value
|
||||
self.dependency[name.value] = dep
|
||||
return "{} = {}".format(name, value)
|
||||
|
||||
def ucavg(self, (exp, dep)):
|
||||
return (exp, dep)
|
||||
|
||||
def cavgu(self, (exp, dep)):
|
||||
return (exp, dep)
|
||||
|
||||
def cavgb(self, (exp, dep)):
|
||||
return (exp, dep)
|
||||
|
||||
def number(self, numeral):
|
||||
return (numeral, [])
|
||||
|
||||
|
|
@ -163,6 +198,9 @@ class CalculateTree(Transformer):
|
|||
for var in self.derivatives.iterkeys():
|
||||
f_code = f_code + real_array_decl.format(var) + "\n"
|
||||
|
||||
for var in self.averaged.iterkeys():
|
||||
f_code = f_code + avg_array_decl.format(var) + "\n"
|
||||
|
||||
return f_code
|
||||
|
||||
|
||||
|
|
@ -176,6 +214,9 @@ class CalculateTree(Transformer):
|
|||
for var in self.derivatives.iterkeys():
|
||||
f_code = f_code + real_array_alloc.format(var) + "\n"
|
||||
|
||||
for var in self.averaged.iterkeys():
|
||||
f_code = f_code + avg_array_alloc.format(var) + "\n"
|
||||
|
||||
return f_code
|
||||
|
||||
|
||||
|
|
@ -189,10 +230,13 @@ class CalculateTree(Transformer):
|
|||
for var in self.derivatives.iterkeys():
|
||||
f_code = f_code + real_array_free.format(var) + "\n"
|
||||
|
||||
for var in self.averaged.iterkeys():
|
||||
f_code = f_code + real_array_free.format(var) + "\n"
|
||||
|
||||
return f_code
|
||||
|
||||
|
||||
def array_ci (self):
|
||||
def array_pass1 (self):
|
||||
|
||||
f_code = ""
|
||||
|
||||
|
|
@ -204,25 +248,39 @@ class CalculateTree(Transformer):
|
|||
for tup in self.derivatives.iteritems():
|
||||
code_dict[tup[0]] = real_array_diff.format(tup[1]) + "\n"
|
||||
|
||||
for tup in self.averaged.iteritems():
|
||||
code_dict[tup[0]] = avg_array_sum.format(tup) + "\n"
|
||||
|
||||
for var in self.sort_vars():
|
||||
f_code = f_code + code_dict[var]
|
||||
|
||||
return f_code
|
||||
|
||||
|
||||
def array_pass1_avg (self):
|
||||
|
||||
f_code = ""
|
||||
|
||||
for tup in self.averaged.iteritems():
|
||||
f_code = f_code + avg_array_divide.format(tup) + "\n"
|
||||
|
||||
return f_code
|
||||
|
||||
|
||||
def module_dict (self):
|
||||
md = {}
|
||||
md["module_name"] = "terms"
|
||||
md["module_data"] = self.array_decl()
|
||||
md["module_init"] = self.array_init()
|
||||
md["module_finalize"] = self.array_final()
|
||||
md["module_ci"] = self.array_ci()
|
||||
md["module_pass1"] = self.array_pass1()
|
||||
md["module_pass1_avg"] = self.array_pass1_avg()
|
||||
|
||||
return md
|
||||
|
||||
def sort_vars (self):
|
||||
order = []
|
||||
remain = set(self.derived.iterkeys()) | set(self.derivatives.iterkeys())
|
||||
remain = set(self.derived.iterkeys()) | set(self.derivatives.iterkeys()) | set(self.averaged.iterkeys())
|
||||
|
||||
while len(remain) > 0:
|
||||
for v in remain:
|
||||
|
|
|
|||
|
|
@ -26,13 +26,25 @@ subroutine m_{0[module_name]}_finalize
|
|||
end subroutine m_{0[module_name]}_finalize
|
||||
|
||||
|
||||
subroutine m_{0[module_name]}_calculate_instant
|
||||
subroutine m_{0[module_name]}_calculate_pass1
|
||||
|
||||
integer :: i, j, k
|
||||
|
||||
{0[module_ci]}
|
||||
{0[module_pass1]}
|
||||
|
||||
end subroutine m_{0[module_name]}_calculate_instant
|
||||
end subroutine m_{0[module_name]}_calculate_pass1
|
||||
|
||||
|
||||
subroutine m_{0[module_name]}_average_pass1 (nfiles)
|
||||
|
||||
integer :: nfiles
|
||||
real*8 :: denum
|
||||
|
||||
denum=real(nfiles*nyp*nzp)
|
||||
|
||||
{0[module_pass1_avg]}
|
||||
|
||||
end subroutine m_{0[module_name]}_average_pass1
|
||||
|
||||
|
||||
end module m_{0[module_name]}
|
||||
|
|
|
|||
|
|
@ -3,3 +3,4 @@
|
|||
c_auto = 1.0 - y
|
||||
wrate_auto = rxn_rate(c_auto)
|
||||
fsd_auto = sqrt (sqr(ddx(c_auto)) + sqr(ddy(c_auto)) + sqr(ddz(c_auto)))
|
||||
cbar = <c_auto>
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ real*8, allocatable, dimension(:,:,:) :: wrate_auto
|
|||
real*8, allocatable, dimension(:,:,:) :: ddz_c_auto
|
||||
real*8, allocatable, dimension(:,:,:) :: ddy_c_auto
|
||||
real*8, allocatable, dimension(:,:,:) :: ddx_c_auto
|
||||
real*8, allocatable, dimension(:) :: cbar
|
||||
|
||||
|
||||
contains
|
||||
|
|
@ -26,6 +27,7 @@ allocate(wrate_auto(nxp,nyp,nzp), stat=ierr) ; wrate_auto = 0.
|
|||
allocate(ddz_c_auto(nxp,nyp,nzp), stat=ierr) ; ddz_c_auto = 0.
|
||||
allocate(ddy_c_auto(nxp,nyp,nzp), stat=ierr) ; ddy_c_auto = 0.
|
||||
allocate(ddx_c_auto(nxp,nyp,nzp), stat=ierr) ; ddx_c_auto = 0.
|
||||
allocate(cbar(nxp), stat=ierr) ; cbar = 0.
|
||||
|
||||
|
||||
end subroutine m_terms_init
|
||||
|
|
@ -39,12 +41,13 @@ deallocate(wrate_auto)
|
|||
deallocate(ddz_c_auto)
|
||||
deallocate(ddy_c_auto)
|
||||
deallocate(ddx_c_auto)
|
||||
deallocate(cbar)
|
||||
|
||||
|
||||
end subroutine m_terms_finalize
|
||||
|
||||
|
||||
subroutine m_terms_calculate_instant
|
||||
subroutine m_terms_calculate_pass1
|
||||
|
||||
integer :: i, j, k
|
||||
|
||||
|
|
@ -58,6 +61,15 @@ end do
|
|||
end do
|
||||
|
||||
call ddy ( ddy_c_auto, c_auto )
|
||||
|
||||
do k = 1, nzp
|
||||
do j = 1, nyp
|
||||
do i = 1, nxp
|
||||
cbar(i) = cbar(i) + c_auto(i,j,k)
|
||||
end do
|
||||
end do
|
||||
end do
|
||||
|
||||
call ddz ( ddz_c_auto, c_auto )
|
||||
call ddx ( ddx_c_auto, c_auto )
|
||||
|
||||
|
|
@ -80,12 +92,25 @@ end do
|
|||
|
||||
|
||||
|
||||
end subroutine m_terms_calculate_instant
|
||||
end subroutine m_terms_calculate_pass1
|
||||
|
||||
|
||||
subroutine m_terms_average_pass1 (nfiles)
|
||||
|
||||
integer :: nfiles
|
||||
real*8 :: denum
|
||||
|
||||
denum=real(nfiles*nyp*nzp)
|
||||
|
||||
cbar = cbar / denum
|
||||
|
||||
|
||||
end subroutine m_terms_average_pass1
|
||||
|
||||
|
||||
end module m_terms
|
||||
|
||||
! {'c_auto': '( 1.0 - y(i,j,k) )', 'fsd_auto': '( sqrt ( ( ( ((ddx_c_auto(i,j,k))*(ddx_c_auto(i,j,k))) + ((ddy_c_auto(i,j,k))*(ddy_c_auto(i,j,k))) ) + ((ddz_c_auto(i,j,k))*(ddz_c_auto(i,j,k))) ) ) )', 'wrate_auto': '( rxn_rate ( c_auto(i,j,k) ) )'}
|
||||
! {'ddz_c_auto': ('ddz', 'c_auto'), 'ddy_c_auto': ('ddy', 'c_auto'), 'ddx_c_auto': ('ddx', 'c_auto')}
|
||||
! {'fsd_auto': ['ddx_c_auto', 'ddy_c_auto', 'ddz_c_auto'], 'ddz_c_auto': ['c_auto'], 'c_auto': [], 'ddy_c_auto': ['c_auto'], 'ddx_c_auto': ['c_auto'], 'wrate_auto': ['c_auto']}
|
||||
! ['c_auto', 'ddy_c_auto', 'ddz_c_auto', 'ddx_c_auto', 'fsd_auto', 'wrate_auto']
|
||||
! {'fsd_auto': ['ddx_c_auto', 'ddy_c_auto', 'ddz_c_auto'], 'ddz_c_auto': ['c_auto'], 'c_auto': [], 'ddy_c_auto': ['c_auto'], 'cbar': ['c_auto'], 'ddx_c_auto': ['c_auto'], 'wrate_auto': ['c_auto']}
|
||||
! ['c_auto', 'ddy_c_auto', 'cbar', 'ddz_c_auto', 'ddx_c_auto', 'fsd_auto', 'wrate_auto']
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@
|
|||
CALL CAL_SUM ! Sum for each fort.xxxx
|
||||
CALL SAVE_SUM ! Total sum
|
||||
|
||||
CALL m_terms_calculate_instant
|
||||
CALL m_terms_calculate_pass1
|
||||
|
||||
ENDIF
|
||||
|
||||
|
|
@ -85,6 +85,7 @@
|
|||
CALL AVERAGING
|
||||
|
||||
|
||||
CALL m_terms_average_pass1(countnum)
|
||||
|
||||
|
||||
secondloop: DO fread=startnum,endnum,skipnum
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue