def dq_hyperbolic(self,state): r""" Compute dq/dt * (delta t) for the hyperbolic hyperbolic system. Note that the capa array, if present, should be located in the aux variable. Indexing works like this (here num_ghost=2 as an example):: 0 1 2 3 4 mx+num_ghost-2 mx+num_ghost mx+num_ghost+2 | mx+num_ghost-1 | mx+num_ghost+1 | | | | | ... | | | | | 0 1 | 2 3 mx+num_ghost-2 |mx+num_ghost mx+num_ghost-1 mx+num_ghost+1 The top indices represent the values that are located on the grid cell boundaries such as waves, s and other Riemann problem values, the bottom for the cell centered values such as q. In particular the ith grid cell boundary has the following related information:: i-1 i i+1 | | | | i-1 | i | | | | Again, grid cell boundary quantities are at the top, cell centered values are in the cell. """ import numpy as np self._apply_q_bcs(state) if state.num_aux > 0: self._apply_aux_bcs(state) q = self.qbc grid = state.grid mx = grid.num_cells[0] ixy=1 if self.kernel_language=='Fortran': rp1 = self.rp.rp1._cpointer dq,cfl=self.fmod.flux1(q,self.auxbc,self.dt,state.t,ixy,mx,self.num_ghost,mx,rp1) elif self.kernel_language=='Python': dtdx = np.zeros( (mx+2*self.num_ghost) ,order='F') dq = np.zeros( (state.num_eqn,mx+2*self.num_ghost) ,order='F') # Find local value for dt/dx if state.index_capa>=0: dtdx = self.dt / (grid.delta[0] * state.aux[state.index_capa,:]) else: dtdx += self.dt/grid.delta[0] aux=self.auxbc if aux.shape[0]>0: aux_l=aux[:,:-1] aux_r=aux[:,1: ] else: aux_l = None aux_r = None #Reconstruct (wave reconstruction uses a Riemann solve) if self.lim_type==-1: #1st-order Godunov ql=q; qr=q elif self.lim_type==0: #Unlimited reconstruction raise NotImplementedError('Unlimited reconstruction not implemented') elif self.lim_type==1: #TVD Reconstruction raise NotImplementedError('TVD reconstruction not implemented') elif self.lim_type==2: #WENO Reconstruction if self.char_decomp==0: #No characteristic decomposition ql,qr=recon.weno(5,q) elif self.char_decomp==1: #Wave-based reconstruction q_l=q[:,:-1] q_r=q[:,1: ] wave,s,amdq,apdq = self.rp(q_l,q_r,aux_l,aux_r,state.problem_data) ql,qr=recon.weno5_wave(q,wave,s) elif self.char_decomp==2: #Characteristic-wise reconstruction raise NotImplementedError # Solve Riemann problem at each interface q_l=qr[:,:-1] q_r=ql[:,1: ] wave,s,amdq,apdq = self.rp(q_l,q_r,aux_l,aux_r,state.problem_data) # Loop limits for local portion of grid # THIS WON'T WORK IN PARALLEL! LL = self.num_ghost - 1 UL = grid.num_cells[0] + self.num_ghost + 1 # Compute maximum wave speed cfl = 0.0 for mw in xrange(self.num_waves): smax1 = np.max( dtdx[LL :UL] *s[mw,LL-1:UL-1]) smax2 = np.max(-dtdx[LL-1:UL-1]*s[mw,LL-1:UL-1]) cfl = max(cfl,smax1,smax2) #Find total fluctuation within each cell wave,s,amdq2,apdq2 = self.rp(ql,qr,aux,aux,state.problem_data) # Compute dq for m in xrange(state.num_eqn): dq[m,LL:UL] = -dtdx[LL:UL]*(amdq[m,LL:UL] + apdq[m,LL-1:UL-1] \ + apdq2[m,LL:UL] + amdq2[m,LL:UL]) else: raise Exception('Unrecognized value of solver.kernel_language.') self.cfl.update_global_max(cfl) return dq[:,self.num_ghost:-self.num_ghost]
def dq_hyperbolic(self,state): r""" Compute dq/dt * (delta t) for the hyperbolic hyperbolic system. Note that the capa array, if present, should be located in the aux variable. Indexing works like this (here num_ghost=2 as an example):: 0 1 2 3 4 mx+num_ghost-2 mx+num_ghost mx+num_ghost+2 | mx+num_ghost-1 | mx+num_ghost+1 | | | | | ... | | | | | 0 1 | 2 3 mx+num_ghost-2 |mx+num_ghost mx+num_ghost-1 mx+num_ghost+1 The top indices represent the values that are located on the grid cell boundaries such as waves, s and other Riemann problem values, the bottom for the cell centered values such as q. In particular the ith grid cell boundary has the following related information:: i-1 i i+1 | | | | i-1 | i | | | | Again, grid cell boundary quantities are at the top, cell centered values are in the cell. """ import numpy as np self._apply_bcs(state) q = self.qbc aux = self.auxbc grid = state.grid mx = grid.num_cells[0] ixy=1 if self.kernel_language=='Fortran': rp1 = self.rp.rp1._cpointer if self.tfluct_solver: tfluct1 = self.tfluct.tfluct1._cpointer else: tfluct1 = self.tfluct dq,cfl=self.fmod.flux1(q,self.auxbc,self.dt,state.t,ixy,mx,self.num_ghost,mx,rp1,tfluct1) elif self.kernel_language=='Python': dtdx = np.zeros( (mx+2*self.num_ghost) ,order='F') dq = np.zeros( (state.num_eqn,mx+2*self.num_ghost) ,order='F') # Find local value for dt/dx if state.index_capa>=0: dtdx = self.dt / (grid.delta[0] * aux[state.index_capa,:]) else: dtdx += self.dt/grid.delta[0] if aux.shape[0]>0: aux_l=aux[:,:-1] aux_r=aux[:,1: ] else: aux_l = None aux_r = None #Reconstruct (wave reconstruction uses a Riemann solve) if self.lim_type==-1: #1st-order Godunov ql=q; qr=q elif self.lim_type==0: #Unlimited reconstruction raise NotImplementedError('Unlimited reconstruction not implemented') elif self.lim_type==1: #TVD Reconstruction raise NotImplementedError('TVD reconstruction not implemented') elif self.lim_type==2: #WENO Reconstruction if self.char_decomp==0: #No characteristic decomposition ql,qr=recon.weno(5,q) elif self.char_decomp==1: #Wave-based reconstruction q_l=q[:,:-1] q_r=q[:,1: ] wave,s,amdq,apdq = self.rp(q_l,q_r,aux_l,aux_r,state.problem_data) ql,qr=recon.weno5_wave(q,wave,s) elif self.char_decomp==2: #Characteristic-wise reconstruction raise NotImplementedError # Solve Riemann problem at each interface q_l=qr[:,:-1] q_r=ql[:,1: ] wave,s,amdq,apdq = self.rp(q_l,q_r,aux_l,aux_r,state.problem_data) # Loop limits for local portion of grid # THIS WON'T WORK IN PARALLEL! LL = self.num_ghost - 1 UL = grid.num_cells[0] + self.num_ghost + 1 # Compute maximum wave speed cfl = 0.0 for mw in range(self.num_waves): smax1 = np.max( dtdx[LL :UL] *s[mw,LL-1:UL-1]) smax2 = np.max(-dtdx[LL-1:UL-1]*s[mw,LL-1:UL-1]) cfl = max(cfl,smax1,smax2) #Find total fluctuation within each cell wave,s,amdq2,apdq2 = self.rp(ql,qr,aux,aux,state.problem_data) # Compute dq for m in range(state.num_eqn): dq[m,LL:UL] = -dtdx[LL:UL]*(amdq[m,LL:UL] + apdq[m,LL-1:UL-1] \ + apdq2[m,LL:UL] + amdq2[m,LL:UL]) else: raise Exception('Unrecognized value of solver.kernel_language.') self.cfl.update_global_max(cfl) return dq[:,self.num_ghost:-self.num_ghost]