simple average implemented

This commit is contained in:
ignis 2019-04-22 03:50:36 +09:00
parent 4ae6c1e95c
commit 05c6088a09
5 changed files with 109 additions and 12 deletions

View file

@ -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:

View file

@ -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]}

View file

@ -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>

View file

@ -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']

View file

@ -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