Source code for pyro.viscous_burgers.simulation

from pyro.burgers import Simulation as burgers_sim
from pyro.burgers import burgers_interface
from pyro.mesh import reconstruction
from pyro.viscous_burgers import interface


[docs] class Simulation(burgers_sim):
[docs] def evolve(self): """ Evolve the viscous burgers equation through one timestep. """ myg = self.cc_data.grid u = self.cc_data.get_var("x-velocity") v = self.cc_data.get_var("y-velocity") # -------------------------------------------------------------------------- # monotonized central differences # -------------------------------------------------------------------------- limiter = self.rp.get_param("advection.limiter") eps = self.rp.get_param("diffusion.eps") # Give da/dx and da/dy using input: (state, grid, direction, limiter) ldelta_ux = reconstruction.limit(u, myg, 1, limiter) ldelta_uy = reconstruction.limit(u, myg, 2, limiter) ldelta_vx = reconstruction.limit(v, myg, 1, limiter) ldelta_vy = reconstruction.limit(v, myg, 2, limiter) # Compute the advective fluxes # Get u, v fluxes # Get the interface states without transverse or diffusion corrections u_xl, u_xr, u_yl, u_yr, v_xl, v_xr, v_yl, v_yr = burgers_interface.get_interface_states(myg, self.dt, u, v, ldelta_ux, ldelta_vx, ldelta_uy, ldelta_vy) # Apply diffusion correction terms to the interface states u_xl, u_xr, u_yl, u_yr, v_xl, v_xr, v_yl, v_yr = interface.apply_diffusion_corrections(myg, self.dt, eps, u, v, u_xl, u_xr, u_yl, u_yr, v_xl, v_xr, v_yl, v_yr) # Apply transverse correction terms to the interface states u_xl, u_xr, u_yl, u_yr, v_xl, v_xr, v_yl, v_yr = burgers_interface.apply_transverse_corrections(myg, self.dt, u_xl, u_xr, u_yl, u_yr, v_xl, v_xr, v_yl, v_yr) # Construct the interface fluxes u_flux_x, u_flux_y, v_flux_x, v_flux_y = burgers_interface.construct_unsplit_fluxes(myg, u_xl, u_xr, u_yl, u_yr, v_xl, v_xr, v_yl, v_yr) # Compute the advective source terms for diffusion using flux computed above A_u = myg.scratch_array() A_v = myg.scratch_array() A_u.v()[:, :] = (u_flux_x.ip(1) - u_flux_x.v()) / myg.dx + \ (u_flux_y.jp(1) - u_flux_y.v()) / myg.dy A_v.v()[:, :] = (v_flux_x.ip(1) - v_flux_x.v()) / myg.dx + \ (v_flux_y.jp(1) - v_flux_y.v()) / myg.dy # Update state by doing diffusion update with extra advective source term. interface.diffuse(self.cc_data, self.rp, self.dt, "x-velocity", A_u) interface.diffuse(self.cc_data, self.rp, self.dt, "y-velocity", A_v) if self.particles is not None: u2d = self.cc_data.get_var("x-velocity") v2d = self.cc_data.get_var("y-velocity") self.particles.update_particles(self.dt, u2d, v2d) # increment the time self.cc_data.t += self.dt self.n += 1