def timestep(self): """ The timestep function computes the advective timestep (CFL) constraint. The CFL constraint says that information cannot propagate further than one zone per timestep. We use the driver.cfl parameter to control what fraction of the CFL step we actually take. """ cfl = self.rp.get_param("driver.cfl") # get the variables we need dens = self.cc_data.get_var("density") xmom = self.cc_data.get_var("x-momentum") ymom = self.cc_data.get_var("y-momentum") ener = self.cc_data.get_var("energy") # we need to compute the pressure u = xmom/dens v = ymom/dens e = (ener - 0.5*dens*(u*u + v*v))/dens gamma = self.rp.get_param("eos.gamma") p = eos.pres(gamma, dens, e) # HACK -- need to update -- this is not general # compute the sounds speed cs = np.sqrt(gamma*p/dens) # the timestep is min(dx/(|u| + cs), dy/(|v| + cs)) xtmp = self.cc_data.grid.dx/(abs(u) + cs) ytmp = self.cc_data.grid.dy/(abs(v) + cs) dt = cfl*min(xtmp.min(), ytmp.min()) return dt
def timestep(self): """ The timestep function computes the advective timestep (CFL) constraint. The CFL constraint says that information cannot propagate further than one zone per timestep. We use the driver.cfl parameter to control what fraction of the CFL step we actually take. """ cfl = self.rp.get_param("driver.cfl") # get the variables we need dens = self.cc_data.get_var("density") xmom = self.cc_data.get_var("x-momentum") ymom = self.cc_data.get_var("y-momentum") ener = self.cc_data.get_var("energy") # we need to compute the pressure u = xmom / dens v = ymom / dens e = (ener - 0.5 * dens * (u * u + v * v)) / dens gamma = self.rp.get_param("eos.gamma") p = eos.pres(gamma, dens, e) # HACK -- need to update -- this is not general # compute the sounds speed cs = np.sqrt(gamma * p / dens) # the timestep is min(dx/(|u| + cs), dy/(|v| + cs)) xtmp = self.cc_data.grid.dx / (abs(u) + cs) ytmp = self.cc_data.grid.dy / (abs(v) + cs) dt = cfl * min(xtmp.min(), ytmp.min()) return dt
def dovis(self): """ Do runtime visualization. """ plt.clf() plt.rc("font", size=10) dens = self.cc_data.get_var("density") xmom = self.cc_data.get_var("x-momentum") ymom = self.cc_data.get_var("y-momentum") ener = self.cc_data.get_var("energy") # get the velocities u = xmom / dens v = ymom / dens # get the pressure magvel = u**2 + v**2 # temporarily |U|^2 rhoe = (ener - 0.5 * dens * magvel) magvel = np.sqrt(magvel) e = rhoe / dens # HACK -- this needs to be generalized # access gamma from the cc_data object so we can use dovis # outside of a running simulation. gamma = self.cc_data.get_aux("gamma") p = eos.pres(gamma, dens, e) myg = self.cc_data.grid # figure out the geometry L_x = self.cc_data.grid.xmax - self.cc_data.grid.xmin L_y = self.cc_data.grid.ymax - self.cc_data.grid.ymin orientation = "vertical" shrink = 1.0 sparseX = 0 allYlabel = 1 if (L_x > 2 * L_y): # we want 4 rows: # rho # |U| # p # e fig, axes = plt.subplots(nrows=4, ncols=1, num=1) orientation = "horizontal" if (L_x > 4 * L_y): shrink = 0.75 onLeft = list(range(self.vars.nvar)) elif (L_y > 2 * L_x): # we want 4 columns: rho |U| p e fig, axes = plt.subplots(nrows=1, ncols=4, num=1) if (L_y >= 3 * L_x): shrink = 0.5 sparseX = 1 allYlabel = 0 onLeft = [0] else: # 2x2 grid of plots with # # rho |u| # p e fig, axes = plt.subplots(nrows=2, ncols=2, num=1) plt.subplots_adjust(hspace=0.25) onLeft = [0, 2] fields = [dens, magvel, p, e] field_names = [r"$\rho$", r"U", "p", "e"] for n in range(4): ax = axes.flat[n] v = fields[n] img = ax.imshow(np.transpose(v[myg.ilo:myg.ihi + 1, myg.jlo:myg.jhi + 1]), interpolation="nearest", origin="lower", extent=[myg.xmin, myg.xmax, myg.ymin, myg.ymax]) ax.set_xlabel("x") if n == 0: ax.set_ylabel("y") elif allYlabel: ax.set_ylabel("y") ax.set_title(field_names[n]) if not n in onLeft: ax.yaxis.offsetText.set_visible(False) if n > 0: ax.get_yaxis().set_visible(False) if sparseX: ax.xaxis.set_major_locator(plt.MaxNLocator(3)) plt.colorbar(img, ax=ax, orientation=orientation, shrink=shrink) plt.figtext(0.05, 0.0125, "t = %10.5f" % self.cc_data.t) plt.draw()
def dovis(self): """ Do runtime visualization. """ plt.clf() plt.rc("font", size=10) dens = self.cc_data.get_var("density") xmom = self.cc_data.get_var("x-momentum") ymom = self.cc_data.get_var("y-momentum") ener = self.cc_data.get_var("energy") # get the velocities u = xmom/dens v = ymom/dens # get the pressure magvel = u**2 + v**2 # temporarily |U|^2 rhoe = (ener - 0.5*dens*magvel) magvel = np.sqrt(magvel) e = rhoe/dens # HACK -- this needs to be generalized # access gamma from the cc_data object so we can use dovis # outside of a running simulation. gamma = self.cc_data.get_aux("gamma") p = eos.pres(gamma, dens, e) myg = self.cc_data.grid # figure out the geometry L_x = self.cc_data.grid.xmax - self.cc_data.grid.xmin L_y = self.cc_data.grid.ymax - self.cc_data.grid.ymin orientation = "vertical" shrink = 1.0 sparseX = 0 allYlabel = 1 if (L_x > 2*L_y): # we want 4 rows: # rho # |U| # p # e fig, axes = plt.subplots(nrows=4, ncols=1, num=1) orientation = "horizontal" if (L_x > 4*L_y): shrink = 0.75 onLeft = list(range(self.vars.nvar)) elif (L_y > 2*L_x): # we want 4 columns: rho |U| p e fig, axes = plt.subplots(nrows=1, ncols=4, num=1) if (L_y >= 3*L_x): shrink = 0.5 sparseX = 1 allYlabel = 0 onLeft = [0] else: # 2x2 grid of plots with # # rho |u| # p e fig, axes = plt.subplots(nrows=2, ncols=2, num=1) plt.subplots_adjust(hspace=0.25) onLeft = [0,2] fields = [dens, magvel, p, e] field_names = [r"$\rho$", r"U", "p", "e"] for n in range(4): ax = axes.flat[n] v = fields[n] img = ax.imshow(np.transpose(v[myg.ilo:myg.ihi+1, myg.jlo:myg.jhi+1]), interpolation="nearest", origin="lower", extent=[myg.xmin, myg.xmax, myg.ymin, myg.ymax]) ax.set_xlabel("x") if n == 0: ax.set_ylabel("y") elif allYlabel: ax.set_ylabel("y") ax.set_title(field_names[n]) if not n in onLeft: ax.yaxis.offsetText.set_visible(False) if n > 0: ax.get_yaxis().set_visible(False) if sparseX: ax.xaxis.set_major_locator(plt.MaxNLocator(3)) plt.colorbar(img, ax=ax, orientation=orientation, shrink=shrink) plt.figtext(0.05,0.0125, "t = %10.5f" % self.cc_data.t) plt.draw()