This Jupyter notebook can be found in collection of Clawpack apps as the file $CLAW/apps/notebooks/classic/acoustics_1d_example1/acoustics_1d_example1.ipynb
.
To run this notebook, install Clawpack, and clone the apps repository.
A static view of this and other notebooks can be found in the Clawpack Gallery of Jupyter notebooks.
This notebook demonstrates running the Clawpack Fortran code and plotting results from a Jupyter notebook, and illustration of the behavior of various methods and limiters on the same problem. This example is based on the one in $CLAW/classic/examples/acoustics_1d_example1
.
The 1-dimensional acoustics equations $q_t + Aq_x = 0$ is solved in the interval $-1 \leq x \leq 1$ with extrapolation boundary conditions.
The density rho
and bulk modulus K
are specified in setrun.py
but can be changed below.
Animation revised to run with v5.7.0
Have plots appear inline in notebook:
%pylab inline
from __future__ import print_function # so notebook works in Python2 or Python3
Check that the CLAW environment variable is set. (It must be set in the Unix shell before starting the notebook server).
import os
try:
CLAW = os.environ['CLAW']
print("Using Clawpack from ", CLAW)
except:
print("*** Environment variable CLAW must be set to run code")
from clawpack.clawutil import nbtools
from clawpack.visclaw import animation_tools
from IPython.display import HTML
Using anim.to_jshtml()
gives animations similar to what you see in the html files if you do make plots
, but you may prefer the anim.to_html5_video()
option. See the matplotlib.animation.Animation documentation for more information, also on how to save an animation as a separate file.
def show_anim(anim):
html_version = HTML(anim.to_jshtml())
#html_version = HTML(anim.to_html5_video())
return html_version
nbtools.make_exe(new=True) # new=True ==> force recompilation of all code
nbtools.make_htmls()
First create data files needed for the Fortran code, using parameters specified in setrun.py:
nbtools.make_data(verbose=False)
Now run the code and produce plots. Specifying a label insures the resulting plot directory will persist after later runs are done below.
outdir,plotdir = nbtools.make_output_and_plots(label='1')
Clicking on the _PlotIndex link above, you can view an animation of the results.
After creating all png files in the _plots directory, these can also be combined in an animation that is displayed inline:
anim = animation_tools.animate_from_plotdir(plotdir);
show_anim(anim)
The animation above was computed using the default parameter values specified in setrun.py
, which specified using the high-resolution method with the MC limiter.
See the README.html file for a link to setrun.py
.
We can adjust the parameters by reading in the default values, changing one or more, and then writing the data out for the Fortran code to use:
import setrun
rundata = setrun.setrun()
print("The left boundary condition is currently set to ",rundata.clawdata.bc_lower)
print("The right boundary condition is currently set to ",rundata.clawdata.bc_upper)
Change the boundary conditions and write out the data. Then rerun the code.
rundata.clawdata.bc_lower = ['periodic']
rundata.clawdata.bc_upper = ['periodic']
# also extend the time over which the solution is computed and plotted:
rundata.clawdata.num_output_times = 40
rundata.clawdata.tfinal = 2.0
rundata.write()
outdir, plotdir = nbtools.make_output_and_plots(verbose=False)
anim = animation_tools.animate_from_plotdir(plotdir);
show_anim(anim)
Change the boundary conditions and write out the data. Then rerun the code.
rundata.clawdata.bc_lower = ['wall']
rundata.clawdata.bc_upper = ['wall']
rundata.write()
outdir, plotdir = nbtools.make_output_and_plots(verbose=False)
anim = animation_tools.animate_from_plotdir(plotdir);
show_anim(anim)
Use print(rundata.clawdata)
to see what parameters can be set. Also print rundata.probdata
to see what problem-specific paramaters are available.
Change the density rho
or the bulk modulus K
and see what effect this has.
def print_material():
rho = rundata.probdata.rho
K = rundata.probdata.K
Z = sqrt(K*rho)
c = sqrt(K/rho)
print("The density rho = %g and bulk modulus %g give" % (rho,K))
print(" speed of sound c = %g" % c)
print(" impedance Z = %g" % Z)
print_material()
rundata.probdata.rho = 4.
rundata.write()
print_material()
outdir, plotdir = nbtools.make_output_and_plots(verbose=False)
anim = animation_tools.animate_from_plotdir(plotdir);
show_anim(anim)