diff --git a/docs/source/pyro.compressible_sr.problems.rst b/docs/source/pyro.compressible_sr.problems.rst deleted file mode 100644 index d84ab281a..000000000 --- a/docs/source/pyro.compressible_sr.problems.rst +++ /dev/null @@ -1,114 +0,0 @@ -pyro.compressible\_sr.problems package -====================================== - -.. automodule:: pyro.compressible_sr.problems - :members: - :undoc-members: - :show-inheritance: - -Submodules ----------- - -pyro.compressible\_sr.problems.acoustic\_pulse module ------------------------------------------------------ - -.. automodule:: pyro.compressible_sr.problems.acoustic_pulse - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.advect module --------------------------------------------- - -.. automodule:: pyro.compressible_sr.problems.advect - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.bubble module --------------------------------------------- - -.. automodule:: pyro.compressible_sr.problems.bubble - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.gresho module --------------------------------------------- - -.. automodule:: pyro.compressible_sr.problems.gresho - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.hse module ------------------------------------------ - -.. automodule:: pyro.compressible_sr.problems.hse - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.kh module ----------------------------------------- - -.. automodule:: pyro.compressible_sr.problems.kh - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.logo module ------------------------------------------- - -.. automodule:: pyro.compressible_sr.problems.logo - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.quad module ------------------------------------------- - -.. automodule:: pyro.compressible_sr.problems.quad - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.rt module ----------------------------------------- - -.. automodule:: pyro.compressible_sr.problems.rt - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.rt2 module ------------------------------------------ - -.. automodule:: pyro.compressible_sr.problems.rt2 - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.sedov module -------------------------------------------- - -.. automodule:: pyro.compressible_sr.problems.sedov - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.sod module ------------------------------------------ - -.. automodule:: pyro.compressible_sr.problems.sod - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.problems.test module ------------------------------------------- - -.. automodule:: pyro.compressible_sr.problems.test - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/pyro.compressible_sr.rst b/docs/source/pyro.compressible_sr.rst deleted file mode 100644 index 141a9f065..000000000 --- a/docs/source/pyro.compressible_sr.rst +++ /dev/null @@ -1,74 +0,0 @@ -pyro.compressible\_sr package -============================= - -.. automodule:: pyro.compressible_sr - :members: - :undoc-members: - :show-inheritance: - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - pyro.compressible_sr.problems - -Submodules ----------- - -pyro.compressible\_sr.BC module -------------------------------- - -.. automodule:: pyro.compressible_sr.BC - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.c2p module --------------------------------- - -.. automodule:: pyro.compressible_sr.c2p - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.derives module ------------------------------------- - -.. automodule:: pyro.compressible_sr.derives - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.eos module --------------------------------- - -.. automodule:: pyro.compressible_sr.eos - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.interface module --------------------------------------- - -.. automodule:: pyro.compressible_sr.interface - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.simulation module ---------------------------------------- - -.. automodule:: pyro.compressible_sr.simulation - :members: - :undoc-members: - :show-inheritance: - -pyro.compressible\_sr.unsplit\_fluxes module --------------------------------------------- - -.. automodule:: pyro.compressible_sr.unsplit_fluxes - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/pyro.rst b/docs/source/pyro.rst index 1d8831dcb..8eb6a8872 100644 --- a/docs/source/pyro.rst +++ b/docs/source/pyro.rst @@ -24,7 +24,6 @@ Subpackages pyro.compressible_react pyro.compressible_rk pyro.compressible_sdc - pyro.compressible_sr pyro.diffusion pyro.incompressible pyro.incompressible_viscous diff --git a/pyro/compressible_sr/BC.py b/pyro/compressible_sr/BC.py deleted file mode 100644 index 9eff1891d..000000000 --- a/pyro/compressible_sr/BC.py +++ /dev/null @@ -1,273 +0,0 @@ -""" -compressible-specific boundary conditions. Here, in particular, we -implement an HSE BC in the vertical direction. - -Note: the pyro BC routines operate on a single variable at a time, so -some work will necessarily be repeated. - -Also note: we may come in here with the aux_data (source terms), so -we'll do a special case for them - -""" - -import math - -import numpy as np - -import pyro.compressible_sr.unsplit_fluxes as flx -from pyro.compressible_sr import eos -from pyro.util import msg - - -def user(bc_name, bc_edge, variable, ccdata, ivars): - """ - A hydrostatic boundary. This integrates the equation of HSE into - the ghost cells to get the pressure and density under the assumption - that the specific internal energy is constant. - - Upon exit, the ghost cells for the input variable will be set - - Parameters - ---------- - bc_name : {'hse'} - The descriptive name for the boundary condition -- this allows - for pyro to have multiple types of user-supplied boundary - conditions. For this module, it needs to be 'hse'. - bc_edge : {'ylb', 'yrb'} - The boundary to update: ylb = lower y boundary; yrb = upper y - boundary. - variable : {'density', 'x-momentum', 'y-momentum', 'energy'} - The variable whose ghost cells we are filling - ccdata : CellCenterData2d object - The data object - - """ - # pylint: disable=too-many-nested-blocks - - myg = ccdata.grid - - if bc_name == "hse": - - if bc_edge == "ylb": - - # lower y boundary - - # we will take the density to be constant, the velocity to - # be outflow, and the pressure to be in HSE - if variable in ["density", "x-momentum", "y-momentum", "ymom_src", "E_src", "fuel", "ash"]: - v = ccdata.get_var(variable) - j = myg.jlo-1 - while j >= 0: - v[:, j] = v[:, myg.jlo] - j -= 1 - - elif variable == "energy": - # dens = ccdata.get_var("density") - # xmom = ccdata.get_var("x-momentum") - # ymom = ccdata.get_var("y-momentum") - ener = ccdata.get_var("energy") - - grav = ccdata.get_aux("grav") - gamma = ccdata.get_aux("gamma") - - q = flx.cons_to_prim_wrapper(ccdata.data, gamma, ivars, myg) - - rho = q[:, :, ivars.irho] - u = q[:, myg.jlo, ivars.iu] - v = q[:, myg.jlo, ivars.iv] - p = q[:, :, ivars.ip] - - dens_base = rho[:, myg.jlo] - # ke_base = 0.5*(u[:, myg.jlo]**2 + v[:, myg.jlo]**2) * rho[:, myg.jlo] - - # eint_base = (ener[:, myg.jlo] - ke_base)/dens[:, myg.jlo] - # pres_base = eos.pres(gamma, dens_base, eint_base) - pres_base = p[:, myg.jlo] - - # we are assuming that the density is constant in this - # formulation of HSE, so the pressure comes simply from - # differencing the HSE equation - W = np.sqrt(1-u**2-v**2) - j = myg.jlo-1 - while j >= 0: - pres_below = pres_base - grav*dens_base*myg.dy - rhoh = eos.rhoh_from_rho_p(gamma, dens_base, pres_below) - - ener[:, j] = rhoh*W**2 - pres_below - dens_base - - pres_base = pres_below.copy() - - j -= 1 - - else: - raise NotImplementedError("variable not defined") - - elif bc_edge == "yrb": - - # upper y boundary - - # we will take the density to be constant, the velocity to - # be outflow, and the pressure to be in HSE - if variable in ["density", "x-momentum", "y-momentum", "ymom_src", "E_src", "fuel", "ash"]: - v = ccdata.get_var(variable) - for j in range(myg.jhi+1, myg.jhi+myg.ng+1): - v[:, j] = v[:, myg.jhi] - - elif variable == "energy": - # dens = ccdata.get_var("density") - # xmom = ccdata.get_var("x-momentum") - # ymom = ccdata.get_var("y-momentum") - ener = ccdata.get_var("energy") - - grav = ccdata.get_aux("grav") - gamma = ccdata.get_aux("gamma") - - q = flx.cons_to_prim_wrapper(ccdata.data, gamma, ivars, myg) - - rho = q[:, :, ivars.irho] - u = q[:, myg.jhi, ivars.iu] - v = q[:, myg.jhi, ivars.iv] - p = q[:, :, ivars.ip] - - dens_base = rho[:, myg.jhi] - # ke_base = 0.5*(xmom[:, myg.jhi]**2 + ymom[:, myg.jhi]**2) / \ - # dens[:, myg.jhi] - - # eint_base = (ener[:, myg.jhi] - ke_base)/dens[:, myg.jhi] - # pres_base = eos.pres(gamma, dens_base, eint_base) - pres_base = p[:, myg.jhi] - - # we are assuming that the density is constant in this - # formulation of HSE, so the pressure comes simply from - # differencing the HSE equation - W = np.sqrt(1-u**2-v**2) - for j in range(myg.jhi+1, myg.jhi+myg.ng+1): - pres_above = pres_base + grav*dens_base*myg.dy - # rhoe = eos.rhoe(gamma, pres_above) - rhoh = eos.rhoh_from_rho_p(gamma, dens_base, pres_above) - - # ener[:, j] = rhoe + ke_base - ener[:, j] = rhoh*W**2 - pres_above - dens_base - - pres_base = pres_above.copy() - - else: - raise NotImplementedError("variable not defined") - - else: - msg.fail("error: hse BC not supported for xlb or xrb") - - elif bc_name == "ramp": - # Boundary conditions for double Mach reflection problem - - gamma = ccdata.get_aux("gamma") - - if bc_edge == "xlb": - # lower x boundary - # inflow condition with post shock setup - - v = ccdata.get_var(variable) - i = myg.ilo - 1 - if variable in ["density", "x-momentum", "y-momentum", "energy"]: - val = inflow_post_bc(variable, gamma) - while i >= 0: - v[i, :] = val - i = i - 1 - else: - v[:, :] = 0.0 # no source term - - elif bc_edge == "ylb": - # lower y boundary - # for x > 1./6., reflective boundary - # for x < 1./6., inflow with post shock setup - - if variable in ["density", "x-momentum", "y-momentum", "energy"]: - v = ccdata.get_var(variable) - j = myg.jlo - 1 - jj = 0 - while j >= 0: - xcen_l = myg.x < 1.0/6.0 - xcen_r = myg.x >= 1.0/6.0 - v[xcen_l, j] = inflow_post_bc(variable, gamma) - - if variable == "y-momentum": - v[xcen_r, j] = -1.0*v[xcen_r, myg.jlo+jj] - else: - v[xcen_r, j] = v[xcen_r, myg.jlo+jj] - j = j - 1 - jj = jj + 1 - else: - v = ccdata.get_var(variable) - v[:, :] = 0.0 # no source term - - elif bc_edge == "yrb": - # upper y boundary - # time-dependent boundary, the shockfront moves with a 10 mach velocity forming an angle - # to the x-axis of 30 degrees clockwise. - # x coordinate of the grid is used to judge whether the cell belongs to pure post shock area, - # the pure pre shock area or the mixed area. - - if variable in ["density", "x-momentum", "y-momentum", "energy"]: - v = ccdata.get_var(variable) - for j in range(myg.jhi+1, myg.jhi+myg.ng+1): - shockfront_up = 1.0/6.0 + (myg.y[j] + 0.5*myg.dy*math.sqrt(3))/math.tan(math.pi/3.0) \ - + (10.0/math.sin(math.pi/3.0))*ccdata.t - shockfront_down = 1.0/6.0 + (myg.y[j] - 0.5*myg.dy*math.sqrt(3))/math.tan(math.pi/3.0) \ - + (10.0/math.sin(math.pi/3.0))*ccdata.t - shockfront = np.array([shockfront_down, shockfront_up]) - for i in range(myg.ihi+myg.ng+1): - v[i, j] = 0.0 - cx_down = myg.x[i] - 0.5*myg.dx*math.sqrt(3) - cx_up = myg.x[i] + 0.5*myg.dx*math.sqrt(3) - cx = np.array([cx_down, cx_up]) - - for sf in shockfront: - for x in cx: - if x < sf: - v[i, j] = v[i, j] + 0.25*inflow_post_bc(variable, gamma) - else: - v[i, j] = v[i, j] + 0.25*inflow_pre_bc(variable, gamma) - else: - v = ccdata.get_var(variable) - v[:, :] = 0.0 # no source term - - else: - msg.fail("error: bc type %s not supported" % (bc_name)) - - -def inflow_post_bc(var, g): - # inflow boundary condition with post shock setup - r_l = 8.0 - u_l = 7.1447096 - v_l = -4.125 - p_l = 116.5 - if var == "density": - vl = r_l - elif var == "x-momentum": - vl = r_l*u_l - elif var == "y-momentum": - vl = r_l*v_l - elif var == "energy": - vl = p_l/(g - 1.0) + 0.5*r_l*(u_l*u_l + v_l*v_l) - else: - vl = 0.0 - return vl - - -def inflow_pre_bc(var, g): - # pre shock setup - r_r = 1.4 - u_r = 0.0 - v_r = 0.0 - p_r = 1.0 - if var == "density": - vl = r_r - elif var == "x-momentum": - vl = r_r*u_r - elif var == "y-momentum": - vl = r_r*v_r - elif var == "energy": - vl = p_r/(g - 1.0) + 0.5*r_r*(u_r*u_r + v_r*v_r) - else: - vl = 0.0 - return vl diff --git a/pyro/compressible_sr/__init__.py b/pyro/compressible_sr/__init__.py deleted file mode 100644 index 18875ff83..000000000 --- a/pyro/compressible_sr/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -The pyro compressible hydrodynamics solver. This implements the -second-order (piecewise-linear), unsplit method of Colella 1990. - -""" - -__all__ = ["simulation"] -from .simulation import Simulation diff --git a/pyro/compressible_sr/_defaults b/pyro/compressible_sr/_defaults deleted file mode 100644 index 5b988c9c4..000000000 --- a/pyro/compressible_sr/_defaults +++ /dev/null @@ -1,22 +0,0 @@ -[driver] -cfl = 0.8 - - -[eos] -gamma = 1.4 ; pres = rho ener (gamma - 1) - - -[compressible] -use_flattening = 0 ; apply flattening at shocks (1) - -z0 = 0.75 ; flattening z0 parameter -z1 = 0.85 ; flattening z1 parameter -delta = 0.33 ; flattening delta parameter - -cvisc = 0.1 ; artificial viscosity coefficient - -limiter = 2 ; limiter (0 = none, 1 = 2nd order, 2 = 4th order) - -grav = 0.0 ; gravitational acceleration (in y-direction) - -riemann = HLLC ; HLLC or CGF diff --git a/pyro/compressible_sr/c2p.py b/pyro/compressible_sr/c2p.py deleted file mode 100644 index a372b5fe4..000000000 --- a/pyro/compressible_sr/c2p.py +++ /dev/null @@ -1,169 +0,0 @@ -import numpy as np -from numba import njit - - -@njit(cache=True) -def f(p, U_ij, gamma, idens, ixmom, iymom, iener): - """ - Function whose root needs to be found for cons to prim - """ - - D = U_ij[idens] - tau = U_ij[iener] - - if abs(tau+p) < 1.e-6: - u = U_ij[ixmom] - v = U_ij[iymom] - else: - u = U_ij[ixmom] / (tau + p + D) - v = U_ij[iymom] / (tau + p + D) - - # Lorentz factor - W = 1.0 / np.sqrt(1.0 - u**2 - v**2) - - return (gamma - 1.0) * (tau + D*(1.0-W) + p*(1.0-W**2)) / W**2 - p - - -@njit(cache=True) -def brentq(x1, b, U, gamma, idens, ixmom, iymom, iener, - TOL=1.e-6, ITMAX=100): - """ - Root finder using Brent's method - """ - - # initialize variables - a = x1 - c = 0.0 - d = 0.0 - fa = f(a, U, gamma, idens, ixmom, iymom, iener) - fb = f(b, U, gamma, idens, ixmom, iymom, iener) - fc = 0.0 - - # root found - if fa * fb >= 0.0: - return x1 - - # switch variables - if abs(fa) < abs(fb): - a, b = b, a - fa, fb = fb, fa - - c = a - fc = fa - - mflag = True - - for _ in range(ITMAX): - if fa != fc and fb != fc: # pylint: disable=consider-using-in - s = a*fb*fc / ((fa-fb) * (fa-fc)) + b*fa*fc / ((fb-fa)*(fb-fc)) + \ - c*fa*fb / ((fc-fa)*(fc-fb)) - else: - s = b - fb * (b-a) / (fb-fa) - - # test conditions and store in con1-con5 - con1 = False - - if 0.25 * (3.0 * a + b) < b: - if s < 0.25 * (3.0 * a + b) or s > b: - con1 = True - elif s < b or s > 0.25 * (3.0 * a + b): - con1 = True - - con2 = mflag and abs(s-b) >= 0.5 * abs(b-c) - - con3 = (not mflag) and abs(s-b) >= 0.5 * abs(c-d) - - con4 = mflag and abs(b-c) < TOL - - con5 = (not mflag) and abs(c-d) < TOL - - if con1 or con2 or con3 or con4 or con5: - s = 0.5 * (a + b) - mflag = True - else: - mflag = False - - # evaluate at midpoint and set new limits - fs = f(s, U, gamma, idens, ixmom, iymom, iener) - - if abs(fa) < abs(fb): - a, b = b, a - fa, fb = fb, fa - - d = c - c = b - fc = fb - - if fa * fs < 0.0: - b = s - fb = fs - else: - a = s - fa = fs - - # found solution to required tolerance - if fb == 0.0 or fs == 0.0 or abs(b-a) < TOL: - return b - - return x1 - - -@njit(cache=True) -def cons_to_prim(U, - irho, iu, iv, ip, ix, irhox, - idens, ixmom, iymom, iener, - naux, gamma, q, smallp=1.e-6): - """ - convert an input vector of conserved variables to primitive variables - """ - - qx, qy, _ = U.shape - - for j in range(qy): - for i in range(qx): - pmax = max((gamma-1.0)*U[i, j, iener]*1.0000000001, smallp) - - pmin = max(min(1.0e-6*pmax, smallp), np.sqrt(U[i, j, ixmom] ** - 2+U[i, j, iymom]**2) - U[i, j, iener] - U[i, j, idens]) - - fmin = f(pmin, U[i, j, :], gamma, idens, ixmom, iymom, iener) - fmax = f(pmax, U[i, j, :], gamma, idens, ixmom, iymom, iener) - - if fmin * fmax > 0.0: - pmin = pmin * 1.0e-2 - fmin = f(pmin, U[i, j, :], gamma, idens, ixmom, iymom, iener) - - if fmin * fmax > 0.0: - pmax = min(pmax*1.0e2, 1.0) - - if fmin * fmax > 0.0: - q[i, j, ip] = max((gamma-1.0)*U[i, j, iener], smallp) - else: - q[i, j, ip] = brentq(pmin, pmax, U[i, j, :], gamma, idens, ixmom, iymom, iener) - - if (q[i, j, ip] != q[i, j, ip]) or \ - (q[i, j, ip]-1.0 == q[i, j, ip]) or \ - (abs(q[i, j, ip]) > 1.0e10): # nan or infty alert - q[i, j, ip] = max((gamma-1.0)*U[i, j, iener], smallp) - - q[i, j, ip] = max(q[i, j, ip], smallp) - if abs(U[i, j, iener] + U[i, j, idens] + q[i, j, ip]) < 1.0e-5: - q[i, j, iu] = U[i, j, ixmom] - q[i, j, iv] = U[i, j, iymom] - else: - q[i, j, iu] = U[i, j, ixmom]/(U[i, j, iener] + U[i, j, idens] + q[i, j, ip]) - q[i, j, iv] = U[i, j, iymom]/(U[i, j, iener] + U[i, j, idens] + q[i, j, ip]) - - # nan check - if (q[i, j, iu] != q[i, j, iu]): - q[i, j, iu] = 0.0 - - if (q[i, j, iv] != q[i, j, iv]): - q[i, j, iv] = 0.0 - - W = 1.0/np.sqrt(1.0 - q[:, :, iu]**2 - q[:, :, iv]**2) - - q[:, :, irho] = U[:, :, idens] / W - if naux > 0: - for i in range(naux): - q[:, :, ix+i] = U[:, :, irhox+i]/(q[:, :, irho] * W) diff --git a/pyro/compressible_sr/derives.py b/pyro/compressible_sr/derives.py deleted file mode 100644 index 8e21aca3b..000000000 --- a/pyro/compressible_sr/derives.py +++ /dev/null @@ -1,57 +0,0 @@ -import numpy as np - -import pyro.compressible_sr.unsplit_fluxes as flx -from pyro.compressible_sr import eos - - -def derive_primitives(myd, varnames, ivars, myg): - """ - derive desired primitive variables from conserved state - """ - - # get the variables we need - gamma = myd.get_aux("gamma") - - q = flx.cons_to_prim_wrapper(myd.data, gamma, ivars, myg) - - derived_vars = [] - - dens = q[:, :, ivars.irho] - u = q[:, :, ivars.iu] - v = q[:, :, ivars.iv] - p = q[:, :, ivars.ip] - try: - e = eos.rhoe(gamma, p)/dens - except FloatingPointError: - p[:, :] = myd.data[:, :, ivars.iener] * (gamma-1) - e = myd.data[:, :, ivars.iener] # p / (gamma - 1) - - gamma = myd.get_aux("gamma") - if isinstance(varnames, str): - wanted = [varnames] - else: - wanted = list(varnames) - - for var in wanted: - - if var == "velocity": - derived_vars.append(u) - derived_vars.append(v) - - elif var in ["e", "eint"]: - derived_vars.append(e) - - elif var in ["p", "pressure"]: - derived_vars.append(p) - - elif var == "primitive": - derived_vars.append(dens) - derived_vars.append(u) - derived_vars.append(v) - derived_vars.append(p) - - elif var == "soundspeed": - derived_vars.append(np.sqrt(gamma*p/dens)) - if len(derived_vars) > 1: - return derived_vars - return derived_vars[0] diff --git a/pyro/compressible_sr/eos.py b/pyro/compressible_sr/eos.py deleted file mode 100644 index 88fd6735f..000000000 --- a/pyro/compressible_sr/eos.py +++ /dev/null @@ -1,85 +0,0 @@ -""" -This is a gamma-law equation of state: p = rho e (gamma - 1), where -gamma is the constant ratio of specific heats. -""" - - -def pres(gamma, rho, eint): - """ - Given the density and the specific internal energy, return the - pressure - - Parameters - ---------- - gamma : float - The ratio of specific heats - rho : float - The density - eint : float - The specific internal energy - - Returns - ------- - out : float - The pressure - - """ - return rho * eint * (gamma - 1.0) - - -def dens(gamma, p, eint): - """ - Given the pressure and the specific internal energy, return - the density - - Parameters - ---------- - gamma : float - The ratio of specific heats - p : float - The pressure - eint : float - The specific internal energy - - Returns - ------- - out : float - The density - - """ - return p / (eint * (gamma - 1.0)) - - -def rhoe(gamma, p): - """ - Given the pressure, return (rho * e) - - Parameters - ---------- - gamma : float - The ratio of specific heats - p : float - The pressure - - Returns - ------- - out : float - The internal energy density, rho e - - """ - return p / (gamma - 1.0) - - -def h_from_eps(gamma, eint): - """ - Given rho and internal energy, return h - """ - - return 1 + gamma * eint - - -def rhoh_from_rho_p(gamma, rho, p): - """ - Given rho and p, return h - """ - return rho + gamma / (gamma - 1) * p diff --git a/pyro/compressible_sr/interface.py b/pyro/compressible_sr/interface.py deleted file mode 100644 index f149e40eb..000000000 --- a/pyro/compressible_sr/interface.py +++ /dev/null @@ -1,1236 +0,0 @@ -import numpy as np -from numba import njit - - -@njit(cache=True) -def states(idir, ng, dx, dt, - irho, iu, iv, ip, iX, nspec, - gamma, qv, Uv, dUv): - r""" - predict the cell-centered state to the edges in one-dimension - using the reconstructed, limited slopes. - - We follow the convection here that ``V_l[i]`` is the left state at the - i-1/2 interface and ``V_l[i+1]`` is the left state at the i+1/2 - interface. - - We need the left and right eigenvectors and the eigenvalues for - the system projected along the x-direction. - - Taking our state vector as :math:`Q = (\rho, u, v, p)^T`, the eigenvalues - are :math:`u - c`, :math:`u`, :math:`u + c`. - - We look at the equations of hydrodynamics in a split fashion -- - i.e., we only consider one dimension at a time. - - Considering advection in the x-direction, the Jacobian matrix for - the primitive variable formulation of the Euler equations - projected in the x-direction is:: - - / u r 0 0 \ - | 0 u 0 1/r | - A = | 0 0 u 0 | - \ 0 rc^2 0 u / - - The right eigenvectors are:: - - / 1 \ / 1 \ / 0 \ / 1 \ - |-c/r | | 0 | | 0 | | c/r | - r1 = | 0 | r2 = | 0 | r3 = | 1 | r4 = | 0 | - \ c^2 / \ 0 / \ 0 / \ c^2 / - - In particular, we see from r3 that the transverse velocity (v in - this case) is simply advected at a speed u in the x-direction. - - The left eigenvectors are:: - - l1 = ( 0, -r/(2c), 0, 1/(2c^2) ) - l2 = ( 1, 0, 0, -1/c^2 ) - l3 = ( 0, 0, 1, 0 ) - l4 = ( 0, r/(2c), 0, 1/(2c^2) ) - - The fluxes are going to be defined on the left edge of the - computational zones:: - - | | | | - | | | | - -+------+------+------+------+------+------+-- - | i-1 | i | i+1 | - ^ ^ ^ - q_l,i q_r,i q_l,i+1 - - q_r,i and q_l,i+1 are computed using the information in zone i,j. - - Parameters - ---------- - idir : int - Are we predicting to the edges in the x-direction (1) or y-direction (2)? - ng : int - The number of ghost cells - dx : float - The cell spacing - dt : float - The timestep - irho, iu, iv, ip, ix : int - Indices of the density, x-velocity, y-velocity, pressure and species in the - state vector - nspec : int - The number of species - gamma : float - Adiabatic index - qv : ndarray - The primitive state vector - dqv : ndarray - Spatial derivative of the state vector - - Returns - ------- - out : ndarray, ndarray - State vector predicted to the left and right edges - """ - - qx, qy, nvar = qv.shape - - U_l = np.zeros_like(Uv) - U_r = np.zeros_like(Uv) - - nx = qx - 2 * ng - ny = qy - 2 * ng - ilo = ng - ihi = ng + nx - jlo = ng - jhi = ng + ny - - ns = nvar - nspec - - dtdx = dt / dx - dtdx4 = 0.25 * dtdx - - lvec = np.zeros((nvar, nvar)) - rvec = np.zeros((nvar, nvar)) - e_val = np.zeros(nvar) - betal = np.zeros(nvar) - betar = np.zeros(nvar) - - # this is the loop over zones. For zone i, we see q_l[i+1] and q_r[i] - for i in range(ilo - 2, ihi + 2): - for j in range(jlo - 2, jhi + 2): - - dU = dUv[i, j, :] - q = qv[i, j, :] - U = Uv[i, j, :] - - cs2 = gamma * q[ip] / q[irho] - v2 = np.sum(q[iu:iv+1]**2) - h = 1.0 + gamma / (gamma - 1.0) * q[ip] / q[irho] - - W = 1.0 / np.sqrt(1.0 - v2) - - lvec[:, :] = 0.0 - rvec[:, :] = 0.0 - e_val[:] = 0.0 - - # compute the eigenvalues and eigenvectors - if idir == 1: - e_val[1:3] = np.array([q[iu], q[iu]]) - - e_val[0] = 1.0 / (1.0 - v2 * cs2) * \ - (q[iu]*(1.0-cs2) - np.sqrt(cs2) * np.sqrt((1.0-v2) * - (1.0-v2*cs2 - q[iu]**2*(1.0-cs2)))) - - e_val[3] = 1.0 / (1.0 - v2 * cs2) * \ - (q[iu]*(1.0-cs2) + np.sqrt(cs2) * np.sqrt((1.0-v2) * - (1.0-v2*cs2 - q[iu]**2*(1.0-cs2)))) - - Am = (1.0 - q[iu]**2) / (1.0 - q[iu]*e_val[0]) - Ap = (1.0 - q[iu]**2) / (1.0 - q[iu]*e_val[3]) - - Delta = h**3*W * (h-1.0) * (1.0-q[iu]**2) * (Ap*e_val[3] - Am*e_val[0]) - - lvec[0, :ns] = [h*W*Ap*(q[iu]-e_val[3]) - q[iu] - W**2*(v2-q[iu]**2) * - (2.0*h-1.0)*(q[iu]-Ap*e_val[3]) + h*Ap*e_val[3], - 1.0+W**2*(v2-q[iu]**2)*(2.0*h-1.0) * (1.0-Ap) - h*Ap, - W**2*q[iv]*(2.0*h-1.0)*Ap * (q[iu]-e_val[3]), - -q[iu] - W**2*(v2-q[iu]**2) * - (2.0*h-1.0)*(q[iu]-Ap*e_val[3]) + h * Ap*e_val[3]] - lvec[0, :ns] *= h**2 / Delta - - lvec[1, :ns] = [h-W, W*q[iu], W*q[iv], -W] - lvec[1, :ns] *= W / (h - 1.0) - - lvec[2, :ns] = [-q[iv], q[iu]*q[iv], 1.0-q[iu], -q[iv]] - lvec[2, :ns] /= h * (1.0 - q[iu]**2) - - lvec[3, :ns] = [h*W*Am*(q[iu]-e_val[0]) - q[iu] - - W**2 * (v2-q[iu]**2)*(2.0*h-1.0) * - (q[iu]-Am*e_val[0]) + h*Am*e_val[0], - 1.0+W**2*(v2-q[iu]**2)*(2.0*h-1.0) * - (1.0-Am) - h*Am, - W**2*q[iv]*(2.0*h-1.0)*Am * (q[iu]-e_val[0]), - -q[iu] - W**2*(v2-q[iu]**2) * - (2.0*h-1.0)*(q[iu]-Am*e_val[0]) + h * Am*e_val[0]] - lvec[3, :ns] = -lvec[3, :ns] * h**2 / Delta - - rvec[0, :ns] = [1.0, h*W*Am*e_val[0], h*W*q[iv], - h*W*Am-1.0] - rvec[1, :ns] = [1.0/W, q[iu], q[iv], 1.0-1.0/W] - rvec[2, :ns] = [W*q[iv], 2.0*h*W**2*q[iu]*q[iv], - h*(1.0 + 2.0*W**2*q[iv]**2), - 2*h*W**2*q[iv]-W*q[iv]] - rvec[3, :ns] = [1.0, h*W*Ap*e_val[3], h*W*q[iv], - h*W*Ap-1.0] - - # now the species -- they only have a 1 in their corresponding slot - e_val[ns:] = q[iu] - for n in range(iX, iX + nspec): - lvec[n, n] = 1.0 - rvec[n, n] = 1.0 - - else: - e_val[1:3] = np.array([q[iv], q[iv]]) - - e_val[0] = 1.0 / (1.0 - v2 * cs2) * \ - (q[iv]*(1.0-cs2) - np.sqrt(cs2) * np.sqrt((1.0-v2) * - (1.0-v2*cs2 - q[iv]**2*(1.0-cs2)))) - - e_val[3] = 1.0 / (1.0 - v2 * cs2) * \ - (q[iv]*(1.0-cs2) + np.sqrt(cs2) * np.sqrt((1.0-v2) * - (1.0-v2*cs2 - q[iv]**2*(1.0-cs2)))) - - Am = (1.0 - q[iv]**2) / (1.0 - q[iv]*e_val[0]) - Ap = (1.0 - q[iv]**2) / (1.0 - q[iv]*e_val[3]) - - Delta = h**3*W * (h-1.0) * (1.0-q[iv]**2) * (Ap*e_val[3] - Am*e_val[0]) - - lvec[0, :ns] = [h*W*Ap*(q[iv]-e_val[3]) - q[iv] - W**2*(v2-q[iv]**2) * - (2.0*h-1.0)*(q[iv]-Ap*e_val[3]) + h*Ap*e_val[3], - W**2*q[iu]*(2.0*h-1.0)*Ap * (q[iv]-e_val[3]), - 1.0+W**2*(v2-q[iv]**2)*(2.0*h-1.0) * (1.0-Ap) - h*Ap, - -q[iv] - W**2*(v2-q[iv]**2) * - (2.0*h-1.0)*(q[iv]-Ap*e_val[3]) + h * Ap*e_val[3]] - lvec[0, :ns] *= h**2 / Delta - - lvec[1, :ns] = [-q[iu], 1.0-q[iv], q[iu]*q[iv], -q[iu]] - lvec[1, :ns] /= h * (1.0 - q[iv]**2) - - lvec[2, :ns] = [h-W, W*q[iu], W*q[iv], -W] - lvec[2, :ns] *= W / (h - 1.0) - - lvec[3, :ns] = [h*W*Am*(q[iv]-e_val[0]) - q[iv] - - W**2 * (v2-q[iv]**2)*(2.0*h-1.0) * - (q[iv]-Am*e_val[0]) + h*Am*e_val[0], - W**2*q[iu]*(2.0*h-1.0)*Am * (q[iv]-e_val[0]), - 1.0+W**2*(v2-q[iv]**2)*(2.0*h-1.0) * - (1.0-Am) - h*Am, - -q[iv] - W**2*(v2-q[iv]**2) * - (2.0*h-1.0)*(q[iv]-Am*e_val[0]) + h * Am*e_val[0]] - lvec[3, :ns] = -lvec[3, :ns] * h**2 / Delta - - rvec[0, :ns] = [1.0, h*W*q[iu], h*W*Am*e_val[0], - h*W*Am-1.0] - rvec[1, :ns] = [W*q[iu], - h*(1.0 + 2.0*W**2*q[iu]**2), 2.0*h*W**2*q[iu]*q[iv], - 2*h*W**2*q[iu]-W*q[iu]] - rvec[2, :ns] = [1.0/W, q[iu], q[iv], 1.0-1.0/W] - rvec[3, :ns] = [1.0, h*W*q[iu], h*W*Ap*e_val[3], - h*W*Ap-1.0] - - # now the species -- they only have a 1 in their corresponding slot - e_val[ns:] = q[iv] - for n in range(iX, iX + nspec): - lvec[n, n] = 1.0 - rvec[n, n] = 1.0 - - # define the reference states - if idir == 1: - # this is one the right face of the current zone, - # so the fastest moving eigenvalue is e_val[3] = u + c - factor = 0.5 * (1.0 - dtdx * max(e_val[3], 0.0)) - U_l[i + 1, j, :] = U + factor * dU - - # left face of the current zone, so the fastest moving - # eigenvalue is e_val[3] = u - c - factor = 0.5 * (1.0 + dtdx * min(e_val[0], 0.0)) - U_r[i, j, :] = U - factor * dU - - else: - factor = 0.5 * (1.0 - dtdx * max(e_val[3], 0.0)) - U_l[i, j + 1, :] = U + factor * dU - - factor = 0.5 * (1.0 + dtdx * min(e_val[0], 0.0)) - U_r[i, j, :] = U - factor * dU - - # compute the Vhat functions - for m in range(nvar): - summ = np.dot(lvec[m, :], dU) - - betal[m] = dtdx4 * (e_val[3] - e_val[m]) * \ - (np.copysign(1.0, e_val[m]) + 1.0) * summ - betar[m] = dtdx4 * (e_val[0] - e_val[m]) * \ - (1.0 - np.copysign(1.0, e_val[m])) * summ - - # construct the states - for m in range(nvar): - sum_l = np.dot(betal, rvec[:, m]) - sum_r = np.dot(betar, rvec[:, m]) - - if idir == 1: - U_l[i + 1, j, m] += sum_l - U_r[i, j, m] += sum_r - else: - U_l[i, j + 1, m] += sum_l - U_r[i, j, m] += sum_r - - return U_l, U_r - - -@njit(cache=True) -def riemann_cgf(idir, ng, - idens, ixmom, iymom, iener, irhoX, - irho, iu, iv, ip, iX, nspec, - lower_solid, upper_solid, - gamma, U_l, U_r, q_l, q_r): - r""" - Solve riemann shock tube problem for a general equation of - state using the method of Colella, Glaz, and Ferguson. See - Almgren et al. 2010 (the CASTRO paper) for details. - - The Riemann problem for the Euler's equation produces 4 regions, - separated by the three characteristics (u - cs, u, u + cs):: - - - u - cs t u u + cs - \ ^ . / - \ *L | . *R / - \ | . / - \ | . / - L \ | . / R - \ | . / - \ |. / - \|./ - ----------+----------------> x - - We care about the solution on the axis. The basic idea is to use - estimates of the wave speeds to figure out which region we are in, - and: use jump conditions to evaluate the state there. - - Only density jumps across the u characteristic. All primitive - variables jump across the other two. Special attention is needed - if a rarefaction spans the axis. - - Parameters - ---------- - idir : int - Are we predicting to the edges in the x-direction (1) or y-direction (2)? - ng : int - The number of ghost cells - nspec : int - The number of species - idens, ixmom, iymom, iener, irhoX : int - The indices of the density, x-momentum, y-momentum, internal energy density - and species partial densities in the conserved state vector. - lower_solid, upper_solid : int - Are we at lower or upper solid boundaries? - gamma : float - Adiabatic index - U_l, U_r : ndarray - Conserved state on the left and right cell edges. - - Returns - ------- - out : ndarray - Conserved flux - """ - _ = U_l, U_r # unused by this solver - - qx, qy, nvar = q_l.shape - - F = np.zeros((qx, qy, nvar)) - q = np.zeros(nvar) - U = np.zeros(nvar) - - smallc = 1.e-10 - smallrho = 1.e-10 - smallp = 1.e-10 - - nx = qx - 2 * ng - ny = qy - 2 * ng - ilo = ng - ihi = ng + nx - jlo = ng - jhi = ng + ny - - for i in range(ilo - 1, ihi + 1): - for j in range(jlo - 1, jhi + 1): - - # primitive variable states - rho_l = q_l[i, j, irho] - - # un = normal velocity; ut = transverse velocity - if idir == 1: - un_l = q_l[i, j, iu] - ut_l = q_l[i, j, iv] - else: - un_l = q_l[i, j, iv] - ut_l = q_l[i, j, iu] - - p_l = q_l[i, j, ip] - p_l = max(p_l, smallp) - # rhoe_l = p_l / (gamma - 1.0) - - rho_r = q_r[i, j, irho] - - if idir == 1: - un_r = q_r[i, j, iu] - ut_r = q_r[i, j, iv] - else: - un_r = q_r[i, j, iv] - ut_r = q_r[i, j, iu] - - p_r = q_r[i, j, ip] - p_r = max(p_r, smallp) - # rhoe_r = p_r / (gamma - 1.0) - - # define the Lagrangian sound speed - W_l = max(smallrho * smallc, np.sqrt(gamma * p_l * rho_l)) - W_r = max(smallrho * smallc, np.sqrt(gamma * p_r * rho_r)) - - # and the regular sound speeds - c_l = max(smallc, np.sqrt(gamma * p_l / rho_l)) - c_r = max(smallc, np.sqrt(gamma * p_r / rho_r)) - - # define the star states - pstar = (W_l * p_r + W_r * p_l + W_l * - W_r * (un_l - un_r)) / (W_l + W_r) - pstar = max(pstar, smallp) - ustar = (W_l * un_l + W_r * un_r + (p_l - p_r)) / (W_l + W_r) - - # now compute the remaining state to the left and right - # of the contact (in the star region) - rhostar_l = rho_l + (pstar - p_l) / c_l**2 - rhostar_r = rho_r + (pstar - p_r) / c_r**2 - - # rhoestar_l = rhoe_l + \ - # (pstar - p_l) * (rhoe_l / rho_l + p_l / rho_l) / c_l**2 - # rhoestar_r = rhoe_r + \ - # (pstar - p_r) * (rhoe_r / rho_r + p_r / rho_r) / c_r**2 - - cstar_l = max(smallc, np.sqrt(gamma * pstar / rhostar_l)) - cstar_r = max(smallc, np.sqrt(gamma * pstar / rhostar_r)) - - # figure out which state we are in, based on the location of - # the waves - if ustar > 0.0: - - # contact is moving to the right, we need to understand - # the L and *L states - - # Note: transverse velocity only jumps across contact - ut_state = ut_l - - # define eigenvalues - v2 = un_l**2 + ut_l**2 - lambda_l = 1.0 / (1.0 - v2 * c_l**2) * \ - (un_l * (1.0 - c_l**2) - c_l * np.sqrt((1.0 - v2) * (1.0 - v2*c_l**2 - un_l**2*(1.0-c_l**2)))) - - v2 = ustar**2 + ut_l**2 - lambdastar_l = 1.0 / (1.0 - v2 * cstar_l**2) * \ - (ustar * (1.0 - cstar_l**2) - cstar_l * np.sqrt((1.0 - v2) * - (1.0 - v2*cstar_l**2 - ustar**2*(1.0-cstar_l**2)))) - - if pstar > p_l: - # the wave is a shock -- find the shock speed - sigma = (lambda_l + lambdastar_l) / 2.0 - - if sigma > 0.0: - # shock is moving to the right -- solution is L state - rho_state = rho_l - un_state = un_l - p_state = p_l - # rhoe_state = rhoe_l - - else: - # solution is *L state - rho_state = rhostar_l - un_state = ustar - p_state = pstar - # rhoe_state = rhoestar_l - - else: - # the wave is a rarefaction - if (lambda_l < 0.0 and lambdastar_l < 0.0): - # rarefaction fan is moving to the left -- solution is - # *L state - rho_state = rhostar_l - un_state = ustar - p_state = pstar - # rhoe_state = rhoestar_l - - elif (lambda_l > 0.0 and lambdastar_l > 0.0): - # rarefaction fan is moving to the right -- solution is - # L state - rho_state = rho_l - un_state = un_l - p_state = p_l - # rhoe_state = rhoe_l - - else: - # rarefaction spans x/t = 0 -- interpolate - alpha = lambda_l / (lambda_l - lambdastar_l) - - rho_state = alpha * rhostar_l + (1.0 - alpha) * rho_l - un_state = alpha * ustar + (1.0 - alpha) * un_l - p_state = alpha * pstar + (1.0 - alpha) * p_l - # rhoe_state = alpha * rhoestar_l + \ - # (1.0 - alpha) * rhoe_l - - elif ustar < 0: - - # contact moving left, we need to understand the R and *R - # states - - # Note: transverse velocity only jumps across contact - ut_state = ut_r - - # define eigenvalues - v2 = un_r**2 + ut_r**2 - lambda_r = 1.0 / (1.0 - v2*c_r**2) * (un_r*(1.0-c_r**2) + c_r * - np.sqrt((1.0-v2) * (1.0 - v2*c_r**2 - un_r**2*(1.0-c_r**2)))) - - v2 = ustar**2 + ut_r**2 - lambdastar_r = 1.0 / (1.0 - v2*cstar_r**2) * (ustar*(1.0-cstar_r**2) + cstar_r * - np.sqrt((1.0-v2) * - (1.0 - v2*cstar_r**2 - ustar**2*(1.0-cstar_r**2)))) - - if pstar > p_r: - # the wave if a shock -- find the shock speed - sigma = (lambda_r + lambdastar_r) / 2.0 - - if sigma > 0.0: - # shock is moving to the right -- solution is *R state - rho_state = rhostar_r - un_state = ustar - p_state = pstar - # rhoe_state = rhoestar_r - - else: - # solution is R state - rho_state = rho_r - un_state = un_r - p_state = p_r - # rhoe_state = rhoe_r - - else: - # the wave is a rarefaction - if (lambda_r < 0.0 and lambdastar_r < 0.0): - # rarefaction fan is moving to the left -- solution is - # R state - rho_state = rho_r - un_state = un_r - p_state = p_r - # rhoe_state = rhoe_r - - elif (lambda_r > 0.0 and lambdastar_r > 0.0): - # rarefaction fan is moving to the right -- solution is - # *R state - rho_state = rhostar_r - un_state = ustar - p_state = pstar - # rhoe_state = rhoestar_r - - else: - # rarefaction spans x/t = 0 -- interpolate - alpha = lambda_r / (lambda_r - lambdastar_r) - - rho_state = alpha * rhostar_r + (1.0 - alpha) * rho_r - un_state = alpha * ustar + (1.0 - alpha) * un_r - p_state = alpha * pstar + (1.0 - alpha) * p_r - # rhoe_state = alpha * rhoestar_r + \ - # (1.0 - alpha) * rhoe_r - - else: # ustar == 0 - - rho_state = 0.5 * (rhostar_l + rhostar_r) - un_state = ustar - ut_state = 0.5 * (ut_l + ut_r) - p_state = pstar - # rhoe_state = 0.5 * (rhoestar_l + rhoestar_r) - - # species now - if nspec > 0: - if ustar > 0.0: - xn = q_l[i, j, iX:iX + nspec] - elif ustar < 0.0: - xn = q_r[i, j, iX:iX + nspec] - else: - xn = 0.5 * (q_l[i, j, iX:iX + nspec] + - q_r[i, j, iX:iX + nspec]) - - # are we on a solid boundary? - if idir == 1: - if (i == ilo and lower_solid == 1): - un_state = 0.0 - - if (i == ihi + 1 and upper_solid == 1): - un_state = 0.0 - - elif idir == 2: - if (j == jlo and lower_solid == 1): - un_state = 0.0 - - if (j == jhi + 1 and upper_solid == 1): - un_state = 0.0 - - # Make primitive state - q[irho] = rho_state - if idir == 1: - q[iu] = un_state - q[iv] = ut_state - else: - q[iu] = ut_state - q[iv] = un_state - - q[ip] = p_state - - # Make conservative state - W = 1.0 / np.sqrt(1.0 - q[iu]**2 - q[iv]**2) - U[idens] = rho_state * W - U[ixmom] = (rho_state + p_state * gamma / (gamma - 1.0)) * q[iu] * W**2 - U[iymom] = (rho_state + p_state * gamma / (gamma - 1.0)) * q[iv] * W**2 - U[iener] = (rho_state + p_state * gamma / (gamma - 1.0)) * W**2 - p_state - U[idens] - - if nspec > 0: - q[iX:iX+nspec] = xn - U[irhoX:irhoX+nspec] = xn * U[idens] - - # compute the fluxes - F[i, j, :] = consFlux(idir, idens, ixmom, iymom, iener, irhoX, iu, iv, ip, nspec, U, q) - - return F - - -@njit(cache=True) -def riemann_prim(idir, ng, - irho, iu, iv, ip, iX, nspec, - lower_solid, upper_solid, - gamma, q_l, q_r): - r""" - this is like riemann_cgf, except that it works on a primitive - variable input state and returns the primitive variable interface - state - - Solve riemann shock tube problem for a general equation of - state using the method of Colella, Glaz, and Ferguson. See - Almgren et al. 2010 (the CASTRO paper) for details. - - The Riemann problem for the Euler's equation produces 4 regions, - separated by the three characteristics :math:`(u - cs, u, u + cs)`:: - - - u - cs t u u + cs - \ ^ . / - \ *L | . *R / - \ | . / - \ | . / - L \ | . / R - \ | . / - \ |. / - \|./ - ----------+----------------> x - - We care about the solution on the axis. The basic idea is to use - estimates of the wave speeds to figure out which region we are in, - and: use jump conditions to evaluate the state there. - - Only density jumps across the :math:`u` characteristic. All primitive - variables jump across the other two. Special attention is needed - if a rarefaction spans the axis. - - Parameters - ---------- - idir : int - Are we predicting to the edges in the x-direction (1) or y-direction (2)? - ng : int - The number of ghost cells - nspec : int - The number of species - irho, iu, iv, ip, iX : int - The indices of the density, x-velocity, y-velocity, pressure and species fractions in the state vector. - lower_solid, upper_solid : int - Are we at lower or upper solid boundaries? - gamma : float - Adiabatic index - q_l, q_r : ndarray - Primitive state on the left and right cell edges. - - Returns - ------- - out : ndarray - Primitive flux - """ - - qx, qy, nvar = q_l.shape - - q_int = np.zeros((qx, qy, nvar)) - - smallc = 1.e-10 - smallrho = 1.e-10 - smallp = 1.e-10 - - nx = qx - 2 * ng - ny = qy - 2 * ng - ilo = ng - ihi = ng + nx - jlo = ng - jhi = ng + ny - - for i in range(ilo - 1, ihi + 1): - for j in range(jlo - 1, jhi + 1): - - # primitive variable states - rho_l = q_l[i, j, irho] - - # un = normal velocity; ut = transverse velocity - if idir == 1: - un_l = q_l[i, j, iu] - ut_l = q_l[i, j, iv] - else: - un_l = q_l[i, j, iv] - ut_l = q_l[i, j, iu] - - p_l = q_l[i, j, ip] - p_l = max(p_l, smallp) - - rho_r = q_r[i, j, irho] - - if idir == 1: - un_r = q_r[i, j, iu] - ut_r = q_r[i, j, iv] - else: - un_r = q_r[i, j, iv] - ut_r = q_r[i, j, iu] - - p_r = q_r[i, j, ip] - p_r = max(p_r, smallp) - - # define the Lagrangian sound speed - rho_l = max(smallrho, rho_l) - rho_r = max(smallrho, rho_r) - W_l = max(smallrho * smallc, np.sqrt(gamma * p_l * rho_l)) - W_r = max(smallrho * smallc, np.sqrt(gamma * p_r * rho_r)) - - # and the regular sound speeds - c_l = max(smallc, np.sqrt(gamma * p_l / rho_l)) - c_r = max(smallc, np.sqrt(gamma * p_r / rho_r)) - - # define the star states - pstar = (W_l * p_r + W_r * p_l + W_l * - W_r * (un_l - un_r)) / (W_l + W_r) - pstar = max(pstar, smallp) - ustar = (W_l * un_l + W_r * un_r + (p_l - p_r)) / (W_l + W_r) - - # now compute the remaining state to the left and right - # of the contact (in the star region) - rhostar_l = rho_l + (pstar - p_l) / c_l**2 - rhostar_r = rho_r + (pstar - p_r) / c_r**2 - - cstar_l = max(smallc, np.sqrt(gamma * pstar / rhostar_l)) - cstar_r = max(smallc, np.sqrt(gamma * pstar / rhostar_r)) - - # figure out which state we are in, based on the location of - # the waves - if ustar > 0.0: - - # contact is moving to the right, we need to understand - # the L and *L states - - # Note: transverse velocity only jumps across contact - ut_state = ut_l - - # define eigenvalues - v2 = un_l**2 + ut_l**2 - lambda_l = 1.0 / (1.0 - v2*c_l**2) * (un_l*(1.0-c_l**2) - c_l * - np.sqrt((1.0-v2) * - (1.0-v2*c_l**2 - un_l**2*(1.0-c_l**2)))) - - v2 = ustar**2 + ut_l**2 - lambdastar_l = 1.0 / (1.0 - v2*cstar_l**2) * \ - (ustar*(1.0-cstar_l**2) - cstar_l * np.sqrt((1.0-v2) * - (1.0-v2*cstar_l**2 - ustar**2*(1.0-cstar_l**2)))) - - if pstar > p_l: - # the wave is a shock -- find the shock speed - sigma = (lambda_l + lambdastar_l) / 2.0 - - if sigma > 0.0: - # shock is moving to the right -- solution is L state - rho_state = rho_l - un_state = un_l - p_state = p_l - - else: - # solution is *L state - rho_state = rhostar_l - un_state = ustar - p_state = pstar - - else: - # the wave is a rarefaction - if (lambda_l < 0.0 and lambdastar_l < 0.0): - # rarefaction fan is moving to the left -- solution is - # *L state - rho_state = rhostar_l - un_state = ustar - p_state = pstar - - elif (lambda_l > 0.0 and lambdastar_l > 0.0): - # rarefaction fan is moving to the right -- solution is - # L state - rho_state = rho_l - un_state = un_l - p_state = p_l - - else: - # rarefaction spans x/t = 0 -- interpolate - alpha = lambda_l / (lambda_l - lambdastar_l) - - rho_state = alpha * rhostar_l + (1.0 - alpha) * rho_l - un_state = alpha * ustar + (1.0 - alpha) * un_l - p_state = alpha * pstar + (1.0 - alpha) * p_l - - elif ustar < 0: - - # contact moving left, we need to understand the R and *R - # states - - # Note: transverse velocity only jumps across contact - ut_state = ut_r - - # define eigenvalues - v2 = un_r**2 + ut_r**2 - lambda_r = 1.0 / (1.0 - v2*c_r**2) * (un_r*(1.0-c_r**2) + c_r * - np.sqrt((1.0-v2) * (1.0-v2*c_r**2 - un_r**2*(1.0-c_r**2)))) - - v2 = ustar**2 + ut_r**2 - lambdastar_r = 1.0 / (1.0 - v2*cstar_r**2) * (ustar*(1.0-cstar_r**2) + cstar_r * - np.sqrt((1.0-v2) * (1.0-v2*cstar_r**2 - ustar**2*(1.0-cstar_r**2)))) - - if pstar > p_r: - # the wave if a shock -- find the shock speed - sigma = (lambda_r + lambdastar_r) / 2.0 - - if sigma > 0.0: - # shock is moving to the right -- solution is *R state - rho_state = rhostar_r - un_state = ustar - p_state = pstar - - else: - # solution is R state - rho_state = rho_r - un_state = un_r - p_state = p_r - - else: - # the wave is a rarefaction - if (lambda_r < 0.0 and lambdastar_r < 0.0): - # rarefaction fan is moving to the left -- solution is - # R state - rho_state = rho_r - un_state = un_r - p_state = p_r - - elif (lambda_r > 0.0 and lambdastar_r > 0.0): - # rarefaction fan is moving to the right -- solution is - # *R state - rho_state = rhostar_r - un_state = ustar - p_state = pstar - - else: - # rarefaction spans x/t = 0 -- interpolate - alpha = lambda_r / (lambda_r - lambdastar_r) - - rho_state = alpha * rhostar_r + (1.0 - alpha) * rho_r - un_state = alpha * ustar + (1.0 - alpha) * un_r - p_state = alpha * pstar + (1.0 - alpha) * p_r - - else: # ustar == 0 - - rho_state = 0.5 * (rhostar_l + rhostar_r) - un_state = ustar - ut_state = 0.5 * (ut_l + ut_r) - p_state = pstar - - # species now - if nspec > 0: - if ustar > 0.0: - xn = q_l[i, j, iX:iX + nspec] - - elif ustar < 0.0: - xn = q_r[i, j, iX:iX + nspec] - else: - xn = 0.5 * (q_l[i, j, iX:iX + nspec] + - q_r[i, j, iX:iX + nspec]) - - # are we on a solid boundary? - if idir == 1: - if (i == ilo and lower_solid == 1): - un_state = 0.0 - - if (i == ihi + 1 and upper_solid == 1): - un_state = 0.0 - - elif idir == 2: - if (j == jlo and lower_solid == 1): - un_state = 0.0 - - if (j == jhi + 1 and upper_solid == 1): - un_state = 0.0 - - q_int[i, j, irho] = rho_state - if idir == 1: - q_int[i, j, iu] = un_state - q_int[i, j, iv] = ut_state - else: - q_int[i, j, iu] = ut_state - q_int[i, j, iv] = un_state - - q_int[i, j, ip] = p_state - - if nspec > 0: - q_int[i, j, iX:iX + nspec] = xn - - return q_int - - -@njit(cache=True) -def riemann_hllc(idir, ng, - idens, ixmom, iymom, iener, irhoX, - irho, iu, iv, ip, iX, nspec, - lower_solid, upper_solid, - gamma, U_l, U_r, q_l, q_r): - r""" - This is the HLLC Riemann solver. The implementation follows - directly out of Toro's book. Note: this does not handle the - transonic rarefaction. - - Parameters - ---------- - idir : int - Are we predicting to the edges in the x-direction (1) or y-direction (2)? - ng : int - The number of ghost cells - nspec : int - The number of species - idens, ixmom, iymom, iener, irhoX : int - The indices of the density, x-momentum, y-momentum, internal energy density - and species partial densities in the conserved state vector. - lower_solid, upper_solid : int - Are we at lower or upper solid boundaries? - gamma : float - Adiabatic index - U_l, U_r : ndarray - Conserved state on the left and right cell edges. - - Returns - ------- - out : ndarray - Conserved flux - """ - _ = irho, iX, lower_solid, upper_solid, gamma # unused by this solver - - qx, qy, nvar = U_l.shape - - F = np.zeros((qx, qy, nvar)) - - # smallc = 1.e-10 - smallp = 1.e-10 - - # U_state = np.zeros(nvar) - U_lstar = np.zeros(nvar) - U_rstar = np.zeros(nvar) - - nx = qx - 2 * ng - ny = qy - 2 * ng - ilo = ng - ihi = ng + nx - jlo = ng - jhi = ng + ny - - for i in range(ilo - 1, ihi + 1): - for j in range(jlo - 1, jhi + 1): - - # un = normal velocity; ut = transverse velocity - if idir == 1: - un_l = q_l[i, j, iu] - # ut_l = q_l[i, j, iv] - else: - un_l = q_l[i, j, iv] - # ut_l = q_l[i, j, iu] - - p_l = q_l[i, j, ip] - p_l = max(p_l, smallp) - - if idir == 1: - un_r = q_r[i, j, iu] - # ut_r = q_r[i, j, iv] - else: - un_r = q_r[i, j, iv] - # ut_r = q_r[i, j, iu] - - p_r = q_r[i, j, ip] - p_r = max(p_r, smallp) - - # rho_l = q_l[i, j, irho] - # rho_r = q_r[i, j, irho] - - # compute the sound speeds - # c_l = max(smallc, np.sqrt(gamma * p_l / rho_l)) - # c_r = max(smallc, np.sqrt(gamma * p_r / rho_r)) - - # a_l = 0.5 * (un_l+un_r - c_l-c_r) / (1.0-0.25*(un_l+un_r)*(c_l+c_r)) - # a_r = 0.5 * (un_l+un_r + c_l+c_r) / (1.0+0.25*(un_l+un_r)*(c_l+c_r)) - - a_l = -1.0 - a_r = 1.0 - - F_l = consFlux(idir, idens, ixmom, iymom, iener, irhoX, - iu, iv, ip, nspec, U_l[i, j, :], q_l[i, j, :]) - F_r = consFlux(idir, idens, ixmom, iymom, iener, irhoX, - iu, iv, ip, nspec, U_r[i, j, :], q_r[i, j, :]) - - F_HLLE = (a_r*F_l - a_l*F_r + a_r*a_l*(U_r[i, j, :] - U_l[i, j, :])) / (a_r - a_l) - - if a_r <= 0.0: # right state - U_HLLE = U_r[i, j, :] - elif a_l < 0.0: # middle - U_HLLE = (a_r*U_r[i, j, :] - a_l*U_l[i, j, :] - F_r+F_l) / (a_r - a_l) - else: # left - U_HLLE = U_l[i, j, :] - - if idir == 1: - S_HLLE = U_HLLE[ixmom] - F_S = F_HLLE[ixmom] - else: - S_HLLE = U_HLLE[iymom] - F_S = F_HLLE[iymom] - - E_HLLE = U_HLLE[iener] + U_HLLE[idens] - - if abs(F_HLLE[iener]) < 1.e-9: - a_star = S_HLLE / (E_HLLE + F_S) - else: - a_star = (E_HLLE + F_S - np.sqrt((E_HLLE + F_S)**2 - S_HLLE * - 2.0 * F_HLLE[iener])) / (2.0 * F_HLLE[iener]) - - # NOTE: this shouldn't happen but just in case? - if np.isnan(a_star): - a_star = 0.0 - - # left - if idir == 1: - A = (U_l[i, j, iener] + U_l[i, j, idens]) * a_l - U_l[i, j, ixmom] - B = U_l[i, j, ixmom] * (a_l - un_l) - p_l - else: - A = (U_l[i, j, iener] + U_l[i, j, idens]) * a_l - U_l[i, j, iymom] - B = U_l[i, j, iymom] * (a_l - un_l) - p_l - - p_lstar = ((A * a_star) - B) / (1.0 - a_l * a_star) - - U_lstar[idens] = U_l[i, j, idens] * (a_l - un_l) / (a_l - a_star) - - if idir == 1: - U_lstar[ixmom] = (U_l[i, j, ixmom] * (a_l-un_l) + p_lstar - p_l) / (a_l - a_star) - U_lstar[iymom] = U_l[i, j, iymom] * (a_l - un_l) / (a_l - a_star) - else: - U_lstar[ixmom] = U_l[i, j, ixmom] * (a_l - un_l) / (a_l - a_star) - U_lstar[iymom] = (U_l[i, j, iymom] * (a_l - un_l) + p_lstar - p_l) / (a_l - a_star) - - # species - if nspec > 0: - U_lstar[irhoX:irhoX+nspec] = U_l[i, j, irhoX:irhoX+nspec] * (a_l - un_l) / (a_l - a_star) - - # right - if idir == 1: - A = (U_r[i, j, iener] + U_r[i, j, idens]) * a_r - U_r[i, j, ixmom] - B = U_r[i, j, ixmom] * (a_r - un_r) - p_r - else: - A = (U_r[i, j, iener] + U_r[i, j, idens]) * a_r - U_r[i, j, iymom] - B = U_r[i, j, iymom] * (a_r - un_r) - p_r - - p_rstar = ((A * a_star) - B) / (1.0 - a_r * a_star) - - U_rstar[idens] = U_r[i, j, idens] * (a_r - un_r) / (a_r - a_star) - - if idir == 1: - U_rstar[ixmom] = (U_r[i, j, ixmom] * (a_r - un_r) + p_rstar - p_r) / (a_r - a_star) - U_rstar[iymom] = U_r[i, j, iymom] * (a_r - un_r) / (a_r - a_star) - else: - U_rstar[ixmom] = U_r[i, j, ixmom] * (a_r - un_r) / (a_r - a_star) - U_rstar[iymom] = (U_r[i, j, iymom] * (a_r - un_r) + p_rstar - p_r) / (a_r - a_star) - - # species - if nspec > 0: - U_rstar[irhoX:irhoX+nspec] = U_r[i, j, irhoX:irhoX+nspec] * (a_r - un_r) / (a_r - a_star) - - if a_r <= 0.0: # right state - F[i, j, :] = F_r - - elif a_star <= 0.0: # right star - F[i, j, :] = U_rstar * a_star - - if idir == 1: - F[i, j, ixmom] += p_rstar - F[i, j, iener] = U_rstar[ixmom] - F[i, j, idens] - else: - F[i, j, iymom] += p_rstar - F[i, j, iener] = U_rstar[iymom] - F[i, j, idens] - - elif a_l < 0.0: # left star - F[i, j, :] = U_lstar * a_star - - if idir == 1: - F[i, j, ixmom] += p_lstar - F[i, j, iener] = U_lstar[ixmom] - F[i, j, idens] - else: - F[i, j, iymom] += p_lstar - F[i, j, iener] = U_lstar[iymom] - F[i, j, idens] - - else: # left - F[i, j, :] = F_l - - return F - - -@njit(cache=True) -def consFlux(idir, idens, ixmom, iymom, iener, irhoX, iu, iv, ip, nspec, U_state, q_state): - r""" - Calculate the conservative flux. - - Parameters - ---------- - idir : int - Are we predicting to the edges in the x-direction (1) or y-direction (2)? - idens, ixmom, iymom, iener, irhoX : int - The indices of the density, x-momentum, y-momentum, internal energy density - and species partial densities in the conserved state vector. - nspec : int - The number of species - U_state : ndarray - Conserved state vector. - - Returns - ------- - out : ndarray - Conserved flux - """ - - F = np.zeros_like(U_state) - - u = q_state[iu] - v = q_state[iv] - - p = q_state[ip] - - if idir == 1: - F[idens] = U_state[idens] * u - F[ixmom] = U_state[ixmom] * u + p - F[iymom] = U_state[iymom] * u - F[iener] = (U_state[iener] + p) * u - - if nspec > 0: - F[irhoX:irhoX + nspec] = U_state[irhoX:irhoX + nspec] * u - else: - F[idens] = U_state[idens] * v - F[ixmom] = U_state[ixmom] * v - F[iymom] = U_state[iymom] * v + p - F[iener] = (U_state[iener] + p) * v - - if nspec > 0: - F[irhoX:irhoX + nspec] = U_state[irhoX:irhoX + nspec] * v - - return F - - -@njit(cache=True) -def artificial_viscosity(ng, dx, dy, - cvisc, u, v): - r""" - Compute the artificial viscosity. Here, we compute edge-centered - approximations to the divergence of the velocity. This follows - directly Colella \ Woodward (1984) Eq. 4.5 - - data locations:: - - j+3/2--+---------+---------+---------+ - | | | | - j+1 + | | | - | | | | - j+1/2--+---------+---------+---------+ - | | | | - j + X | | - | | | | - j-1/2--+---------+----Y----+---------+ - | | | | - j-1 + | | | - | | | | - j-3/2--+---------+---------+---------+ - | | | | | | | - i-1 i i+1 - i-3/2 i-1/2 i+1/2 i+3/2 - - ``X`` is the location of ``avisco_x[i,j]`` - ``Y`` is the location of ``avisco_y[i,j]`` - - Parameters - ---------- - ng : int - The number of ghost cells - dx, dy : float - Cell spacings - cvisc : float - viscosity parameter - u, v : ndarray - x- and y-velocities - - Returns - ------- - out : ndarray, ndarray - Artificial viscosity in the x- and y-directions - """ - - qx, qy = u.shape - - avisco_x = np.zeros((qx, qy)) - avisco_y = np.zeros((qx, qy)) - - nx = qx - 2 * ng - ny = qy - 2 * ng - ilo = ng - ihi = ng + nx - jlo = ng - jhi = ng + ny - - for i in range(ilo - 1, ihi + 1): - for j in range(jlo - 1, jhi + 1): - - # start by computing the divergence on the x-interface. The - # x-difference is simply the difference of the cell-centered - # x-velocities on either side of the x-interface. For the - # y-difference, first average the four cells to the node on - # each end of the edge, and: difference these to find the - # edge centered y difference. - divU_x = (u[i, j] - u[i - 1, j]) / dx + \ - 0.25 * (v[i, j + 1] + v[i - 1, j + 1] - - v[i, j - 1] - v[i - 1, j - 1]) / dy - - avisco_x[i, j] = cvisc * max(-divU_x * dx, 0.0) - - # now the y-interface value - divU_y = 0.25 * (u[i + 1, j] + u[i + 1, j - 1] - u[i - 1, j] - u[i - 1, j - 1]) / dx + \ - (v[i, j] - v[i, j - 1]) / dy - - avisco_y[i, j] = cvisc * max(-divU_y * dy, 0.0) - - return avisco_x, avisco_y diff --git a/pyro/compressible_sr/problems/__init__.py b/pyro/compressible_sr/problems/__init__.py deleted file mode 100644 index 4cd714fe7..000000000 --- a/pyro/compressible_sr/problems/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__all__ = ['acoustic_pulse', 'advect', 'bubble', 'hse', 'kh', 'logo', 'quad', 'rt', 'rt2', 'sedov', 'sod', 'test'] diff --git a/pyro/compressible_sr/problems/_acoustic_pulse.defaults b/pyro/compressible_sr/problems/_acoustic_pulse.defaults deleted file mode 100644 index e1f6fd0ff..000000000 --- a/pyro/compressible_sr/problems/_acoustic_pulse.defaults +++ /dev/null @@ -1,5 +0,0 @@ -[acoustic_pulse] -rho0 = 1.4 -drho0 = 0.14 - - diff --git a/pyro/compressible_sr/problems/_advect.defaults b/pyro/compressible_sr/problems/_advect.defaults deleted file mode 100644 index 726cc5844..000000000 --- a/pyro/compressible_sr/problems/_advect.defaults +++ /dev/null @@ -1,3 +0,0 @@ -[advect] - - diff --git a/pyro/compressible_sr/problems/_bubble.defaults b/pyro/compressible_sr/problems/_bubble.defaults deleted file mode 100644 index 33e59c09b..000000000 --- a/pyro/compressible_sr/problems/_bubble.defaults +++ /dev/null @@ -1,10 +0,0 @@ -[bubble] -dens_base = 0.1 ; density at the base of the atmosphere -scale_height = 2.0 ; scale height of the isothermal atmosphere - -x_pert = 2.0 -y_pert = 2.0 -r_pert = 0.25 -pert_amplitude_factor = 5.0 - -dens_cutoff = 0.01 diff --git a/pyro/compressible_sr/problems/_gresho.defaults b/pyro/compressible_sr/problems/_gresho.defaults deleted file mode 100644 index 19bee1d33..000000000 --- a/pyro/compressible_sr/problems/_gresho.defaults +++ /dev/null @@ -1,8 +0,0 @@ -[gresho] -dens_base = 10.0 ; density at the base of the atmosphere - -r = 1.0 -u0 = 1.0 -p0 = 1.0 - -dens_cutoff = 0.01 diff --git a/pyro/compressible_sr/problems/_hse.defaults b/pyro/compressible_sr/problems/_hse.defaults deleted file mode 100644 index 56ef80d2b..000000000 --- a/pyro/compressible_sr/problems/_hse.defaults +++ /dev/null @@ -1,4 +0,0 @@ -[hse] -dens0 = 1.0 -h = 1.0 - diff --git a/pyro/compressible_sr/problems/_kh.defaults b/pyro/compressible_sr/problems/_kh.defaults deleted file mode 100644 index d2709ebe0..000000000 --- a/pyro/compressible_sr/problems/_kh.defaults +++ /dev/null @@ -1,8 +0,0 @@ -[kh] -rho_1 = 1 -v_1 = -1.0 - -rho_2 = 2 -v_2 = 1.0 - - diff --git a/pyro/compressible_sr/problems/_logo.defaults b/pyro/compressible_sr/problems/_logo.defaults deleted file mode 100644 index 39647231c..000000000 --- a/pyro/compressible_sr/problems/_logo.defaults +++ /dev/null @@ -1 +0,0 @@ -[logo] diff --git a/pyro/compressible_sr/problems/_quad.defaults b/pyro/compressible_sr/problems/_quad.defaults deleted file mode 100644 index 30918f7d1..000000000 --- a/pyro/compressible_sr/problems/_quad.defaults +++ /dev/null @@ -1,33 +0,0 @@ -# these defaults seem to be equivalent to Configuration 3 from -# Shulz-Rinne et al. SIAM J. Sci. Comput., 14, 6, 1394-1414, 1993 -# -# Also, with the numbers written out, this is Configuration 3 from -# Lax and Liu, SIAM J. Sci. Comput., 19, 2, 319-340, 1998 -# -# See also LeVeque JCP 131, 327-353, 1997 - -[quadrant] -rho1 = 1.5 ; quadrant 1 initial density -u1 = 0.0 ; quadrant 1 initial x-velocity -v1 = 0.0 ; quadrant 1 initial y-velocity -p1 = 1.5 ; quadrant 1 initial pressure - -rho2 = 0.532258064516129 ; quadrant 2 initial density -u2 = 1.206045378311055 ; quadrant 2 initial x-velocity -v2 = 0.0 ; quadrant 2 initial y-velocity -p2 = 0.3 ; quadrant 2 initial pressure - -rho3 = 0.137992831541219 ; quadrant 3 initial density -u3 = 1.206045378311055 ; quadrant 3 initial x-velocity -v3 = 1.206045378311055 ; quadrant 3 initial y-velocity -p3 = 0.029032258064516 ; quadrant 3 initial pressure - -rho4 = 0.532258064516129 ; quadrant 4 initial density -u4 = 0.0 ; quadrant 4 initial x-velocity -v4 = 1.206045378311055 ; quadrant 4 initial y-velocity -p4 = 0.3 ; quadrant 4 initial pressure - -cx = 0.5 ; corner x position -cy = 0.5 ; corner y position - - diff --git a/pyro/compressible_sr/problems/_rt.defaults b/pyro/compressible_sr/problems/_rt.defaults deleted file mode 100644 index 90c543e09..000000000 --- a/pyro/compressible_sr/problems/_rt.defaults +++ /dev/null @@ -1,8 +0,0 @@ -[rt] -dens1 = 0.1 -dens2 = 0.2 - -amp = 1.0 -sigma = 0.1 - -p0 = 10.1 diff --git a/pyro/compressible_sr/problems/_rt2.defaults b/pyro/compressible_sr/problems/_rt2.defaults deleted file mode 100644 index a7daabef3..000000000 --- a/pyro/compressible_sr/problems/_rt2.defaults +++ /dev/null @@ -1,10 +0,0 @@ -[rt2] -dens1 = 1.0 -dens2 = 2.0 - -amp = 1.0 -sigma = 0.1 - -p0 = 10.0 - - diff --git a/pyro/compressible_sr/problems/_sedov.defaults b/pyro/compressible_sr/problems/_sedov.defaults deleted file mode 100644 index 21fbd398a..000000000 --- a/pyro/compressible_sr/problems/_sedov.defaults +++ /dev/null @@ -1,4 +0,0 @@ -[sedov] -r_init = 0.1 ; radius for the initial perturbation -nsub = 4 - diff --git a/pyro/compressible_sr/problems/_sod.defaults b/pyro/compressible_sr/problems/_sod.defaults deleted file mode 100644 index 80b86ad80..000000000 --- a/pyro/compressible_sr/problems/_sod.defaults +++ /dev/null @@ -1,13 +0,0 @@ -[sod] - -direction = x ; direction of the flow - -dens_left = 1.0 -dens_right = 0.125 - -u_left = 0.0 -u_right = 0.0 - -p_left = 1.0 -p_right = 0.1 - diff --git a/pyro/compressible_sr/problems/acoustic_pulse.py b/pyro/compressible_sr/problems/acoustic_pulse.py deleted file mode 100644 index fb3ade81f..000000000 --- a/pyro/compressible_sr/problems/acoustic_pulse.py +++ /dev/null @@ -1,61 +0,0 @@ -import numpy as np - -from pyro.compressible_sr import eos -from pyro.util import msg - - -def init_data(myd, rp): - """initialize the acoustic_pulse problem. This comes from - McCourquodale & Coella 2011""" - - msg.bold("initializing the acoustic pulse problem...") - - # make sure that we are passed a valid patch object - # if not isinstance(myd, fv.FV2d): - # print("ERROR: patch invalid in acoustic_pulse.py") - # print(myd.__class__) - # sys.exit() - - # get the density, momenta, and energy as separate variables - dens = myd.get_var("density") - xmom = myd.get_var("x-momentum") - ymom = myd.get_var("y-momentum") - ener = myd.get_var("energy") - - # initialize the components, remember, that ener here is rho*eint - # + 0.5*rho*v**2, where eint is the specific internal energy - # (erg/g) - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - - gamma = rp.get_param("eos.gamma") - - rho0 = rp.get_param("acoustic_pulse.rho0") - drho0 = rp.get_param("acoustic_pulse.drho0") - - xmin = rp.get_param("mesh.xmin") - xmax = rp.get_param("mesh.xmax") - - ymin = rp.get_param("mesh.ymin") - ymax = rp.get_param("mesh.ymax") - - xctr = 0.5*(xmin + xmax) - yctr = 0.5*(ymin + ymax) - - dist = np.sqrt((myd.grid.x2d - xctr)**2 + - (myd.grid.y2d - yctr)**2) - - dens[:, :] = rho0 - idx = dist <= 0.5 - dens[idx] = rho0 + drho0*np.exp(-16*dist[idx]**2) * np.cos(np.pi*dist[idx])**6 - - p = (dens/rho0)**gamma - ener[:, :] = p/(gamma - 1) - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - ener[:, :] = rhoh[:, :] - p - dens[:, :] - - -def finalize(): - """ print out any information to the user at the end of the run """ diff --git a/pyro/compressible_sr/problems/advect.py b/pyro/compressible_sr/problems/advect.py deleted file mode 100644 index aab03936c..000000000 --- a/pyro/compressible_sr/problems/advect.py +++ /dev/null @@ -1,71 +0,0 @@ -import sys - -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize a smooth advection problem for testing convergence """ - - msg.bold("initializing the advect problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in advect.py") - print(my_data.__class__) - sys.exit() - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - # initialize the components, remember, that ener here is rho*eint - # + 0.5*rho*v**2, where eint is the specific internal energy - # (erg/g) - dens[:, :] = 0.2 - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - - gamma = rp.get_param("eos.gamma") - - xmin = rp.get_param("mesh.xmin") - xmax = rp.get_param("mesh.xmax") - - ymin = rp.get_param("mesh.ymin") - ymax = rp.get_param("mesh.ymax") - - xctr = 0.5*(xmin + xmax) - yctr = 0.5*(ymin + ymax) - - # this is identical to the advection/smooth problem - dens[:, :] = 0.2 * (1 + - np.exp(-60.0 * ((my_data.grid.x2d-xctr)**2 + - (my_data.grid.y2d-yctr)**2))) - - # velocity is diagonal - u = 0.4 - v = 0.4 - - # pressure is constant - p = 0.2 - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - W = 1./np.sqrt(1-u**2-v**2) - dens[:, :] *= W - xmom[:, :] = rhoh[:, :]*u*W**2 - ymom[:, :] = rhoh[:, :]*v*W**2 - - ener[:, :] = rhoh[:, :]*W**2 - p - dens[:, :] - - -def finalize(): - """ print out any information to the user at the end of the run """ - - print(""" - """) diff --git a/pyro/compressible_sr/problems/bubble.py b/pyro/compressible_sr/problems/bubble.py deleted file mode 100644 index 2cf44913b..000000000 --- a/pyro/compressible_sr/problems/bubble.py +++ /dev/null @@ -1,99 +0,0 @@ -import sys - -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize the bubble problem """ - - msg.bold("initializing the bubble problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in bubble.py") - print(my_data.__class__) - sys.exit() - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - gamma = rp.get_param("eos.gamma") - - grav = rp.get_param("compressible.grav") - - scale_height = rp.get_param("bubble.scale_height") - dens_base = rp.get_param("bubble.dens_base") - dens_cutoff = rp.get_param("bubble.dens_cutoff") - - x_pert = rp.get_param("bubble.x_pert") - y_pert = rp.get_param("bubble.y_pert") - r_pert = rp.get_param("bubble.r_pert") - pert_amplitude_factor = rp.get_param("bubble.pert_amplitude_factor") - - # initialize the components, remember, that ener here is - # rho*eint + 0.5*rho*v**2, where eint is the specific - # internal energy (erg/g) - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - dens[:, :] = dens_cutoff - - # set the density to be stratified in the y-direction - myg = my_data.grid - - p = myg.scratch_array() - - cs2 = scale_height*abs(grav) - - for j in range(myg.jlo, myg.jhi+1): - dens[:, j] = max(dens_base*np.exp(-myg.y[j]/scale_height), - dens_cutoff) - if j == myg.jlo: - p[:, j] = dens[:, j]*cs2 - else: - p[:, j] = p[:, j-1] + 0.5*myg.dy*(dens[:, j] + dens[:, j-1])*grav - - # set the energy (P = cs2*dens) - ener[:, :] = p[:, :]/(gamma - 1.0) + \ - 0.5*(xmom[:, :]**2 + ymom[:, :]**2)/dens[:, :] - - r = np.sqrt((myg.x2d - x_pert)**2 + (myg.y2d - y_pert)**2) - idx = r <= r_pert - - # boost the specific internal energy, keeping the pressure - # constant, by dropping the density - eint = (ener[idx] - 0.5*(xmom[idx]**2 - ymom[idx]**2)/dens[idx])/dens[idx] - - pres = dens[idx]*eint*(gamma - 1.0) - - eint = eint*pert_amplitude_factor - dens[idx] = pres/(eint*(gamma - 1.0)) - - ener[idx] = dens[idx]*eint + 0.5*(xmom[idx]**2 + ymom[idx]**2)/dens[idx] - - # p[idx] = pres - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - W = 1 / (np.sqrt(1-(xmom**2-ymom**2)/dens)) - - dens[:, :] *= W - xmom[:, :] *= rhoh[:, :]/dens*W**2 - ymom[:, :] *= rhoh[:, :]/dens*W**2 - - # HACK: didn't work but W = 1 so shall cheat - ener[:, :] = rhoh[:, :]*W**2 - p - dens[:, :] - # ener[:, :] = p / (gamma-1) - - # print(ener[:,myg.jlo:myg.jhi])#*W[:,myg.jlo:myg.jhi]**2) - # exit() - - -def finalize(): - """ print out any information to the user at the end of the run """ diff --git a/pyro/compressible_sr/problems/gresho.py b/pyro/compressible_sr/problems/gresho.py deleted file mode 100644 index d9b72ba4a..000000000 --- a/pyro/compressible_sr/problems/gresho.py +++ /dev/null @@ -1,88 +0,0 @@ -import sys - -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize the Gresho vortex problem """ - - msg.bold("initializing the Gresho vortex problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ErrrrOrr: patch invalid in bubble.py") - print(my_data.__class__) - sys.exit() - - # get the density and velocities - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - gamma = rp.get_param("eos.gamma") - - dens_base = rp.get_param("gresho.dens_base") - - rr = rp.get_param("gresho.r") - u0 = rp.get_param("gresho.u0") - p0 = rp.get_param("gresho.p0") - - # initialize the components -- we'll get a psure too - # but that is used only to initialize the base state - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - - # set the density to be stratified in the y-direction - myg = my_data.grid - pres = myg.scratch_array() - - dens[:, :] = dens_base - - pres[:, :] = p0 - - x_centre = 0.5 * (myg.x[0] + myg.x[-1]) - y_centre = 0.5 * (myg.y[0] + myg.y[-1]) - - rad = np.sqrt((myg.x2d - x_centre)**2 + (myg.y2d - y_centre)**2) - - pres[rad <= rr] += 0.5 * (u0 * rad[rad <= rr]/rr)**2 - pres[(rad > rr) & (rad <= 2*rr)] += u0**2 * \ - (0.5 * (rad[(rad > rr) & (rad <= 2*rr)]/rr)**2 + - 4 * (1 - rad[(rad > rr) & (rad <= 2*rr)]/rr + - np.log(rad[(rad > rr) & (rad <= 2*rr)]/rr))) - pres[rad > 2*rr] += u0**2 * (4 * np.log(2) - 2) - # print(p[rad > 2*rr]) - # - uphi = np.zeros_like(pres) - uphi[rad <= rr] = u0 * rad[rad <= rr]/rr - uphi[(rad > rr) & (rad <= 2*rr)] = u0 * (2 - rad[(rad > rr) & (rad <= 2*rr)]/rr) - - xmom[:, :] = -uphi[:, :] * (myg.y2d - y_centre) / rad[:, :] - ymom[:, :] = uphi[:, :] * (myg.x2d - x_centre) / rad[:, :] - - # rhoe - # enerad[:, :] = p[:, :]/(gamma - 1.0) + \ - # 0.5*(xmom[:, :]**2 + ymom[:, :]**2)/dens[:, :] - - # dens[:, :] = p[:, :]/(eint[:, :]*(gamma - 1.0)) - - rhoh = eos.rhoh_from_rho_p(gamma, dens, pres) - - w_lor = 1./np.sqrt(1. - xmom**2 - ymom**2) - dens[:, :] *= w_lor - xmom[:, :] *= rhoh*w_lor**2 - ymom[:, :] *= rhoh*w_lor**2 - - ener[:, :] = rhoh*w_lor**2 - pres - dens - - # print(ymom[5:-5, 5:-5]) - # exit() - - -def finalize(): - """ print out any information to the userad at the end of the run """ diff --git a/pyro/compressible_sr/problems/hse.py b/pyro/compressible_sr/problems/hse.py deleted file mode 100644 index cb25e4930..000000000 --- a/pyro/compressible_sr/problems/hse.py +++ /dev/null @@ -1,67 +0,0 @@ -import sys - -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize the HSE problem """ - - msg.bold("initializing the HSE problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in hse.py") - print(my_data.__class__) - sys.exit() - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - gamma = rp.get_param("eos.gamma") - - grav = rp.get_param("compressible.grav") - - dens0 = rp.get_param("hse.dens0") - print("dens0 = ", dens0) - H = rp.get_param("hse.h") - - # isothermal sound speed (squared) - cs2 = H*abs(grav) - - # initialize the components, remember, that ener here is - # rho*eint + 0.5*rho*v**2, where eint is the specific - # internal energy (erg/g) - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - dens[:, :] = 0.0 - - # set the density to be stratified in the y-direction - myg = my_data.grid - - p = myg.scratch_array() - - for j in range(myg.jlo, myg.jhi+1): - dens[:, j] = dens0*np.exp(-myg.y[j]/H) - if j == myg.jlo: - p[:, j] = dens[:, j]*cs2 - else: - p[:, j] = p[:, j-1] + 0.5*myg.dy*(dens[:, j] + dens[:, j-1])*grav - - # # set the energy - # ener[:, :] = p[:, :]/(gamma - 1.0) + \ - # 0.5*(xmom[:, :]**2 + ymom[:, :]**2)/dens[:, :] - - # W = 1 - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - ener[:, :] = rhoh - p - dens - - -def finalize(): - """ print out any information to the user at the end of the run """ diff --git a/pyro/compressible_sr/problems/inputs.acoustic_pulse b/pyro/compressible_sr/problems/inputs.acoustic_pulse deleted file mode 100644 index 20136ffab..000000000 --- a/pyro/compressible_sr/problems/inputs.acoustic_pulse +++ /dev/null @@ -1,39 +0,0 @@ -[driver] -max_steps = 5000 -tmax = 0.24 -# 0.192 * dx -fix_dt = 1.5e-3 - -[compressible] -cvisc = 0.1 -grav = 0.0 -riemann = CGF - - -[io] -basename = acoustic_pulse_ -dt_out = 0.03 - -[eos] -gamma = 1.4 - - -[mesh] -nx = 128 -ny = 128 -xmax = 1.0 -ymax = 1.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = periodic -yrboundary = periodic - - -[acoustic_pulse] -rho0 = 1.4 -drho0 = 0.14 - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.acoustic_pulse.256 b/pyro/compressible_sr/problems/inputs.acoustic_pulse.256 deleted file mode 100644 index 13743d11e..000000000 --- a/pyro/compressible_sr/problems/inputs.acoustic_pulse.256 +++ /dev/null @@ -1,39 +0,0 @@ -[driver] -max_steps = 5000 -tmax = 0.24 -# 0.192 * dx -fix_dt = 7.5e-4 - - -[compressible] -cvisc = 0.1 - - -[io] -basename = acoustic_pulse_256_ -dt_out = 0.03 - - -[eos] -gamma = 1.4 - - -[mesh] -nx = 256 -ny = 256 -xmax = 1.0 -ymax = 1.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = periodic -yrboundary = periodic - - -[acoustic_pulse] -rho0 = 1.4 -drho0 = 0.14 - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.acoustic_pulse.512 b/pyro/compressible_sr/problems/inputs.acoustic_pulse.512 deleted file mode 100644 index 610d8b039..000000000 --- a/pyro/compressible_sr/problems/inputs.acoustic_pulse.512 +++ /dev/null @@ -1,39 +0,0 @@ -[driver] -max_steps = 5000 -tmax = 0.24 -# 0.192 * dx -fix_dt = 3.75e-4 - - -[compressible] -cvisc = 0.1 - - -[io] -basename = acoustic_pulse_512_ -dt_out = 0.03 - - -[eos] -gamma = 1.4 - - -[mesh] -nx = 512 -ny = 512 -xmax = 1.0 -ymax = 1.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = periodic -yrboundary = periodic - - -[acoustic_pulse] -rho0 = 1.4 -drho0 = 0.14 - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.acoustic_pulse.64 b/pyro/compressible_sr/problems/inputs.acoustic_pulse.64 deleted file mode 100644 index f2ca50e65..000000000 --- a/pyro/compressible_sr/problems/inputs.acoustic_pulse.64 +++ /dev/null @@ -1,37 +0,0 @@ -[driver] -max_steps = 5000 -tmax = 0.24 -# 0.192 * dx -fix_dt = 3.0e-3 - -[compressible] -cvisc = 0.1 - - -[io] -basename = acoustic_pulse_64_ -dt_out = 0.03 - -[eos] -gamma = 1.4 - - -[mesh] -nx = 64 -ny = 64 -xmax = 1.0 -ymax = 1.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = periodic -yrboundary = periodic - - -[acoustic_pulse] -rho0 = 1.4 -drho0 = 0.14 - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.advect.128 b/pyro/compressible_sr/problems/inputs.advect.128 deleted file mode 100644 index c657a646a..000000000 --- a/pyro/compressible_sr/problems/inputs.advect.128 +++ /dev/null @@ -1,36 +0,0 @@ -[driver] -max_steps = 500 -tmax = 1.0 - -init_tstep_factor = 1.0 -fix_dt = 0.0025 - - -[compressible] -limiter = 0 -cvisc = 0.1 - - -[io] -basename = advect_ - - -[eos] -gamma = 1.4 - - -[mesh] -nx = 128 -ny = 128 -xmax = 1.0 -ymax = 1.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = periodic -yrboundary = periodic - - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.advect.256 b/pyro/compressible_sr/problems/inputs.advect.256 deleted file mode 100644 index 77cec1857..000000000 --- a/pyro/compressible_sr/problems/inputs.advect.256 +++ /dev/null @@ -1,36 +0,0 @@ -[driver] -max_steps = 1000 -tmax = 1.0 - -init_tstep_factor = 1.0 -fix_dt = 0.00125 - - -[compressible] -limiter = 0 -cvisc = 0.1 - - -[io] -basename = advect_ - - -[eos] -gamma = 1.4 - - -[mesh] -nx = 256 -ny = 256 -xmax = 1.0 -ymax = 1.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = periodic -yrboundary = periodic - - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.advect.64 b/pyro/compressible_sr/problems/inputs.advect.64 deleted file mode 100644 index 34f9231e1..000000000 --- a/pyro/compressible_sr/problems/inputs.advect.64 +++ /dev/null @@ -1,38 +0,0 @@ -[driver] -max_steps = 500 -tmax = 1.0 - -init_tstep_factor = 1.0 -fix_dt = 0.005 - - -[compressible] -limiter = 0 -cvisc = 0.1 -grav = 0.0 -riemann = CGF - - -[io] -basename = advect_ - - -[eos] -gamma = 1.4 - - -[mesh] -nx = 64 -ny = 64 -xmax = 1.0 -ymax = 1.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = periodic -yrboundary = periodic - - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.bubble b/pyro/compressible_sr/problems/inputs.bubble deleted file mode 100644 index 2640433b6..000000000 --- a/pyro/compressible_sr/problems/inputs.bubble +++ /dev/null @@ -1,39 +0,0 @@ -# simple inputs files for the bubble problem. - -[driver] -max_steps = 1000 -tmax = 100.0 - - -[io] -basename = bubble_ -n_out = 100 - - -[mesh] -nx = 128 -ny = 256 -xmax = 4.0 -ymax = 8.0 - -xlboundary = outflow -xrboundary = outflow - -ylboundary = hse -yrboundary = hse - - -[bubble] -scale_height = 1.0 -dens_base = 1000.0 - -x_pert = 2.0 -y_pert = 2.0 -r_pert = 0.25 -pert_amplitude_factor = 2.0 - - -[compressible] -grav = -2.0 - -limiter = 2 diff --git a/pyro/compressible_sr/problems/inputs.gresho b/pyro/compressible_sr/problems/inputs.gresho deleted file mode 100644 index 6c9ea0c26..000000000 --- a/pyro/compressible_sr/problems/inputs.gresho +++ /dev/null @@ -1,35 +0,0 @@ -# simple inputs files for the unsplit CTU hydro scheme - -[driver] -max_steps = 2000 -tmax = 10000.0 -cfl = 0.8 - - -[io] -basename = gresho_128_ -n_out = 1 - - -[mesh] -nx = 128 -ny = 128 -xmax = 1.0 -ymax = 1.0 - -xlboundary = outflow -xrboundary = outflow - -ylboundary = outflow -yrboundary = outflow - - -[gresho] -r = 0.2 -u0 = 0.5 -p0 = 0.1 -dens_base = 0.1 - -[compressible] -limiter=2 -grav = 0 diff --git a/pyro/compressible_sr/problems/inputs.hse b/pyro/compressible_sr/problems/inputs.hse deleted file mode 100644 index 08eef9473..000000000 --- a/pyro/compressible_sr/problems/inputs.hse +++ /dev/null @@ -1,34 +0,0 @@ -# simple inputs files for the four-corner problem. - -[driver] -max_steps = 10000 -tmax = 3.0 - - -[io] -basename = rt_ -n_out = 100 - - -[mesh] -nx = 64 -ny = 192 -xmax = 1.0 -ymax = 3.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = hse -yrboundary = hse - - -[hse] -dens0 = 1.0 -H = 1.0 - - -[compressible] -grav = -1.0 - -limiter = 2 diff --git a/pyro/compressible_sr/problems/inputs.kh b/pyro/compressible_sr/problems/inputs.kh deleted file mode 100644 index 510dc0e29..000000000 --- a/pyro/compressible_sr/problems/inputs.kh +++ /dev/null @@ -1,43 +0,0 @@ -[driver] -max_steps = 5000 -tmax = 2.0 -splitting = unsplit - - -[compressible] -limiter = 2 -cvisc = 0.1 - - -[io] -basename = kh_ -tplot = 0.01 - - -[eos] -gamma = 1.4 - - -[mesh] -nx = 128 -ny = 128 -xmax = 1.0 -ymax = 1.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = periodic -yrboundary = periodic - - -[kh] -rho_1 = 1 -v_1 = -0.2 - -rho_2 = 2 -v_2 = 0.2 - - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.logo b/pyro/compressible_sr/problems/inputs.logo deleted file mode 100644 index d0a3973db..000000000 --- a/pyro/compressible_sr/problems/inputs.logo +++ /dev/null @@ -1,34 +0,0 @@ -[driver] -max_steps = 5000 -tmax = 30.0 - - -[compressible] -limiter = 2 -cvisc = 0.1 - - -[io] -basename = logo_ -dt_out = 0.02 - - -[eos] -gamma = 1.4 - - -[mesh] -nx = 128 -ny = 128 -xmax = 1.0 -ymax = 1.0 - -xlboundary = outflow -xrboundary = outflow - -ylboundary = outflow -yrboundary = outflow - - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.quad b/pyro/compressible_sr/problems/inputs.quad deleted file mode 100644 index eb03042ca..000000000 --- a/pyro/compressible_sr/problems/inputs.quad +++ /dev/null @@ -1,53 +0,0 @@ -# simple inputs files for the four-corner problem. - -[driver] -max_steps = 1000 -tmax = 0.8 - - -[compressible] -limiter = 0 -cvisc = 0.1 -grav = 0.0 - -[io] -basename = quad_unsplit_ -dt_out = 0.1 - - -[mesh] -nx = 256 -ny = 256 -xmax = 1.0 -ymax = 1.0 - -xlboundary = outflow -xrboundary = outflow - -ylboundary = outflow -yrboundary = outflow - - -[quadrant] -rho1 = 1.0 -u1 = 0.0 -v1 = 0.0 -p1 = 1.0 - -rho2 = 0.532258064516129 -u2 = 0.1206045378311055 -v2 = 0.0 -p2 = 0.3 - -rho3 = 0.137992831541219 -u3 = 0.106045378311055 -v3 = 0.106045378311055 -p3 = 0.08 - -rho4 = 0.532258064516129 -u4 = 0.0 -v4 = 0.106045378311055 -p4 = 0.3 - -cx = 0.8 -cy = 0.8 diff --git a/pyro/compressible_sr/problems/inputs.rt b/pyro/compressible_sr/problems/inputs.rt deleted file mode 100644 index f3cce0a7f..000000000 --- a/pyro/compressible_sr/problems/inputs.rt +++ /dev/null @@ -1,40 +0,0 @@ -# simple inputs files for the four-corner problem. - -[driver] -max_steps = 10000 -tmax = 5.0 - - -[io] -basename = rt_ -n_out = 100 - - -[mesh] -nx = 64 -ny = 192 -xmax = 1.0 -ymax = 3.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = hse -yrboundary = hse - - -[rt] -dens1 = 1.0 -dens2 = 2.0 - -amp = 0.1 -sigma = 0.025 - -p0 = 10.0 - - - -[compressible] -grav = -2.0 - -limiter = 2 diff --git a/pyro/compressible_sr/problems/inputs.rt2 b/pyro/compressible_sr/problems/inputs.rt2 deleted file mode 100644 index 6f76e907c..000000000 --- a/pyro/compressible_sr/problems/inputs.rt2 +++ /dev/null @@ -1,33 +0,0 @@ -# simple inputs files for the four-corner problem. - -[driver] -max_steps = 10000 -tmax = 5.0 - - -[io] -basename = rt_ -n_out = 10000 -dt_out = 0.025 - -[mesh] -nx = 384 -ny = 192 -xmax = 6.0 -ymax = 3.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = hse -yrboundary = hse - - -[rt2] -amp = 0.1 -sigma = 0.025 - -[compressible] -grav = -1.0 - -limiter = 2 diff --git a/pyro/compressible_sr/problems/inputs.rt_gravity_waves b/pyro/compressible_sr/problems/inputs.rt_gravity_waves deleted file mode 100644 index f34d41857..000000000 --- a/pyro/compressible_sr/problems/inputs.rt_gravity_waves +++ /dev/null @@ -1,37 +0,0 @@ -# simple inputs files for the four-corner problem. - -[driver] -max_steps = 10000 -tmax = 3.0 - - -[io] -basename = rt_ -n_out = 3 -dt_out = 1000000 - - -[mesh] -nx = 64 -ny = 192 -xmax = 1.0 -ymax = 3.0 - -xlboundary = periodic -xrboundary = periodic - -ylboundary = hse -yrboundary = hse - - -[rt] -amp = 0.25 - -dens1 = 2.0 -dens2 = 1.0 - - -[compressible] -grav = -1.0 - -limiter = 2 diff --git a/pyro/compressible_sr/problems/inputs.sedov b/pyro/compressible_sr/problems/inputs.sedov deleted file mode 100644 index ad4f1154e..000000000 --- a/pyro/compressible_sr/problems/inputs.sedov +++ /dev/null @@ -1,39 +0,0 @@ -[driver] -max_steps = 5000 -tmax = 0.5 -cfl = 0.5 - - -[compressible] -limiter = 2 -cvisc = 0.1 - - -[io] -basename = sedov_unsplit_ -dt_out = 0.0125 - - -[eos] -gamma = 1.4 - - -[mesh] -nx = 128 -ny = 128 -xmax = 1.0 -ymax = 1.0 - -xlboundary = outflow -xrboundary = outflow - -ylboundary = outflow -yrboundary = outflow - - -[sedov] -r_init = 0.01 - - -[vis] -dovis = 1 diff --git a/pyro/compressible_sr/problems/inputs.sod.x b/pyro/compressible_sr/problems/inputs.sod.x deleted file mode 100644 index 0a6af5309..000000000 --- a/pyro/compressible_sr/problems/inputs.sod.x +++ /dev/null @@ -1,38 +0,0 @@ -# simple inputs files for the unsplit CTU hydro scheme - -[driver] -max_steps = 500 -tmax = 1 - -[compressible] -limiter = 1 - -[io] -basename = sod_x_ -dt_out = 0.05 - -[mesh] -nx = 512 -ny = 10 -xmax = 1.0 -ymax = .05 -xlboundary = outflow -xrboundary = outflow -ylboundary = periodic -yrboundary = periodic - - -[sod] -direction = x - -dens_left = 1.0 -dens_right = 0.125 - -u_left = 0.0 -u_right = 0.0 - -p_left = 0.5 -p_right = 0.1 - -[eos] -gamma = 1.4 diff --git a/pyro/compressible_sr/problems/inputs.sod.y b/pyro/compressible_sr/problems/inputs.sod.y deleted file mode 100644 index 9e952fd5d..000000000 --- a/pyro/compressible_sr/problems/inputs.sod.y +++ /dev/null @@ -1,29 +0,0 @@ -# simple inputs files for the unsplit CTU hydro scheme - -[driver] -max_steps = 200 -tmax = 0.2 - -[io] -basename = sod_y_ -dt_out = 0.05 - -[mesh] -nx = 10 -ny = 128 -xmax = .05 -ymax = 1.0 -ylboundary = outflow -yrboundary = outflow - -[sod] -direction = y - -dens_left = 1.0 -dens_right = 0.125 - -u_left = 0.0 -u_right = 0.0 - -p_left = 1.0 -p_right = 0.1 diff --git a/pyro/compressible_sr/problems/kh.py b/pyro/compressible_sr/problems/kh.py deleted file mode 100644 index 3a0d57319..000000000 --- a/pyro/compressible_sr/problems/kh.py +++ /dev/null @@ -1,88 +0,0 @@ -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize the Kelvin-Helmholtz problem """ - - msg.bold("initializing the Kelvin-Helmholtz problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print(my_data.__class__) - msg.fail("ERROR: patch invalid in kh.py") - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - # initialize the components, remember, that ener here is rho*eint - # + 0.5*rho*v**2, where eint is the specific internal energy - # (erg/g) - dens[:, :] = 1.0 - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - - rho_1 = rp.get_param("kh.rho_1") - v_1 = rp.get_param("kh.v_1") - rho_2 = rp.get_param("kh.rho_2") - v_2 = rp.get_param("kh.v_2") - - gamma = rp.get_param("eos.gamma") - - myg = my_data.grid - - dy = 0.025 - w0 = 0.01 - vm = 0.5*(v_1 - v_2) - rhom = 0.5*(rho_1 - rho_2) - - idx1 = myg.y2d < 0.25 - idx2 = np.logical_and(myg.y2d >= 0.25, myg.y2d < 0.5) - idx3 = np.logical_and(myg.y2d >= 0.5, myg.y2d < 0.75) - idx4 = myg.y2d >= 0.75 - - # we will initialize momemum as velocity for now - - # lower quarter - dens[idx1] = rho_1 - rhom*np.exp((myg.y2d[idx1] - 0.25)/dy) - xmom[idx1] = v_1 - vm*np.exp((myg.y2d[idx1] - 0.25)/dy) - - # second quarter - dens[idx2] = rho_2 + rhom*np.exp((0.25 - myg.y2d[idx2])/dy) - xmom[idx2] = v_2 + vm*np.exp((0.25 - myg.y2d[idx2])/dy) - - # third quarter - dens[idx3] = rho_2 + rhom*np.exp((myg.y2d[idx3] - 0.75)/dy) - xmom[idx3] = v_2 + vm*np.exp((myg.y2d[idx3] - 0.75)/dy) - - # fourth quarter - dens[idx4] = rho_1 - rhom*np.exp((0.75 - myg.y2d[idx4])/dy) - xmom[idx4] = v_1 - vm*np.exp((0.75 - myg.y2d[idx4])/dy) - - # upper half - xmom[:, :] *= dens - ymom[:, :] = dens * w0 * np.sin(4*np.pi*myg.x2d) - - p = 2.5 - ener[:, :] = p/(gamma - 1.0) + 0.5*(xmom[:, :]**2 + ymom[:, :]**2)/dens[:, :] - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - u = xmom/dens - v = ymom/dens - W = 1./np.sqrt(1-u**2-v**2) - dens[:, :] *= W - xmom[:, :] = rhoh[:, :]*u*W**2 - ymom[:, :] = rhoh[:, :]*v*W**2 - - ener[:, :] = rhoh[:, :]*W**2 - p - dens[:, :] - - -def finalize(): - """ print out any information to the user at the end of the run """ diff --git a/pyro/compressible_sr/problems/logo.py b/pyro/compressible_sr/problems/logo.py deleted file mode 100644 index 3f7b08b45..000000000 --- a/pyro/compressible_sr/problems/logo.py +++ /dev/null @@ -1,89 +0,0 @@ -import sys - -import matplotlib.pyplot as plt -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize the sedov problem """ - - msg.bold("initializing the logo problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in sedov.py") - print(my_data.__class__) - sys.exit() - - # create the logo - myg = my_data.grid - - fig = plt.figure(2, (0.64, 0.64), dpi=100*myg.nx/64) - fig.add_subplot(111) - - fig.text(0.5, 0.5, "pyro", transform=fig.transFigure, fontsize="16", - horizontalalignment="center", verticalalignment="center") - - plt.axis("off") - - fig.canvas.draw() - data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') - data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) - - logo = np.rot90(np.rot90(np.rot90((256-data[:, :, 1])/255.0))) - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - myg = my_data.grid - - # initialize the components, remember, that ener here is rho*eint - # + 0.5*rho*v**2, where eint is the specific internal energy - # (erg/g) - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - - # set the density in the logo zones to be really large - logo_dens = 0.1 - - dens[:, :] = logo_dens * (0.5 + logo[0, 0]) - - dens.v()[:, :] = (0.5 + logo[:, :]) * logo_dens - - # pressure equilibrium - gamma = rp.get_param("eos.gamma") - - p_ambient = 1.e-1 - p = myg.scratch_array(nvar=1) - p[:, :] = p_ambient * (0.8 + logo[0, 0]) - p.v()[:, :] *= (0.8 + logo[:, :]) - # ener[:, :] = p/(gamma - 1.0) - # ener.v()[:, :] *= (0.2 + logo[:, :]) - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - u = xmom/dens - v = ymom/dens - W = 1./np.sqrt(1-u**2-v**2) - dens[:, :] *= W - xmom[:, :] = rhoh[:, :]*u*W**2 - ymom[:, :] = rhoh[:, :]*v*W**2 - - ener[:, :] = rhoh[:, :]*W**2 - p - dens[:, :] - - -def finalize(): - """ print out any information to the user at the end of the run """ - - print(""" - The script analysis/sedov_compare.py can be used to analyze these - results. That will perform an average at constant radius and - compare the radial profiles to the exact solution. Sample exact - data is provided as analysis/cylindrical-sedov.out - """) diff --git a/pyro/compressible_sr/problems/logo.txt b/pyro/compressible_sr/problems/logo.txt deleted file mode 100644 index e57926259..000000000 --- a/pyro/compressible_sr/problems/logo.txt +++ /dev/null @@ -1,21 +0,0 @@ -xxxxxxx -xxxxxxxx -xx xx -xx xx -xx xx -xx xxx -xxxxxxx xx xx xx xxxx xxxx -xxxxx xx xx xx xxxxx xxxxxx -xx xx xx xxxx xxx xxx -xx xx xx xxx xx xx -xx xx xx xx xx xx -xx xxx xx xx xxx xxx -xx xxxxxx xx xxxxxx -xx xxxx xx xxxx - xx - xx - xx - xx - xx - xxxx - xxx diff --git a/pyro/compressible_sr/problems/quad.py b/pyro/compressible_sr/problems/quad.py deleted file mode 100644 index cec02ddc6..000000000 --- a/pyro/compressible_sr/problems/quad.py +++ /dev/null @@ -1,111 +0,0 @@ -import sys - -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize the quadrant problem """ - - msg.bold("initializing the quadrant problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in quad.py") - print(my_data.__class__) - sys.exit() - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - # initialize the components, remember, that ener here is - # rho*eint + 0.5*rho*v**2, where eint is the specific - # internal energy (erg/g) - r1 = rp.get_param("quadrant.rho1") - u1 = rp.get_param("quadrant.u1") - v1 = rp.get_param("quadrant.v1") - p1 = rp.get_param("quadrant.p1") - - r2 = rp.get_param("quadrant.rho2") - u2 = rp.get_param("quadrant.u2") - v2 = rp.get_param("quadrant.v2") - p2 = rp.get_param("quadrant.p2") - - r3 = rp.get_param("quadrant.rho3") - u3 = rp.get_param("quadrant.u3") - v3 = rp.get_param("quadrant.v3") - p3 = rp.get_param("quadrant.p3") - - r4 = rp.get_param("quadrant.rho4") - u4 = rp.get_param("quadrant.u4") - v4 = rp.get_param("quadrant.v4") - p4 = rp.get_param("quadrant.p4") - - cx = rp.get_param("quadrant.cx") - cy = rp.get_param("quadrant.cy") - - gamma = rp.get_param("eos.gamma") - - # there is probably an easier way to do this, but for now, we - # will just do an explicit loop. Also, we really want to set - # the pressure and get the internal energy from that, and then - # compute the total energy (which is what we store). For now - # we will just fake this - - myg = my_data.grid - - iq1 = np.logical_and(myg.x2d >= cx, myg.y2d >= cy) - iq2 = np.logical_and(myg.x2d < cx, myg.y2d >= cy) - iq3 = np.logical_and(myg.x2d < cx, myg.y2d < cy) - iq4 = np.logical_and(myg.x2d >= cx, myg.y2d < cy) - - # quadrant 1 - dens[iq1] = r1 - xmom[iq1] = u1 - ymom[iq1] = v1 - # ener[iq1] = p1/(gamma - 1.0) + 0.5*r1*(u1*u1 + v1*v1) - - # quadrant 2 - dens[iq2] = r2 - xmom[iq2] = u2 - ymom[iq2] = v2 - # ener[iq2] = p2/(gamma - 1.0) + 0.5*r2*(u2*u2 + v2*v2) - - # quadrant 3 - dens[iq3] = r3 - xmom[iq3] = u3 - ymom[iq3] = v3 - # ener[iq3] = p3/(gamma - 1.0) + 0.5*r3*(u3*u3 + v3*v3) - - # quadrant 4 - dens[iq4] = r4 - xmom[iq4] = u4 - ymom[iq4] = v4 - # ener[iq4] = p4/(gamma - 1.0) + 0.5*r4*(u4*u4 + v4*v4) - - p = np.zeros_like(dens) - p[iq1] = p1 - p[iq2] = p2 - p[iq3] = p3 - p[iq4] = p4 - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - u = xmom - v = ymom - W = 1./np.sqrt(1-u**2-v**2) - dens[:, :] *= W - xmom[:, :] = rhoh[:, :]*u*W**2 - ymom[:, :] = rhoh[:, :]*v*W**2 - - ener[:, :] = rhoh[:, :]*W**2 - p - dens[:, :] - - -def finalize(): - """ print out any information to the user at the end of the run """ diff --git a/pyro/compressible_sr/problems/rt.py b/pyro/compressible_sr/problems/rt.py deleted file mode 100644 index 43473004b..000000000 --- a/pyro/compressible_sr/problems/rt.py +++ /dev/null @@ -1,82 +0,0 @@ -import sys - -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize the rt problem """ - - msg.bold("initializing the rt problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in rt.py") - print(my_data.__class__) - sys.exit() - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - gamma = rp.get_param("eos.gamma") - - grav = rp.get_param("compressible.grav") - - dens1 = rp.get_param("rt.dens1") - dens2 = rp.get_param("rt.dens2") - p0 = rp.get_param("rt.p0") - amp = rp.get_param("rt.amp") - sigma = rp.get_param("rt.sigma") - - # initialize the components, remember, that ener here is - # rho*eint + 0.5*rho*v**2, where eint is the specific - # internal energy (erg/g) - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - dens[:, :] = 0.0 - - # set the density to be stratified in the y-direction - myg = my_data.grid - - ycenter = 0.5*(myg.ymin + myg.ymax) - - p = myg.scratch_array() - - p[:, :] = p0 - dens[:, :] = dens1 - - for j in range(myg.jlo, myg.jhi+1): - if myg.y[j] < ycenter: - dens[:, j] = dens1 - p[:, j] = p0 + dens1*grav*myg.y[j] - - else: - dens[:, j] = dens2 - p[:, j] = p0 + dens1*grav*ycenter + dens2*grav*(myg.y[j] - ycenter) - - ymom[:, :] = amp*np.cos(2.0*np.pi*myg.x2d/(myg.xmax-myg.xmin))*np.exp(-(myg.y2d-ycenter)**2/sigma**2) - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - u = xmom - v = ymom - W = 1./np.sqrt(1-u**2-v**2) - dens[:, :] *= W - xmom[:, :] *= rhoh[:, :]*W**2 - ymom[:, :] *= rhoh[:, :]*W**2 - - ener[:, :] = rhoh[:, :]*W**2 - p - dens[:, :] - - # set the energy (P = cs2*dens) - # ener[:, :] = p[:, :]/(gamma - 1.0) + \ - # 0.5*(xmom[:, :]**2 + ymom[:, :]**2)/dens[:, :] - - -def finalize(): - """ print out any information to the user at the end of the run """ diff --git a/pyro/compressible_sr/problems/rt2.py b/pyro/compressible_sr/problems/rt2.py deleted file mode 100644 index 3eccfaf76..000000000 --- a/pyro/compressible_sr/problems/rt2.py +++ /dev/null @@ -1,94 +0,0 @@ -"""A RT problem with two distinct modes: short wave length on the -left and long wavelength on the right. This allows one to see -how the growth rate depends on wavenumber. -""" - - -import sys - -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - - """ initialize the rt problem """ - - msg.bold("initializing the rt problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in rt2.py") - print(my_data.__class__) - sys.exit() - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - gamma = rp.get_param("eos.gamma") - - grav = rp.get_param("compressible.grav") - - dens1 = rp.get_param("rt2.dens1") - dens2 = rp.get_param("rt2.dens2") - p0 = rp.get_param("rt2.p0") - amp = rp.get_param("rt2.amp") - sigma = rp.get_param("rt2.sigma") - - # initialize the components, remember, that ener here is - # rho*eint + 0.5*rho*v**2, where eint is the specific - # internal energy (erg/g) - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - dens[:, :] = 0.0 - - f_l = 18 - f_r = 3 - - # set the density to be stratified in the y-direction - myg = my_data.grid - - ycenter = 0.5*(myg.ymin + myg.ymax) - - p = myg.scratch_array() - - j = myg.jlo - while j <= myg.jhi: - if myg.y[j] < ycenter: - dens[:, j] = dens1 - p[:, j] = p0 + dens1*grav*myg.y[j] - - else: - dens[:, j] = dens2 - p[:, j] = p0 + dens1*grav*ycenter + dens2*grav*(myg.y[j] - ycenter) - - j += 1 - - idx_l = myg.x2d < (myg.xmax - myg.xmin)/3.0 - idx_r = myg.x2d >= (myg.xmax - myg.xmin)/3.0 - - ymom[idx_l] = amp*np.sin(4.0*np.pi*f_l*myg.x2d[idx_l] / - (myg.xmax-myg.xmin))*np.exp(-(myg.y2d[idx_l]-ycenter)**2/sigma**2) - ymom[idx_r] = amp*np.sin(4.0*np.pi*f_r*myg.x2d[idx_r] / - (myg.xmax-myg.xmin))*np.exp(-(myg.y2d[idx_r]-ycenter)**2/sigma**2) - - ymom *= dens - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - W = 1./np.sqrt(1-xmom**2-ymom**2) - dens[:, :] *= W - xmom[:, :] *= rhoh*W**2 - ymom[:, :] *= rhoh*W**2 - - ener[:, :] = rhoh*W**2 - p - dens - - -def finalize(): - """ print out any information to the user at the end of the run """ diff --git a/pyro/compressible_sr/problems/sedov.py b/pyro/compressible_sr/problems/sedov.py deleted file mode 100644 index e39a10962..000000000 --- a/pyro/compressible_sr/problems/sedov.py +++ /dev/null @@ -1,93 +0,0 @@ -import math -import sys - -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize the sedov problem """ - - msg.bold("initializing the sedov problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in sedov.py") - print(my_data.__class__) - sys.exit() - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - # initialize the components, remember, that ener here is rho*eint - # + 0.5*rho*v**2, where eint is the specific internal energy - # (erg/g) - dens[:, :] = 1.0 - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - - E_sedov = 2.0e-3 - - r_init = rp.get_param("sedov.r_init") - - gamma = rp.get_param("eos.gamma") - pi = math.pi - - xmin = rp.get_param("mesh.xmin") - xmax = rp.get_param("mesh.xmax") - - ymin = rp.get_param("mesh.ymin") - ymax = rp.get_param("mesh.ymax") - - xctr = 0.5*(xmin + xmax) - yctr = 0.5*(ymin + ymax) - - # initialize the pressure by putting the explosion energy into a - # volume of constant pressure. Then compute the energy in a zone - # from this. - nsub = rp.get_param("sedov.nsub") - - dist = np.sqrt((my_data.grid.x2d - xctr)**2 + - (my_data.grid.y2d - yctr)**2) - - p = 1.e-5 - ener[:, :] = p/(gamma - 1.0) - - for i, j in np.transpose(np.nonzero(dist < 2.0*r_init)): - - xsub = my_data.grid.xl[i] + (my_data.grid.dx/nsub)*(np.arange(nsub) + 0.5) - ysub = my_data.grid.yl[j] + (my_data.grid.dy/nsub)*(np.arange(nsub) + 0.5) - - xx, yy = np.meshgrid(xsub, ysub, indexing="ij") - - dist = np.sqrt((xx - xctr)**2 + (yy - yctr)**2) - - n_in_pert = np.count_nonzero(dist <= r_init) - - p = n_in_pert*(gamma - 1.0)*E_sedov/(pi*r_init*r_init) + \ - (nsub*nsub - n_in_pert)*1.e-5 - - p = p/(nsub*nsub) - # - # ener[i, j] = p/(gamma - 1.0) - - # W = 1 - rhoh = eos.rhoh_from_rho_p(gamma, dens[i, j], p) - ener[i, j] = rhoh - p - dens[i, j] - - -def finalize(): - """ print out any information to the user at the end of the run """ - - print(""" - The script analysis/sedov_compare.py can be used to analyze these - results. That will perform an average at constant radius and - compare the radial profiles to the exact solution. Sample exact - data is provided as analysis/cylindrical-sedov.out - """) diff --git a/pyro/compressible_sr/problems/sod.py b/pyro/compressible_sr/problems/sod.py deleted file mode 100644 index 2e63a6191..000000000 --- a/pyro/compressible_sr/problems/sod.py +++ /dev/null @@ -1,119 +0,0 @@ -import sys - -import numpy as np - -from pyro.compressible_sr import eos -from pyro.mesh import patch -from pyro.util import msg - - -def init_data(my_data, rp): - """ initialize the sod problem """ - - msg.bold("initializing the sod problem...") - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in sod.py") - print(my_data.__class__) - sys.exit() - - # get the sod parameters - dens_left = rp.get_param("sod.dens_left") - dens_right = rp.get_param("sod.dens_right") - - u_left = rp.get_param("sod.u_left") - u_right = rp.get_param("sod.u_right") - - p_left = rp.get_param("sod.p_left") - p_right = rp.get_param("sod.p_right") - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - # initialize the components, remember, that ener here is rho*eint - # + 0.5*rho*v**2, where eint is the specific internal energy - # (erg/g) - xmin = rp.get_param("mesh.xmin") - xmax = rp.get_param("mesh.xmax") - - ymin = rp.get_param("mesh.ymin") - ymax = rp.get_param("mesh.ymax") - - gamma = rp.get_param("eos.gamma") - - direction = rp.get_param("sod.direction") - - xctr = 0.5*(xmin + xmax) - yctr = 0.5*(ymin + ymax) - - myg = my_data.grid - - p = np.ones_like(dens) * p_left - dens[:, :] = dens_left - - if direction == "x": - - # left - idxl = myg.x2d <= xctr - - dens[idxl] = dens_left - xmom[idxl] = u_left - ymom[idxl] = 0.0 - # ener[idxl] = p_left/(gamma - 1.0) + 0.5*xmom[idxl]*u_left - - p[idxl] = p_left - - # right - idxr = myg.x2d > xctr - - dens[idxr] = dens_right - xmom[idxr] = u_right - ymom[idxr] = 0.0 - # ener[idxr] = p_right/(gamma - 1.0) + 0.5*xmom[idxr]*u_right - - p[idxr] = p_right - - else: - - # bottom - idxb = myg.y2d <= yctr - - dens[idxb] = dens_left - xmom[idxb] = 0.0 - ymom[idxb] = u_left - # ener[idxb] = p_left/(gamma - 1.0) + 0.5*ymom[idxb]*u_left - - p[idxb] = p_left - - # top - idxt = myg.y2d > yctr - - dens[idxt] = dens_right - xmom[idxt] = 0.0 - ymom[idxt] = u_right - # ener[idxt] = p_right/(gamma - 1.0) + 0.5*ymom[idxt]*u_right - - p[idxt] = p_right - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - W = 1./np.sqrt(1-xmom**2-ymom**2) - dens[:, :] *= W - xmom[:, :] *= rhoh*W**2 - ymom[:, :] *= rhoh*W**2 - - ener[:, :] = rhoh*W**2 - p - dens - - -def finalize(): - """ print out any information to the user at the end of the run """ - - print(""" - The script analysis/sod_compare.py can be used to compare - this output to the exact solution. Some sample exact solution - data is present as analysis/sod-exact.out - """) diff --git a/pyro/compressible_sr/problems/test.py b/pyro/compressible_sr/problems/test.py deleted file mode 100644 index 5bec38c71..000000000 --- a/pyro/compressible_sr/problems/test.py +++ /dev/null @@ -1,43 +0,0 @@ -import sys - -from pyro.compressible_sr import eos -from pyro.mesh import patch - - -def init_data(my_data, rp): - """ an init routine for unit testing """ - - # make sure that we are passed a valid patch object - if not isinstance(my_data, patch.CellCenterData2d): - print("ERROR: patch invalid in sedov.py") - print(my_data.__class__) - sys.exit() - - # get the density, momenta, and energy as separate variables - dens = my_data.get_var("density") - xmom = my_data.get_var("x-momentum") - ymom = my_data.get_var("y-momentum") - ener = my_data.get_var("energy") - - gamma = rp.get_param("eos.gamma") - - # initialize the components, remember, that ener here is rho*eint - # + 0.5*rho*v**2, where eint is the specific internal energy - # (erg/g) - dens[:, :] = 1.0 - xmom[:, :] = 0.0 - ymom[:, :] = 0.0 - # ener[:, :] = 2.5 - - p = 1.0 - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - # print(f'rhoh = {rhoh}') - - # u, v = 0 so W = 1 - - ener[:, :] = rhoh[:, :] - p - dens[:, :] - - -def finalize(): - """ print out any information to the user at the end of the run """ diff --git a/pyro/compressible_sr/simulation.py b/pyro/compressible_sr/simulation.py deleted file mode 100644 index 480839ef7..000000000 --- a/pyro/compressible_sr/simulation.py +++ /dev/null @@ -1,300 +0,0 @@ -import importlib - -import matplotlib.pyplot as plt -import numpy as np - -import pyro.compressible_sr.unsplit_fluxes as flx -import pyro.mesh.boundary as bnd -from pyro.compressible_sr import BC, derives, eos -from pyro.simulation_null import NullSimulation, bc_setup, grid_setup -from pyro.util import plot_tools - -# np.seterr(all='raise') - - -class Variables: - """ - a container class for easy access to the different compressible - variable by an integer key - """ - def __init__(self, myd): - self.nvar = len(myd.names) - - # conserved variables -- we set these when we initialize for - # they match the CellCenterData2d object - try: - self.idens = myd.names.index("density") - self.ixmom = myd.names.index("x-momentum") - self.iymom = myd.names.index("y-momentum") - self.iener = myd.names.index("energy") - except ValueError: - self.idens = 0 - self.ixmom = 1 - self.iymom = 2 - self.iener = 3 - - # if there are any additional variable, we treat them as - # passively advected scalars - self.naux = self.nvar - 4 - if self.naux > 0: - self.irhox = 4 - else: - self.irhox = -1 - - # primitive variables - self.nq = 4 + self.naux - - self.irho = 0 - self.iu = 1 - self.iv = 2 - self.ip = 3 - - if self.naux > 0: - self.ix = 4 # advected scalar - else: - self.ix = -1 - - -def prim_to_cons(q, gamma, ivars, myg): - """ convert an input vector of primitive variables to conserved variables """ - - U = myg.scratch_array(nvar=ivars.nvar) - - u = q[:, :, ivars.iu] - v = q[:, :, ivars.iv] - - try: - W = 1 / np.sqrt(1 - u**2 - v**2) - except FloatingPointError: - u[np.isnan(u)] = 0 - v[np.isnan(v)] = 0 - W = np.ones_like(u) - - rhoh = eos.rhoh_from_rho_p(gamma, q[:, :, ivars.irho], q[:, :, ivars.ip]) - - U[:, :, ivars.idens] = q[:, :, ivars.irho] * W - U[:, :, ivars.ixmom] = u * rhoh * W**2 - U[:, :, ivars.iymom] = v * rhoh * W**2 - - U[:, :, ivars.iener] = rhoh * W**2 - q[:, :, ivars.ip] - U[:, :, ivars.idens] - - if ivars.naux > 0: - for nq, nu in zip(range(ivars.ix, ivars.ix+ivars.naux), - range(ivars.irhox, ivars.irhox+ivars.naux)): - U[:, :, nu] = q[:, :, nq]*q[:, :, ivars.irho]*W - - return U - - -class Simulation(NullSimulation): - """The main simulation class for the corner transport upwind - compressible hydrodynamics solver - - """ - - def initialize(self, extra_vars=None, ng=4): - """ - Initialize the grid and variables for compressible flow and set - the initial conditions for the chosen problem. - """ - my_grid = grid_setup(self.rp, ng=ng) - my_data = self.data_class(my_grid) - - # define solver specific boundary condition routines - bnd.define_bc("hse", BC.user, is_solid=False) - bnd.define_bc("ramp", BC.user, is_solid=False) # for double mach reflection problem - - bc, bc_xodd, bc_yodd = bc_setup(self.rp) - - # are we dealing with solid boundaries? we'll use these for - # the Riemann solver - self.solid = bnd.bc_is_solid(bc) - - # density and energy - my_data.register_var("density", bc) - my_data.register_var("energy", bc) - my_data.register_var("x-momentum", bc_xodd) - my_data.register_var("y-momentum", bc_yodd) - - # any extras? - if extra_vars is not None: - for v in extra_vars: - my_data.register_var(v, bc) - - # store the EOS gamma as an auxiliary quantity so we can have a - # self-contained object stored in output files to make plots. - # store grav because we'll need that in some BCs - my_data.set_aux("gamma", self.rp.get_param("eos.gamma")) - my_data.set_aux("grav", self.rp.get_param("compressible.grav")) - - my_data.create() - - self.cc_data = my_data - - # some auxiliary data that we'll need to fill GC in, but isn't - # really part of the main solution - aux_data = self.data_class(my_grid) - aux_data.register_var("ymom_src", bc_yodd) - aux_data.register_var("E_src", bc) - aux_data.create() - self.aux_data = aux_data - - # derived variables - self.cc_data.add_derived(derives.derive_primitives) - - self.ivars = Variables(my_data) - self.cc_data.add_ivars(self.ivars) - - # initial conditions for the problem - problem = importlib.import_module("pyro.{}.problems.{}".format( - self.solver_name, self.problem_name)) - problem.init_data(self.cc_data, self.rp) - - if self.verbose > 0: - print(my_data) - - def method_compute_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 - u, v, cs = self.cc_data.get_var(["velocity", "soundspeed"]) - - # print(f'u = {u}') - # print(f'v = {v}') - # print(f'cs = {cs}') - - # print(sum(abs(u))) - - # 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) - - self.dt = cfl*float(min(xtmp.min(), ytmp.min())) - - def evolve(self): - """ - Evolve the equations of compressible hydrodynamics through a - timestep dt. - """ - - tm_evolve = self.tc.timer("evolve") - tm_evolve.begin() - - dens = self.cc_data.get_var("density") - ymom = self.cc_data.get_var("y-momentum") - ener = self.cc_data.get_var("energy") - - grav = self.rp.get_param("compressible.grav") - - myg = self.cc_data.grid - - Flux_x, Flux_y = flx.unsplit_fluxes(self.cc_data, self.aux_data, self.rp, - self.ivars, self.solid, self.tc, self.dt) - - old_dens = dens.copy() - old_ymom = ymom.copy() - - # conservative update - dtdx = self.dt/myg.dx - dtdy = self.dt/myg.dy - - for n in range(self.ivars.nvar): - var = self.cc_data.get_var_by_index(n) - - var.v()[:, :] += \ - dtdx*(Flux_x.v(n=n) - Flux_x.ip(1, n=n)) + \ - dtdy*(Flux_y.v(n=n) - Flux_y.jp(1, n=n)) - - # gravitational source terms - ymom[:, :] += 0.5*self.dt*(dens[:, :] + old_dens[:, :])*grav - ener[:, :] += 0.5*self.dt*(ymom[:, :] + old_ymom[:, :])*grav - - # increment the time - self.cc_data.t += self.dt - self.n += 1 - - tm_evolve.end() - - def dovis(self): - """ - Do runtime visualization. - """ - - plt.clf() - - plt.rc("font", size=10) - - # we do this even though ivars is in self, so this works when - # we are plotting from a file - ivars = Variables(self.cc_data) - - # access gamma from the cc_data object so we can use dovis - # outside of a running simulation. - gamma = self.cc_data.get_aux("gamma") - - myg = self.cc_data.grid - - q = flx.cons_to_prim_wrapper(self.cc_data.data, gamma, ivars, myg) - - rho = q[:, :, ivars.irho] - u = q[:, :, ivars.iu] - v = q[:, :, ivars.iv] - p = q[:, :, ivars.ip] - try: - e = eos.rhoe(gamma, p)/rho - except FloatingPointError: - p[:, :] = self.cc_data.data[:, :, ivars.iener] * (gamma-1) - e = self.cc_data.data[:, :, ivars.iener] # p / (gamma - 1) - - magvel = np.sqrt(u**2 + v**2) - - fields = [rho, magvel, p, e] - field_names = [r"$\rho$", r"$|U|$", "$p$", "$e$"] - - _, axes, cbar_title = plot_tools.setup_axes(myg, len(fields)) - - for n, ax in enumerate(axes): - v = fields[n] - - img = ax.imshow(np.transpose(v.v()), - interpolation="nearest", origin="lower", - extent=[myg.xmin, myg.xmax, myg.ymin, myg.ymax], - cmap=self.cm) - - ax.set_xlabel("x") - ax.set_ylabel("y") - - # needed for PDF rendering - cb = axes.cbar_axes[n].colorbar(img) - cb.solids.set_rasterized(True) - cb.solids.set_edgecolor("face") - - if cbar_title: - cb.ax.set_title(field_names[n]) - else: - ax.set_title(field_names[n]) - - plt.figtext(0.05, 0.0125, f"t = {self.cc_data.t:10.5g}") - - plt.pause(0.001) - plt.draw() - - def write_extras(self, f): - """ - Output simulation-specific data to the h5py file f - """ - - # make note of the custom BC - gb = f.create_group("BC") - - # the value here is the value of "is_solid" - gb.create_dataset("hse", data=False) diff --git a/pyro/compressible_sr/tests/test_compressible_sr.py b/pyro/compressible_sr/tests/test_compressible_sr.py deleted file mode 100644 index 11b5bfa84..000000000 --- a/pyro/compressible_sr/tests/test_compressible_sr.py +++ /dev/null @@ -1,63 +0,0 @@ -import numpy as np -import pytest -from numpy.testing import assert_array_almost_equal - -import pyro.compressible_sr.simulation as sn -import pyro.compressible_sr.unsplit_fluxes as flx -from pyro.util import runparams - - -class TestSimulation: - @classmethod - def setup_class(cls): - """ this is run once for each class before any tests """ - - @classmethod - def teardown_class(cls): - """ this is run once for each class after all tests """ - - def setup_method(self): - """ this is run before each test """ - self.rp = runparams.RuntimeParameters() - - self.rp.params["mesh.nx"] = 8 - self.rp.params["mesh.ny"] = 8 - - self.rp.params["eos.gamma"] = 1.4 - self.rp.params["compressible.grav"] = 1.0 - - self.sim = sn.Simulation("compressible_sr", "test", self.rp) - self.sim.initialize() - - def teardown_method(self): - """ this is run after each test """ - self.rp = None - self.sim = None - - def test_initializationst(self): - dens = self.sim.cc_data.get_var("density") - assert dens.min() == 1.0 and dens.max() == 1.0 - - ener = self.sim.cc_data.get_var("energy") - assert ener.min() == 2.5 and ener.max() == 2.5 - - def test_prim(self): - - # U -> q - gamma = self.sim.cc_data.get_aux("gamma") - q = flx.cons_to_prim_wrapper(self.sim.cc_data.data, gamma, self.sim.ivars, self.sim.cc_data.grid) - - assert q[:, :, self.sim.ivars.ip].min() == pytest.approx(1.0) and \ - q[:, :, self.sim.ivars.ip].max() == pytest.approx(1.0) - - # q -> U - U = sn.prim_to_cons(q, gamma, self.sim.ivars, self.sim.cc_data.grid) - assert_array_almost_equal(U, self.sim.cc_data.data) - - def test_derives(self): - - gamma = self.sim.cc_data.get_aux("gamma") - cs = self.sim.cc_data.get_var("soundspeed") - # print(f'cs = {cs}') - # print(f'sqrt(gamma) = {np.sqrt(gamma)}') - assert np.allclose(cs, np.sqrt(gamma)) diff --git a/pyro/compressible_sr/tests/test_eos_sr.py b/pyro/compressible_sr/tests/test_eos_sr.py deleted file mode 100644 index 83372235b..000000000 --- a/pyro/compressible_sr/tests/test_eos_sr.py +++ /dev/null @@ -1,26 +0,0 @@ -from pyro.compressible_sr import eos - - -def test_eos_consistency(): - - dens = 1.0 - eint = 1.0 - gamma = 1.4 - - p = eos.pres(gamma, dens, eint) - - dens_eos = eos.dens(gamma, p, eint) - - assert dens == dens_eos - - rhoe_eos = eos.rhoe(gamma, p) - - assert dens*eint == rhoe_eos - - h = eos.h_from_eps(gamma, eint) - - assert (1 + gamma*eint) == h - - rhoh = eos.rhoh_from_rho_p(gamma, dens, p) - - assert dens*h == rhoh diff --git a/pyro/compressible_sr/unsplit_fluxes.py b/pyro/compressible_sr/unsplit_fluxes.py deleted file mode 100644 index 0cb1f7a55..000000000 --- a/pyro/compressible_sr/unsplit_fluxes.py +++ /dev/null @@ -1,462 +0,0 @@ -"""Implementation of the Colella 2nd order unsplit Godunov scheme. This -is a 2-dimensional implementation only. We assume that the grid is -uniform, but it is relatively straightforward to relax this -assumption. - -There are several different options for this solver (they are all -discussed in the Colella paper). - -* limiter: 0 = no limiting; 1 = 2nd order MC limiter; 2 = 4th order MC limiter - -* riemann: HLLC or CGF (for Colella, Glaz, and Freguson solver) - -* use_flattening: set to 1 to use the multidimensional flattening at shocks - -* delta, z0, z1: flattening parameters (we use Colella 1990 defaults) - -The grid indices look like:: - - j+3/2--+---------+---------+---------+ - | | | | - j+1 _| | | | - | | | | - | | | | - j+1/2--+---------XXXXXXXXXXX---------+ - | X X | - j _| X X | - | X X | - | X X | - j-1/2--+---------XXXXXXXXXXX---------+ - | | | | - j-1 _| | | | - | | | | - | | | | - j-3/2--+---------+---------+---------+ - | | | | | | | - i-1 i i+1 - i-3/2 i-1/2 i+1/2 i+3/2 - -We wish to solve - -.. math:: - - U_t + F^x_x + F^y_y = H - -we want U_{i+1/2}^{n+1/2} -- the interface values that are input to -the Riemann problem through the faces for each zone. - -Taylor expanding yields:: - - n+1/2 dU dU - U = U + 0.5 dx -- + 0.5 dt -- - i+1/2,j,L i,j dx dt - - - dU dF^x dF^y - = U + 0.5 dx -- - 0.5 dt ( ---- + ---- - H ) - i,j dx dx dy - - - dU dF^x dF^y - = U + 0.5 ( dx -- - dt ---- ) - 0.5 dt ---- + 0.5 dt H - i,j dx dx dy - - - dt dU dF^y - = U + 0.5 dx ( 1 - -- A^x ) -- - 0.5 dt ---- + 0.5 dt H - i,j dx dx dy - - - dt _ dF^y - = U + 0.5 ( 1 - -- A^x ) DU - 0.5 dt ---- + 0.5 dt H - i,j dx dy - - +----------+-----------+ +----+----+ +---+---+ - | | | - - this is the monotonized this is the source term - central difference term transverse - flux term - -There are two components, the central difference in the normal to the -interface, and the transverse flux difference. This is done for the -left and right sides of all 4 interfaces in a zone, which are then -used as input to the Riemann problem, yielding the 1/2 time interface -values:: - - n+1/2 - U - i+1/2,j - -Then, the zone average values are updated in the usual finite-volume -way:: - - n+1 n dt x n+1/2 x n+1/2 - U = U + -- { F (U ) - F (U ) } - i,j i,j dx i-1/2,j i+1/2,j - - - dt y n+1/2 y n+1/2 - + -- { F (U ) - F (U ) } - dy i,j-1/2 i,j+1/2 - -Updating U_{i,j}: - -* We want to find the state to the left and right (or top and bottom) - of each interface, ex. U_{i+1/2,j,[lr]}^{n+1/2}, and use them to - solve a Riemann problem across each of the four interfaces. - -* U_{i+1/2,j,[lr]}^{n+1/2} is comprised of two parts, the computation - of the monotonized central differences in the normal direction - (eqs. 2.8, 2.10) and the computation of the transverse derivatives, - which requires the solution of a Riemann problem in the transverse - direction (eqs. 2.9, 2.14). - - * the monotonized central difference part is computed using the - primitive variables. - - * We compute the central difference part in both directions before - doing the transverse flux differencing, since for the high-order - transverse flux implementation, we use these as the input to the - transverse Riemann problem. - -""" - -import pyro.compressible_sr.interface as ifc -import pyro.mesh.array_indexer as ai -from pyro.compressible_sr import c2p -from pyro.mesh import reconstruction -from pyro.util import msg - - -def unsplit_fluxes(my_data, my_aux, rp, ivars, solid, tc, dt): - """ - unsplitFluxes returns the fluxes through the x and y interfaces by - doing an unsplit reconstruction of the interface values and then - solving the Riemann problem through all the interfaces at once - - currently we assume a gamma-law EOS - - The runtime parameter grav is assumed to be the gravitational - acceleration in the y-direction - - Parameters - ---------- - my_data : CellCenterData2d object - The data object containing the grid and advective scalar that - we are advecting. - rp : RuntimeParameters object - The runtime parameters for the simulation - vars : Variables object - The Variables object that tells us which indices refer to which - variables - tc : TimerCollection object - The timers we are using to profile - dt : float - The timestep we are advancing through. - - Returns - ------- - out : ndarray, ndarray - The fluxes on the x- and y-interfaces - - """ - - tm_flux = tc.timer("unsplitFluxes") - tm_flux.begin() - - myg = my_data.grid - - gamma = rp.get_param("eos.gamma") - - #========================================================================= - # compute the primitive variables - #========================================================================= - # Q = (rho, u, v, p, {X}) - - dens = my_data.get_var("density") - ymom = my_data.get_var("y-momentum") - - q = cons_to_prim_wrapper(my_data.data, gamma, ivars, myg) - - #========================================================================= - # compute the flattening coefficients - #========================================================================= - - # there is a single flattening coefficient (xi) for all directions - use_flattening = rp.get_param("compressible.use_flattening") - - if use_flattening: - msg.fail("ERROR: Flattening is not allowed for the sr compressible problem") - - # monotonized central differences - tm_limit = tc.timer("limiting") - tm_limit.begin() - - limiter = rp.get_param("compressible.limiter") - - ldx = myg.scratch_array(nvar=ivars.nvar) - ldy = myg.scratch_array(nvar=ivars.nvar) - - for n in range(ivars.nvar): - ldx[:, :, n] = reconstruction.limit(my_data.data[:, :, n], myg, 1, limiter) - ldy[:, :, n] = reconstruction.limit(my_data.data[:, :, n], myg, 2, limiter) - - tm_limit.end() - - #========================================================================= - # x-direction - #========================================================================= - - # left and right primitive variable states - tm_states = tc.timer("interfaceStates") - tm_states.begin() - - _U_l, _U_r = ifc.states(1, myg.ng, myg.dx, dt, - ivars.irho, ivars.iu, ivars.iv, ivars.ip, ivars.ix, - ivars.naux, gamma, q, my_data.data, ldx) - - U_xl = ai.ArrayIndexer(d=_U_l, grid=myg) - U_xr = ai.ArrayIndexer(d=_U_r, grid=myg) - - tm_states.end() - - #========================================================================= - # y-direction - #========================================================================= - - # left and right primitive variable states - tm_states.begin() - - _U_l, _U_r = ifc.states(2, myg.ng, myg.dy, dt, - ivars.irho, ivars.iu, ivars.iv, ivars.ip, ivars.ix, - ivars.naux, gamma, q, my_data.data, ldy) - - U_yl = ai.ArrayIndexer(d=_U_l, grid=myg) - U_yr = ai.ArrayIndexer(d=_U_r, grid=myg) - - tm_states.end() - - #========================================================================= - # apply source terms - #========================================================================= - grav = rp.get_param("compressible.grav") - - ymom_src = my_aux.get_var("ymom_src") - ymom_src.v()[:, :] = dens.v()*grav - my_aux.fill_BC("ymom_src") - - E_src = my_aux.get_var("E_src") - E_src.v()[:, :] = ymom.v()*grav - my_aux.fill_BC("E_src") - - U_xl.v(buf=1, n=ivars.iymom)[:, :] += 0.5*dt*ymom_src.ip(-1, buf=1) - U_xl.v(buf=1, n=ivars.iener)[:, :] += 0.5*dt*E_src.ip(-1, buf=1) - - U_xr.v(buf=1, n=ivars.iymom)[:, :] += 0.5*dt*ymom_src.v(buf=1) - U_xr.v(buf=1, n=ivars.iener)[:, :] += 0.5*dt*E_src.v(buf=1) - - U_yl.v(buf=1, n=ivars.iymom)[:, :] += 0.5*dt*ymom_src.jp(-1, buf=1) - U_yl.v(buf=1, n=ivars.iener)[:, :] += 0.5*dt*E_src.jp(-1, buf=1) - - U_yr.v(buf=1, n=ivars.iymom)[:, :] += 0.5*dt*ymom_src.v(buf=1) - U_yr.v(buf=1, n=ivars.iener)[:, :] += 0.5*dt*E_src.v(buf=1) - - #========================================================================= - # compute transverse fluxes - #========================================================================= - tm_riem = tc.timer("riemann") - tm_riem.begin() - - riemann = rp.get_param("compressible.riemann") - - riemannFunc = None - if riemann == "HLLC": - riemannFunc = ifc.riemann_hllc - elif riemann == "CGF": - riemannFunc = ifc.riemann_cgf - else: - msg.fail("ERROR: Riemann solver undefined") - - q_xl = cons_to_prim_wrapper(U_xl, gamma, ivars, myg) - q_xr = cons_to_prim_wrapper(U_xr, gamma, ivars, myg) - q_yl = cons_to_prim_wrapper(U_yl, gamma, ivars, myg) - q_yr = cons_to_prim_wrapper(U_yr, gamma, ivars, myg) - - # print("before transverse fluxes") - # print(f'rho = {q_xl.jp(0, n=ivars.irho, buf=2)}') - - _fx = riemannFunc(1, myg.ng, - ivars.idens, ivars.ixmom, - ivars.iymom, ivars.iener, ivars.irhox, - ivars.irho, ivars.iu, ivars.iv, ivars.ip, - ivars.ix, ivars.naux, - solid.xl, solid.xr, - gamma, U_xl, U_xr, q_xl, q_xr) - - _fy = riemannFunc(2, myg.ng, - ivars.idens, ivars.ixmom, - ivars.iymom, ivars.iener, ivars.irhox, - ivars.irho, ivars.iu, ivars.iv, ivars.ip, - ivars.ix, ivars.naux, - solid.yl, solid.yr, - gamma, U_yl, U_yr, q_yl, q_yr) - - F_x = ai.ArrayIndexer(d=_fx, grid=myg) - F_y = ai.ArrayIndexer(d=_fy, grid=myg) - - tm_riem.end() - - #========================================================================= - # construct the interface values of U now - #========================================================================= - - """ - finally, we can construct the state perpendicular to the interface - by adding the central difference part to the transverse flux - difference. - - The states that we represent by indices i,j are shown below - (1,2,3,4): - - - j+3/2--+----------+----------+----------+ - | | | | - | | | | - j+1 -+ | | | - | | | | - | | | | 1: U_xl[i,j, :] = U - j+1/2--+----------XXXXXXXXXXXX----------+ i-1/2,j,L - | X X | - | X X | - j -+ 1 X 2 X | 2: U_xr[i,j, :] = U - | X X | i-1/2,j,R - | X 4 X | - j-1/2--+----------XXXXXXXXXXXX----------+ - | | 3 | | 3: U_yl[i,j, :] = U - | | | | i,j-1/2,L - j-1 -+ | | | - | | | | - | | | | 4: U_yr[i,j, :] = U - j-3/2--+----------+----------+----------+ i,j-1/2,R - | | | | | | | - i-1 i i+1 - i-3/2 i-1/2 i+1/2 i+3/2 - - - remember that the fluxes are stored on the left edge, so - - F_x[i,j, :] = F_x - i-1/2, j - - F_y[i,j, :] = F_y - i, j-1/2 - - """ - - tm_transverse = tc.timer("transverse flux addition") - tm_transverse.begin() - - dtdx = dt/myg.dx - dtdy = dt/myg.dy - - b = (2, 1) - - for n in range(ivars.nvar): - - U_xl.v(buf=b, n=n)[:, :] += \ - - 0.5*dtdy*(F_y.ip_jp(-1, 1, buf=b, n=n) - F_y.ip(-1, buf=b, n=n)) - - U_xr.v(buf=b, n=n)[:, :] += \ - - 0.5*dtdy*(F_y.jp(1, buf=b, n=n) - F_y.v(buf=b, n=n)) - - U_yl.v(buf=b, n=n)[:, :] += \ - - 0.5*dtdx*(F_x.ip_jp(1, -1, buf=b, n=n) - F_x.jp(-1, buf=b, n=n)) - - U_yr.v(buf=b, n=n)[:, :] += \ - - 0.5*dtdx*(F_x.ip(1, buf=b, n=n) - F_x.v(buf=b, n=n)) - - tm_transverse.end() - - #========================================================================= - # construct the fluxes normal to the interfaces - #========================================================================= - - # up until now, F_x and F_y stored the transverse fluxes, now we - # overwrite with the fluxes normal to the interfaces - - tm_riem.begin() - - q_xl = cons_to_prim_wrapper(U_xl, gamma, ivars, myg) - q_xr = cons_to_prim_wrapper(U_xr, gamma, ivars, myg) - q_yl = cons_to_prim_wrapper(U_yl, gamma, ivars, myg) - q_yr = cons_to_prim_wrapper(U_yr, gamma, ivars, myg) - - # print("before normal fluxes") - # print(f'F_rho = {F_x.jp(0, n=ivars.ixmom, buf=2)}') - - _fx = riemannFunc(1, myg.ng, - ivars.idens, ivars.ixmom, - ivars.iymom, ivars.iener, ivars.irhox, - ivars.irho, ivars.iu, ivars.iv, ivars.ip, - ivars.ix, ivars.naux, - solid.xl, solid.xr, - gamma, U_xl, U_xr, q_xl, q_xr) - - _fy = riemannFunc(2, myg.ng, - ivars.idens, ivars.ixmom, - ivars.iymom, ivars.iener, ivars.irhox, - ivars.irho, ivars.iu, ivars.iv, ivars.ip, - ivars.ix, ivars.naux, - solid.yl, solid.yr, - gamma, U_yl, U_yr, q_yl, q_yr) - - F_x = ai.ArrayIndexer(d=_fx, grid=myg) - F_y = ai.ArrayIndexer(d=_fy, grid=myg) - - tm_riem.end() - - #========================================================================= - # apply artificial viscosity - #========================================================================= - cvisc = rp.get_param("compressible.cvisc") - - _ax, _ay = ifc.artificial_viscosity( - myg.ng, myg.dx, myg.dy, - cvisc, q.v(n=ivars.iu, buf=myg.ng), q.v(n=ivars.iv, buf=myg.ng)) - - avisco_x = ai.ArrayIndexer(d=_ax, grid=myg) - avisco_y = ai.ArrayIndexer(d=_ay, grid=myg) - - b = (2, 1) - - for n in range(ivars.nvar): - # F_x = F_x + avisco_x * (U(i-1,j) - U(i,j)) - var = my_data.get_var_by_index(n) - - F_x.v(buf=b, n=n)[:, :] += \ - avisco_x.v(buf=b)*(var.ip(-1, buf=b) - var.v(buf=b)) - - # F_y = F_y + avisco_y * (U(i,j-1) - U(i,j)) - F_y.v(buf=b, n=n)[:, :] += \ - avisco_y.v(buf=b)*(var.jp(-1, buf=b) - var.v(buf=b)) - - tm_flux.end() - - return F_x, F_y - - -def cons_to_prim_wrapper(U, gamma, ivars, myg): - """ - wrapper for fortran cons to prim routine - """ - - q = myg.scratch_array(nvar=ivars.nq) - - c2p.cons_to_prim(U, ivars.irho, - ivars.iu, ivars.iv, - ivars.ip, ivars.ix, ivars.irhox, - ivars.idens, ivars.ixmom, ivars.iymom, - ivars.iener, ivars.naux, - gamma, q) - return q diff --git a/pyro/pyro_sim.py b/pyro/pyro_sim.py index 7d265c2e3..3364284a3 100755 --- a/pyro/pyro_sim.py +++ b/pyro/pyro_sim.py @@ -23,7 +23,6 @@ "compressible_fv4", "compressible_sdc", "compressible_react", - "compressible_sr", "diffusion", "incompressible", "incompressible_viscous", diff --git a/pyro/solver-test.ipynb b/pyro/solver-test.ipynb index 725fbc9ab..2ac2227e6 100644 --- a/pyro/solver-test.ipynb +++ b/pyro/solver-test.ipynb @@ -1055,470 +1055,6 @@ "v = pyro_sim.get_var(\"y-velocity\")\n", "v.pretty_print(show_ghost=False, fmt=\"%10.3g\")" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## compressible_sr" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "solver = \"compressible_sr\"\n", - "problem_name = \"kh\"\n", - "param_file = \"inputs.kh\"\n", - "other_commands = [\"driver.max_steps=1\", \"mesh.nx=8\", \"mesh.ny=8\", \"driver.verbose=0\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "tags": [ - "nbval-ignore-output" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mwarning, key: driver.splitting not defined\u001b[0m\n", - "\u001b[33mwarning, key: io.tplot not defined\u001b[0m\n", - "\u001b[1minitializing the Kelvin-Helmholtz problem...\u001b[0m\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/raid/zingale/development/pyro2/pyro/compressible_sr/interface.py:274: NumbaPerformanceWarning: np.dot() is faster on contiguous arrays, called on (Array(float64, 1, 'C', False, aligned=True), Array(float64, 1, 'A', False, aligned=True))\n", - " sum_l = np.dot(betal, rvec[:, m])\n" - ] - }, - { - "data": { - "image/png": "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Pnm34uJiBAYG4tFHH7V47rvvvkNsbKxb93/58mWMGDECs2bNatMlG67HzTffjL/+9a/yY39/f7v9o6OjsW3bNowfP97iuS+//BJGoxEbN27EwIED8c9//hNz5szB5cuX8fLLL9vd7sSJE7F161b5sVLumUQdq6qqCqWlpUDLKeXW9OzZs4OjIqVhYUReo7i4GMHBwRaXrj969CjOnj2LF1980a37T05ORnJyss3nGxsb8cILL2DHjh24ePEihg8fjlWrVlktUpwVEBBwXaNEV5s4cSImTpwoP+7fvz+++uorrF+/3mFhpFarXRYHkS0VFRUAgFdffRV33XWX1T4DBgzo4KhIaVgYkdcoLi5GXV0dLl68KB81GgwGPP/884iOjsa0adM8Gt+sWbNw7tw5vPvuuwgPD8euXbswceJEnDx5EjfddFO7tnnmzBmEh4dDrVZj1KhRWLlyJfr37++ymOvq6uQbxtqzf/9+9OvXDz179sS4cePw+9//Hv369XNZHEQA5M+iJEmIi4vzdDikUJx8TV6hrKwM/fv3R2RkJAYNGoRnnnkGV65cwWuvvYZjx45h//79bv8p7WqSJGHXrl146KGHAADffvstbrrpJly4cAHh4eFyv/vuuw933nknVq5c2eZ9/OUvf8FPP/2EQYMG4fvvv8eKFSvw5Zdf4osvvrB5E2N7P6Vd69tvv8Xtt9+OV155BbNnz7bZLz8/H927d0dUVBTKysrw4osvorm5GSUlJbxyLrncPffcg2PHjmHRokUYNWoUhBDQ6XT45JNPMGPGjOsagSVyiiDyAv/93/8tAIjDhw+L1NRUodVqRY8ePcSDDz4oTp061eHxABC7du2yiK9bt25mS0BAgJgyZYoQQoiysjIBwO7y1FNP2dxnQ0ODCAkJEa+88orc9uSTT5rtT5IkodFozNrOnz9vsa3KykoxcOBAkZaW1ubX/t1334nAwEBRUFDQ5nWJHKmrqxNZWVli0KBBQqPRiF69eokRI0aIp59+Wvz444+eDo8UgD+lkVc4duwYunXrhjvvvBPx8fGeDseC0WiEv78/SkpKLCZId+/eHQBwww034PTp03a306tXL5vPdevWDbfccovZRe6WL19udlPj8ePHY9WqVRg1apTcdvUIFlomqk+YMAHx8fHYtGlTG17lz8LCwhAVFcWL7ZFbaLVarFy5sl2j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Nmyw6FNQUIBhw4ZBrVZj2LBh2LVrV4fH+sEHH+D+++9H3759odVqER8fj71795r12bZtGyRJsliuXLnSobHu37/fahxffvmlWb/O8L7OnDnTaqw333yz3Mdd7+vBgweRkpKC8PBwSJKE3bvt3w8JHv68dhbMceY4c9y3c9wuQW3y7rvvisDAQPHGG2+IU6dOifnz54tu3bqJ8+fPW+1/9uxZ0bVrVzF//nxx6tQp8cYbb4jAwEDx/vvvy30OHz4s/P39xcqVK8Xp06fFypUrRUBAgPjss886NNb58+eLVatWic8//1x8/fXXIisrSwQGBorjx4/LfbZu3Sq0Wq3Q6XRmy/Vqa6yffPKJACC++uorsziam5vlPp3lfb148aJZjBUVFaJ3795i6dKlch93va+FhYViyZIloqCgQAAQu3btstvfk5/XzoI5zhxnjvt2jjvCwqiN7rzzTpGenm7WNmTIELFo0SKr/Z977jkxZMgQs7Ynn3xSjB49Wn48ZcoUMXHiRLM+SUlJ4rHHHuvQWK0ZNmyYWLZsmfx469atIigo6LrisqatsbZ+af744482t9lZ39ddu3YJSZLEuXPn5DZ3va9Xc+ZL05Of186COc4cZ477do47wp/S2qCxsRElJSVITEw0a09MTMThw4etrnPkyBGL/klJSSguLkZTU5PdPra26a5Yr2U0GnHp0iX5TuutGhoaEBUVhRtvvBEPPPAASktL2x3n9cY6cuRIhIWF4d5778Unn3xi9lxnfV83b96M++67T77ieitXv6/t4anPa2fBHP8Zc5w57qs57gwWRm1QU1MDg8GAkJAQs/aQkBBUVVVZXaeqqspq/+bmZtTU1NjtY2ub7or1Wq+88gouX76MKVOmyG1DhgzBtm3b8OGHH2Lnzp3QaDQYM2YMzpw506GxhoWFYdOmTSgoKMAHH3yAwYMH495778XBgwflPp3xfdXpdPjLX/6C2bNnm7W7431tD099XjsL5jhznDnu2znuDEXdK81VJEkyeyyEsGhz1P/a9rZu012xttq5cyeys7OxZ88e9OvXT24fPXo0Ro8eLT8eM2YMbr/9drz++ut47bXXOizWwYMHY/DgwfLj+Ph4VFRU4OWXX8bdd9/drm26K9arbdu2DT179sRDDz1k1u7O97WtPPl57SyY48xx5rhv57g9HDFqg+DgYPj7+1tU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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pyro_sim = Pyro(solver)\n", - "pyro_sim.initialize_problem(problem_name, inputs_file=param_file, other_commands=other_commands)\n", - "pyro_sim.run_sim()\n", - "pyro_sim.sim.dovis()" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1.0209 1.0209 1.0209 1.0209 1.0209 1.0209 1.0209 1.0209 \n", - " 1.0591 1.0591 1.0591 1.0591 1.0591 1.0591 1.0591 1.0591 \n", - " 1.9929 1.9929 1.9929 1.9929 1.9929 1.9929 1.9929 1.9929 \n", - " 2.041 2.041 2.041 2.041 2.041 2.041 2.041 2.041 \n", - " 2.041 2.041 2.041 2.041 2.041 2.041 2.041 2.041 \n", - " 1.9929 1.9929 1.9929 1.9929 1.9929 1.9929 1.9929 1.9929 \n", - " 1.0591 1.0591 1.0591 1.0591 1.0591 1.0591 1.0591 1.0591 \n", - " 1.0209 1.0209 1.0209 1.0209 1.0209 1.0209 1.0209 1.0209 \n", - "\n", - " ^ y\n", - " |\n", - " +---> x\n", - " \n" - ] - } - ], - "source": [ - "dens = pyro_sim.get_var(\"density\")\n", - "dens.pretty_print(show_ghost=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "solver = \"compressible_sr\"\n", - "problem_name = \"advect\"\n", - "param_file = \"inputs.advect.64\"\n", - "other_commands = [\"driver.max_steps=1\", \"mesh.nx=8\", \"mesh.ny=8\", \"driver.verbose=0\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "nbval-ignore-output" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1minitializing the advect problem...\u001b[0m\n", - "\n", - " \n" - ] - }, - { - "data": { - "image/png": "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/0CtVmP9+vU4ffo0Vq9ejQ8//BCvvPKKhXr/u9raWowfPx7/7//9P4seh+xbWVkZCgsL8eOPP8LV1RXOzs5a22+//caEmiTZzdIHZPtOnDgBT09PnSm6jx07hgsXLuC1114z2kZMTAxiYmIk36+trcWrr76Kbdu24erVqwgNDcWKFSswdOjQJvfbycnpnkZl7vTYY4/hscce07y+7777cO7cOaxbtw5vv/22pvzMmTNYuHAh8vLy4ObmhujoaKxevRqenp5NOm7DQozp6elm+BRE+pWUlAAAVq9ejYceekhvna5duzZzr8hWcISGbMaJEyfwyy+/4OrVq5oylUqFl19+GUFBQZg8efI9H2PatGn48ssvsWPHDnzzzTcYP348HnvssXt6uuL8+fPw8/NDcHAwJk6caPYh86qqKs1ikgBQWlqKRx55BA8++CBOnDiBffv24cqVK1qrUxO1RA1/xwqFAuHh4Xq39u3bW7ub1EJxhIZsQlFRESorKxEQEIDx48fjj3/8I27duoU1a9agoKAAubm597y0/Y8//oiMjAxcunQJfn5+AICFCxdi37592LJlC5YvX97oNgcNGoStW7eie/fuuHLlCpYtW4aoqCicPn1acoHTxvb5vffewzvvvKMpW7duHfr376/V382bN8Pf3x/ff/89unfvfs/HJbKErl27YtiwYXj11Vdx/fp1DBo0CEIIlJaW4osvvkB8fPw9jZaSzFl7qmIiU3zyyScCgDhy5IiIi4sT7u7uom3btuLJJ58UZ86caVKbAERWVpbOMdzc3LQ2JycnMWHCBCGEEEVFRXqn4b9zmzVrluQxr1+/Lry9vcU777yjKXvxxRe1jqdQKIRSqdQq++mnn3Taunz5srj//vtFQkKCVvno0aOFs7OzzucAILKzs4UQQixZssTo5zh+/LjOMbds2SI8PDya9H0TmaKqqkokJyeL7t27C6VSKdq3by/69u0r5syZI3799Vdrd49aMI7QkE04fvw43NzcMHDgQERGRlrkGGq1Go6OjigoKICjo6PWe23atAEAdO7cGWfPnjXYjqEhcTc3NzzwwANal7CWLl2KhQsXal4PHToUK1aswKBBgzRlDSNGDX7++WcMGzYMkZGR2LBhg87nGDt2LFasWKFzfF9fXwDA7NmzMXHiRIOfIygoyOD7RJbg7u6O5cuXN2lElOwb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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pyro_sim = Pyro(solver)\n", - "pyro_sim.initialize_problem(problem_name, inputs_file=param_file, other_commands=other_commands)\n", - "pyro_sim.run_sim()\n", - "pyro_sim.sim.dovis()" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 \n", - " 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 \n", - " 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 \n", - " 0.2 0.2 0.19999 0.2 0.2 0.2 0.19999 0.2 \n", - " 0.2 0.2 0.19999 0.2 0.20001 0.2 0.19999 0.2 \n", - " 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 \n", - " 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 \n", - " 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 \n", - "\n", - " ^ y\n", - " |\n", - " +---> x\n", - " \n" - ] - } - ], - "source": [ - "p = pyro_sim.get_var(\"pressure\")\n", - "p.pretty_print(show_ghost=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "solver = \"compressible_sr\"\n", - "problem_name = \"acoustic_pulse\"\n", - "param_file = \"inputs.acoustic_pulse\"\n", - "other_commands = [\"driver.max_steps=1\", \"mesh.nx=8\", \"mesh.ny=8\", \"driver.verbose=0\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "tags": [ - "nbval-ignore-output" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1minitializing the acoustic pulse problem...\u001b[0m\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pyro_sim = Pyro(solver)\n", - "pyro_sim.initialize_problem(problem_name, inputs_file=param_file, other_commands=other_commands)\n", - "pyro_sim.run_sim()\n", - "pyro_sim.sim.dovis()" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1.7857 1.7857 1.7857 1.7857 1.7857 1.7857 1.7857 1.7857 \n", - " 1.7857 1.7857 1.7858 1.7861 1.7861 1.7858 1.7857 1.7857 \n", - " 1.7857 1.7858 1.7879 1.7969 1.7969 1.7879 1.7858 1.7857 \n", - " 1.7857 1.7861 1.7969 1.8343 1.8343 1.7969 1.7861 1.7857 \n", - " 1.7857 1.7861 1.7969 1.8343 1.8343 1.7969 1.7861 1.7857 \n", - " 1.7857 1.7858 1.7879 1.7969 1.7969 1.7879 1.7858 1.7857 \n", - " 1.7857 1.7857 1.7858 1.7861 1.7861 1.7858 1.7857 1.7857 \n", - " 1.7857 1.7857 1.7857 1.7857 1.7857 1.7857 1.7857 1.7857 \n", - "\n", - " ^ y\n", - " |\n", - " +---> x\n", - " \n" - ] - } - ], - "source": [ - "dens = pyro_sim.get_var(\"eint\")\n", - "dens.pretty_print(show_ghost=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "solver = \"compressible_sr\"\n", - "problem_name = \"quad\"\n", - "param_file = \"inputs.quad\"\n", - "other_commands = [\"driver.max_steps=1\", \"mesh.nx=8\", \"mesh.ny=8\", \"driver.verbose=0\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "tags": [ - "nbval-ignore-output" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1minitializing the quadrant problem...\u001b[0m\n" - ] - }, - { - "data": { - "image/png": "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kgKTHiIiIpICkx4iIiKSApMeIiIikgKTHiIiIpICkx4iIiKSApMeIiIikgKTHiIiIpICkx5yK99//z2Cg4OxZs0aQ92f//xn+Pn5oayszKl9I6LuY4xTT+Kzt8jtlJaW4oknnsCJEycwcuRIjBs3DrNmzUJeXp6zu0ZEDsAYp57CpIfc0qJFi/CnP/0J48ePx1/+8hd89tlnUKvVzu4WETkIY5x6ApMecks//fQTRo8ejYaGBlRWVuLee+91dpeIyIEY49QTeE0PuaUzZ87g22+/hV6vx7lz55zdHSJyMMY49QS7kp5p06YhLS2t53pzg/z8fERERECtViMqKgpHjx61us2RI0cQFRUFtVqN4cOHY8OGDSZtdu/ejVGjRsHf3x+jRo3Cnj177P7sK1euYPHixRgyZAj69OmDyMhIFBQUmO2TEALx8fFQqVTYu3ev0XvDhg2DSqUyKitWrDBqs2zZMkRFRcHf3x9jx4412f/Zs2dN9qFSqXDw4EGr35e7amtrw29/+1skJCTglVdeQXJyMr777jtnd4uIHIQxTj1G2GHq1Kli2bJl9mzSJR988IHw9fUV7777rqipqRHLli0Tt9xyizh37pziNmfOnBF9+/YVy5YtEzU1NeLdd98Vvr6+YteuXYY2J06cEN7e3mLNmjWitrZWrFmzRvj4+IhPPvnErs9esGCBuPPOO8XHH38s6urqxMaNG4W3t7fYu3evSb9yc3NFfHy8ACD27Nlj9F54eLhYvXq10Gq1hnL58mWjNkuWLBHvvPOOSExMFGPGjDHZf11dnQAg/vSnPxntp7W11Y5v3L0sX75cDBs2TLS0tAidTiceeOABMWvWLGd3i4gchDFOPcXmpGfevHkCgFGpq6vrkU5NmDBBpKSkGNWNHDlSrFixQnGbF198UYwcOdKobuHChWLixImG13PmzBG//OUvjdrMmDFD/PrXv7brs3/xi1+I1atXG7W57777xO9//3ujuurqajFkyBCh1WoVk561a9cqHtONVq5caTHp0Wg0Nu3H3X388cfCx8dHHD161FB37tw5ERgYKPLz853aNyLqPsY49SSbp7feeustxMTE4Pnnn4dWq4VWq0VYWJjZtikpKbj11lstlvr6erPbtrW1oaqqCnFxcUb1cXFxOHHihGL/Tp48abLNjBkzUFlZifb2dottOvdr62dPnjwZ+/fvx/nz5yGEwMcff4yvvvoKM2bMMLT58ccf8Zvf/AbvvPMOgoODFfv92muvYeDAgRg7diz+/d//HW1tbYptLXnssccwePBgTJo0Cbt27erSPtzBtGnT0N7ejsmTJxvqhg4diosXL+Jf/uVfnNo3Iuo+xjj1JB9bGwYGBsLPzw99+/a1+D9xAFi9ejWWL19usU1oaKjZ+qamJuh0OgQFBRnVBwUFobGxUXF/jY2NZrfp6OhAU1MTQkJCFNt07tfWz163bh2ef/55DBkyBD4+PvDy8sLmzZuNgjQ9PR2xsbF4/PHHFfu8bNky3Hfffbjtttvw6aefIjMzE3V1ddi8ebPiNje79dZbkZubi0mTJsHLywv79+9HQkIC3nvvPTzzzDM274eIiMjT2Zz02GPw4MEYPHhwt/ahUqmMXgshTOps2ebmelv2a63NunXr8Mknn2D//v0IDw9HRUUFUlNTERISgkceeQT79+/HRx99BI1GY7G/6enphv++9957cdttt+Hpp582jP7YYtCgQUb7iY6Oxt///ne8/vrrTHqIiIhu0CO3rHdnemvQoEHw9vY2GdW5cOGCyQjMjYKDg81u4+PjY0gglNp07teWz/7pp5/w0ksvITc3F7Nnz8a9996LxYsXIyEhAW+88QYA4KOPPsLXX3+N/v37w8fHBz4+P+eWTz31FKZNm6Z4DBMnTgQA/N///Z9iG1tMnDgRp0+f7tY+iIiIPI1dIz1+fn7Q6XRW23VnesvPzw9RUVEoLy/Hk08+aagvLy+3OFUUExODAwcOGNWVlZUhOjoavr6+hjbl5eVGIyNlZWWIjY21+bPb29vR3t4OLy/jfNHb2xt6vR4AsGLFCixYsMDo/X/6p3/C2rVrMXv2bMVj6BwZCgkJUWxjC41G0+19EBEReRx7rnp+/vnnxfjx40VdXZ34/vvvhU6n65GrqztvGy8sLBQ1NTUiLS1N3HLLLeLs2bOGNitWrBCJiYmG1523rKenp4uamhpRWFhocsv68ePHhbe3t3j11VdFbW2tePXVVxVvWbf02VOnThW/+MUvxMcffyzOnDkjtmzZItRqtcU7C26+e+vEiRMiNzdXaDQacebMGVFSUiJCQ0PFY489ZrTd6dOnhUajEQsXLhQjRowQGo1GaDQawy3pxcXFYtu2baKmpkb87W9/E//xH/8hfH19RW5ubrf+DYiIiDyNXUnPl19+KSZOnCj69OnTo7esCyHE+vXrRXh4uPDz8xP33XefOHLkiNH78+bNE1OnTjWqO3z4sBg3bpzw8/MTw4YNEwUFBSb73blzp7jnnnuEr6+vGDlypNi9e7fdn63VasX8+fNFaGioUKvV4p577hFvvvmm0Ov1isdzc9JTVVUl7r//fhEYGGjYx8qVK8XVq1eNtps6darJUgE3fvfFxcUiMjJS9O3bV/Tr109ERUWJP/7xj1a/XyIiItnw2VtEREQkBT57i4iIiKTApIeIiIikwKSHiIiIpMCkh4iIiKTApIeIiIikwKSHiIiIpMCkh4iIiKTApIeIiIikwKSHiIiIpMCkh4iIiKTApIeIiIik8P8DmJA8HzS3PCUAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pyro_sim = Pyro(solver)\n", - "pyro_sim.initialize_problem(problem_name, inputs_file=param_file, other_commands=other_commands)\n", - "pyro_sim.run_sim()\n", - "pyro_sim.sim.dovis()" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 0.1206 0.1206 0.1206 0.1206 0.12103 0.11866-0.000527130.00013683 \n", - " 0.12061 0.12061 0.12061 0.12061 0.12103 0.11866-0.000525690.00013686 \n", - " 0.10601 0.10601 0.10601 0.10601 0.10654 0.10359-0.000487470.00013304 \n", - " 0.10606 0.10606 0.10606 0.10606 0.10659 0.10366-0.00048881 0.0001332 \n", - " 0.10605 0.10605 0.10605 0.10605 0.10658 0.10364-0.000488740.00013316 \n", - " 0.10605 0.10605 0.10605 0.10605 0.10658 0.10364-0.000488740.00013316 \n", - " 0.10605 0.10605 0.10605 0.10605 0.10658 0.10364-0.000488740.00013316 \n", - " 0.10605 0.10605 0.10605 0.10605 0.10658 0.10364-0.000488740.00013316 \n", - "\n", - " ^ y\n", - " |\n", - " +---> x\n", - " \n" - ] - } - ], - "source": [ - "v = pyro_sim.get_var(\"velocity\")\n", - "v[0].pretty_print(show_ghost=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "solver = \"compressible_sr\"\n", - "problem_name = \"rt\"\n", - "param_file = \"inputs.rt\"\n", - "other_commands = [\"driver.max_steps=1\", \"mesh.nx=8\", \"mesh.ny=24\", \"driver.verbose=0\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "tags": [ - "nbval-ignore-output" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1minitializing the rt problem...\u001b[0m\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAFoCAYAAACc1hUlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABQZUlEQVR4nO3de1hU5f4+/ns4DKACqcipQNE8W4ZgimZiJm40sl2mpRvR1Et+mIpkFmJJflLSbUamYpap5fHbJg97606oHaiJJQhWampJQgaRVigeOMys3x/J6DgzMM+SObDmfl3XumrWPGutZ5jbmfesw7NUkiRJICIiIiJhTrbuABEREVFzxUKKiIiISCYWUkREREQysZAiIiIikomFFBEREZFMLKSIiIiIZGIhRURERCQTCykiIiIimVhIEREREcnEQoqIiIhIJhZSRERERDKxkCKysg4dOiA1NVVv3rx586BSqVBcXGx0mY4dO2LAgAENroOIiKyPhRSRHTh69Chat26NkJAQg+f++OMPFBcXIywszCZ9IyIi01hIEdmBo0ePmiyU8vPzAYCFFBGRHWIhZWHbt29H79690aJFC7Ro0QKPPfYYysrKbN0tsiMlJSX47bffEB4ebvT5goICgIUU3SYmJgbh4eF477330Lt3b3h4eCAoKAgLFiyAVqu1dffIDh08eBBRUVHw9vZG69atMXLkSJw5c8bW3Wr2WEhZUEJCAiZPnoyxY8di165dSElJwaeffoq4uDhbd43sSGOFUn5+Ptzd3dG9e3cr94zsWUFBAb7//nu89dZbePHFF7F792489NBDWLhwIT744ANbd4/sTGpqKgYPHoygoCBs3boV77//PkpLSzF06FBUVVXZunvNmoutO6BUmzdvxrvvvovc3Fw89NBDAIBhw4bh1KlT2LRpEyorK+Ht7W3rbpIdOHr0KAA0uEeqd+/ecHHhP1f6y/nz51FWVoaOHTsiLy9P91kSGRmJnJwc7Nq1C1OmTLF1N8lO/Oc//8Frr72GpUuX4sUXX9TNv//++9GlSxfs2rUL48ePt2kfmzPukbKQRYsW4e9//7uuiKrXpUsXSJKEq1ev2qxvZF8KCgrQpk0bdOjQweC533//HT/99BMP65GeI0eOADf2Mtz6g8zV1RX33nsvLly4YMPekb159dVX0alTJ8yaNQt1dXW6KSQkBB4e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tU37RvaHeSERzAuJYF4si3ukiIiIiGTiyeZEREREMrGQIiIiIpKJhRQRERGRTCykiIiIiGRiIUVEREQkEwspIiIiIplYSBERERHJxEKKiIiISCYWUkREREQysZAiIiIikomFFBEREZFMLKSIiIiIZGIhRURERCQTCykiIiIimVhIEREREcnEQoqIiIhIJhZSRERERDKxkCIiIiKSiYUUERERkUwspIiIiIhkYiFFREREJBMLKSIiIiKZWEgRERERycRCioiIiEgmFlJEREREMrGQIiIiIpKJhRQRERGRTCykiIiIiGRiIUVEREQkEwspIiIiIplYSBERERHJxEKKiIiISCYWUkREREQysZAiIiIikomFFBEREZFMLKSIiIiIZGIhRURERCQTCykiIiIimVhIEREREcnEQoqIiIhIJhZSRERERDKxkCIiIiKSiYUUERERkUwspIiIiIhkYiFFREREJBMLKSIiIiKZWEgRERERycRCioiIiEgmFlJEREREMrGQIiIiIpKJhRQRERGRTCykiIiIiGRiIUVEREQkEwspIiIiIplYSBERERHJxEKKiIiISCYWUkREREQysZAiIiIikomFFBEREZFMLKSIiIiIZGIhRURERCQTCykiIiIimVhIEREREcnEQoqIiIhIJhZSRERERDKxkCIiIiKSiYUUERERkUwspIiIiIhkYiFFREREJBMLKSIiIiKZWEgRERERycRCioiIiEgmFlJEREREMrGQIiIiIpKJhRQRERGRTCykiIiIiGRiIUVEREQkEwspIiIiIplYSBERERHJxEKKiIiISCYWUkREREQysZAiIiIikomFFBEREZFMLKSIiIiIZGIhRURERCQTCykiIiIimVhIEREREcnEQoqIiIhIJhZSRERERDKxkCIiIiKSiYUUERERkUwspIiIiIhkYiFFREREJBMLKSIiIiKZWEgRERERycRCioiIiEgmFlJEREREMskupCIjI5GYmNi0vTFh9erVCAkJgbu7O8LCwnDgwIFGl8nNzUVYWBjc3d3RsWNHrFmzxqBNZmYmevToATc3N/To0QM7duwQ2nZtbS1eeukl3HfffWjZsiUCAwMxYcIE/PLLL3rriIyMhEql0pueeeYZg23t2bMH/fr1g4eHB3x8fPDkk0/qnjt27BieffZZBAUFwcPDA927d8fbb79tsI59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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pyro_sim = Pyro(solver)\n", - "pyro_sim.initialize_problem(problem_name, inputs_file=param_file, other_commands=other_commands)\n", - "pyro_sim.run_sim()\n", - "pyro_sim.sim.dovis()" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-2.6073e-08-2.6073e-087.0581e-097.0581e-097.0581e-097.0581e-09-2.6073e-08-2.6073e-08 \n", - "-1.6628e-08-1.6628e-084.7895e-094.7895e-094.7895e-094.7895e-09-1.6628e-08-1.6628e-08 \n", - "-1.1829e-08-1.1829e-083.5225e-093.5225e-093.5225e-093.5225e-09-1.1829e-08-1.1829e-08 \n", - "-8.9813e-09-8.9813e-092.7307e-092.7307e-092.7307e-092.7307e-09-8.9813e-09-8.9813e-09 \n", - "-7.1232e-09-7.1232e-09 2.197e-09 2.197e-09 2.197e-09 2.197e-09-7.1232e-09-7.1232e-09 \n", - "-5.8303e-09-5.8303e-091.8171e-091.8171e-091.8171e-091.8171e-09-5.8303e-09-5.8303e-09 \n", - "-4.8874e-09-4.8874e-091.5354e-091.5354e-091.5354e-091.5354e-09-4.8874e-09-4.8874e-09 \n", - "-4.1745e-09-4.1745e-091.3197e-091.3197e-091.3197e-091.3197e-09-4.1745e-09-4.1745e-09 \n", - "-3.6195e-09-3.6198e-091.3113e-091.3121e-091.3121e-091.3113e-09-3.6198e-09-3.6195e-09 \n", - "-1.2387e-07-1.2387e-07-1.193e-07-1.1931e-07-1.1931e-07-1.193e-07-1.2387e-07-1.2387e-07 \n", - "2.1898e-062.0195e-061.7768e-061.6067e-061.6067e-061.7768e-062.0195e-062.1898e-06 \n", - "0.000174547.0109e-05-7.7432e-05-0.00018164-0.00018164-7.7432e-057.0109e-050.00017454 \n", - "0.000181577.7366e-05-7.015e-05-0.00017457-0.00017457-7.015e-057.7366e-050.00018157 \n", - "-1.4057e-06-1.561e-06-1.7888e-06-1.9442e-06-1.9442e-06-1.7888e-06-1.561e-06-1.4057e-06 \n", - "9.5559e-089.5557e-089.7205e-089.7207e-089.7207e-089.7205e-089.5557e-089.5559e-08 \n", - "-2.4461e-10-2.444e-107.2146e-107.2126e-107.2126e-107.2146e-10-2.444e-10-2.4461e-10 \n", - "-2.3336e-10-2.3336e-106.8936e-106.8936e-106.8936e-106.8936e-10-2.3336e-10-2.3336e-10 \n", - "-2.2316e-10-2.2316e-106.5955e-106.5955e-106.5955e-106.5955e-10-2.2316e-10-2.2316e-10 \n", - "-2.1369e-10-2.1369e-106.3182e-106.3182e-106.3182e-106.3182e-10-2.1369e-10-2.1369e-10 \n", - "-2.0487e-10-2.0487e-106.0597e-106.0597e-106.0597e-106.0597e-10-2.0487e-10-2.0487e-10 \n", - "-1.9663e-10-1.9663e-105.8185e-105.8185e-105.8185e-105.8185e-10-1.9663e-10-1.9663e-10 \n", - "-1.8894e-10-1.8894e-105.5928e-105.5928e-105.5928e-105.5928e-10-1.8894e-10-1.8894e-10 \n", - "-1.8175e-10-1.8175e-105.3814e-105.3814e-105.3814e-105.3814e-10-1.8175e-10-1.8175e-10 \n", - "-1.7493e-10-1.7493e-105.1834e-105.1834e-105.1834e-105.1834e-10-1.7493e-10-1.7493e-10 \n", - "\n", - " ^ y\n", - " |\n", - " +---> x\n", - " \n" - ] - } - ], - "source": [ - "v = pyro_sim.get_var(\"velocity\")\n", - "v[1].pretty_print(show_ghost=False)" - ] } ], "metadata": {