diff --git a/code/code_gen/code_gen.py b/code/code_gen/code_gen.py index 687e063..bfd5e37 100644 --- a/code/code_gen/code_gen.py +++ b/code/code_gen/code_gen.py @@ -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: diff --git a/code/code_gen/resources/m_template.f90 b/code/code_gen/resources/m_template.f90 index f5316dc..fb49c64 100644 --- a/code/code_gen/resources/m_template.f90 +++ b/code/code_gen/resources/m_template.f90 @@ -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]} diff --git a/code/code_gen/terms.input b/code/code_gen/terms.input index 2bb19a6..d3f1f32 100644 --- a/code/code_gen/terms.input +++ b/code/code_gen/terms.input @@ -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 = diff --git a/code/m_terms.f90 b/code/m_terms.f90 index 3f83f8f..881852c 100644 --- a/code/m_terms.f90 +++ b/code/m_terms.f90 @@ -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'] diff --git a/code/post.f90 b/code/post.f90 index 0905a0c..b5e2e3c 100644 --- a/code/post.f90 +++ b/code/post.f90 @@ -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