def evolve(gr, a, C, num, nolimit=1): #------------------------------------------------------------------------- # first frame -- the original cell-averages pylab.clf() gpu.drawGrid(gr) gpu.labelCenter(gr, gr.ng + nzones / 2, r"$i$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 - 1, r"$i-1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 + 1, r"$i+1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 - 2, r"$i-2$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 + 2, r"$i+2$", fontsize="medium") # draw cell averages n = gr.ilo while (n <= gr.ihi): gpu.drawCellAvg(gr, n, a[n], color="r") n += 1 pylab.axis([gr.xmin - 0.5 * gr.dx, gr.xmax + 0.5 * gr.dx, -1.25, 2.0]) pylab.axis("off") print gr.xmin - 0.5 * gr.dx, gr.xmax + 0.5 * gr.dx pylab.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95) ax = pylab.gca() pylab.text(0.5, 0.75, "initial state (cell averages)", horizontalalignment="center", fontsize=16, color="b", transform=ax.transAxes) pylab.text(0.5, 0.95, "Piecewise Linear Method for Linear Advection", horizontalalignment="center", fontsize=20, color="k", transform=ax.transAxes) f = pylab.gcf() f.set_size_inches(12.8, 7.2) if (nolimit): pylab.savefig("rea-nolimit-start_%3.3d.png" % (num)) pylab.savefig("rea-nolimit-start_%3.3d.eps" % (num)) else: pylab.savefig("rea-start_%3.3d.png" % (num)) pylab.savefig("rea-start_%3.3d.eps" % (num)) #------------------------------------------------------------------------- # second frame -- reconstruction # compute the slopes lda = gpu.lslopes(a, nolimit=nolimit) # draw pylab.clf() gpu.drawGrid(gr) gpu.labelCenter(gr, gr.ng + nzones / 2, r"$i$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 - 1, r"$i-1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 + 1, r"$i+1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 - 2, r"$i-2$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 + 2, r"$i+2$", fontsize="medium") # draw cell averages n = gr.ilo while (n <= gr.ihi): gpu.drawCellAvg(gr, n, a[n], color="0.5", ls=":") n += 1 n = gr.ilo while (n <= gr.ihi): gpu.drawSlope(gr, n, lda[n], a[n], color="r") n += 1 pylab.axis([gr.xmin - 0.5 * gr.dx, gr.xmax + 0.5 * gr.dx, -1.25, 2.0]) pylab.axis("off") pylab.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95) pylab.text(0.5, 0.75, "reconstructed slopes", horizontalalignment="center", fontsize=16, color="b", transform=ax.transAxes) pylab.text(0.5, 0.95, "Piecewise Linear Method for Linear Advection", horizontalalignment="center", fontsize=20, color="k", transform=ax.transAxes) f = pylab.gcf() f.set_size_inches(12.8, 7.2) if (nolimit): pylab.savefig("rea-nolimit-reconstruction_%3.3d.png" % (num)) pylab.savefig("rea-nolimit-reconstruction_%3.3d.eps" % (num)) else: pylab.savefig("rea-reconstruction_%3.3d.png" % (num)) pylab.savefig("rea-reconstruction_%3.3d.eps" % (num)) #------------------------------------------------------------------------- # third frame -- evolve # draw pylab.clf() gpu.drawGrid(gr) gpu.labelCenter(gr, gr.ng + nzones / 2, r"$i$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 - 1, r"$i-1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 + 1, r"$i+1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 - 2, r"$i-2$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 + 2, r"$i+2$", fontsize="medium") # draw cell slopes n = gr.ilo while (n <= gr.ihi): gpu.drawSlope(gr, n, lda[n], a[n], color="0.75", ls=":") n += 1 # evolve n = gr.ilo while (n <= gr.ihi): gpu.evolveToRight(gr, n, lda, a, C, color="r") n += 1 pylab.axis([gr.xmin - 0.5 * gr.dx, gr.xmax + 0.5 * gr.dx, -1.25, 2.0]) pylab.axis("off") print gr.xmin - 0.5 * gr.dx, gr.xmax + 0.5 * gr.dx pylab.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95) pylab.text(0.5, 0.75, "evolved with C = {}".format(C), horizontalalignment="center", fontsize=16, color="b", transform=ax.transAxes) pylab.text(0.5, 0.95, "Piecewise Linear Method for Linear Advection", horizontalalignment="center", fontsize=20, color="k", transform=ax.transAxes) f = pylab.gcf() f.set_size_inches(12.8, 7.2) if (nolimit): pylab.savefig("rea-nolimit-evolve_%3.3d.png" % (num)) pylab.savefig("rea-nolimit-evolve_%3.3d.eps" % (num)) else: pylab.savefig("rea-evolve_%3.3d.png" % (num)) pylab.savefig("rea-evolve_%3.3d.eps" % (num)) #------------------------------------------------------------------------- # fourth frame -- re-average # left states (we don't need the right state when u > 0) al = numpy.zeros(2 * gr.ng + gr.nx, dtype=numpy.float64) n = gr.ilo while (n <= gr.ihi + 1): al[n] = a[n - 1] + 0.5 * (1 - C) * lda[n - 1] n += 1 # the Riemann problem just picks the left state. Do a conservative # update anew = numpy.zeros(2 * gr.ng + gr.nx, dtype=numpy.float64) anew[gr.ilo:gr.ihi+1] = a[gr.ilo:gr.ihi+1] + \ C*(al[gr.ilo:gr.ihi+1] - al[gr.ilo+1:gr.ihi+2]) pylab.clf() gpu.drawGrid(gr) gpu.labelCenter(gr, gr.ng + nzones / 2, r"$i$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 - 1, r"$i-1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 + 1, r"$i+1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 - 2, r"$i-2$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones / 2 + 2, r"$i+2$", fontsize="medium") # show the evolved profiles from the old time n = gr.ilo while (n <= gr.ihi): gpu.evolveToRight(gr, n, lda, a, C, color="0.5", ls=":") n += 1 # draw new averages n = gr.ilo while (n <= gr.ihi): gpu.drawCellAvg(gr, n, anew[n], color="red") n += 1 pylab.axis([gr.xmin - 0.5 * gr.dx, gr.xmax + 0.5 * gr.dx, -1.25, 2.0]) pylab.axis("off") print gr.xmin - 0.5 * gr.dx, gr.xmax + 0.5 * gr.dx pylab.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95) pylab.text(0.5, 0.75, "averaged profile (final state)", horizontalalignment="center", fontsize=16, color="b", transform=ax.transAxes) pylab.text(0.5, 0.95, "Piecewise Linear Method for Linear Advection", horizontalalignment="center", fontsize=20, color="k", transform=ax.transAxes) f = pylab.gcf() f.set_size_inches(12.8, 7.2) if (nolimit): pylab.savefig("rea-nolimit-final_%3.3d.png" % (num)) pylab.savefig("rea-nolimit-final_%3.3d.eps" % (num)) else: pylab.savefig("rea-final_%3.3d.png" % (num)) pylab.savefig("rea-final_%3.3d.eps" % (num)) return anew
gpu.labelCenter(gr, gr.ng + nzones/2+1, r"$i+1$") gpu.labelCenter(gr, gr.ng + nzones/2-2, r"$i-2$") gpu.labelCenter(gr, gr.ng + nzones/2+2, r"$i+2$") # draw cell slopes n = gr.ilo while (n <= gr.ihi): gpu.drawSlope(gr, n, lda[n], a[n], color="0.75", ls=":") n += 1 # evolve n = gr.ilo while (n <= gr.ihi): gpu.evolveToRight(gr, n, lda, a, C, color="r") n += 1 pylab.axis([gr.xmin-0.5*gr.dx,gr.xmax+0.5*gr.dx, -0.25, 1.2]) pylab.axis("off") print gr.xmin-0.5*gr.dx, gr.xmax+0.5*gr.dx pylab.subplots_adjust(left=0.05,right=0.95,bottom=0.05,top=0.95) f = pylab.gcf() f.set_size_inches(8.0,2.0)
def evolve(gr, a, C, num, nolimit=1): #------------------------------------------------------------------------- # first frame -- the original cell-averages pylab.clf() gpu.drawGrid(gr) gpu.labelCenter(gr, gr.ng + nzones/2, r"$i$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2-1, r"$i-1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2+1, r"$i+1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2-2, r"$i-2$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2+2, r"$i+2$", fontsize="medium") # draw cell averages n = gr.ilo while (n <= gr.ihi): gpu.drawCellAvg(gr, n, a[n], color="r") n += 1 pylab.axis([gr.xmin-0.5*gr.dx,gr.xmax+0.5*gr.dx, -0.25, 1.2]) pylab.axis("off") print gr.xmin-0.5*gr.dx, gr.xmax+0.5*gr.dx pylab.subplots_adjust(left=0.05,right=0.95,bottom=0.05,top=0.95) f = pylab.gcf() f.set_size_inches(8.0,2.0) if (nolimit): pylab.savefig("rea-nolimit-start_%3.3d.png" % (num)) pylab.savefig("rea-nolimit-start_%3.3d.eps" % (num)) else: pylab.savefig("rea-start_%3.3d.png" % (num)) pylab.savefig("rea-start_%3.3d.eps" % (num)) #------------------------------------------------------------------------- # second frame -- reconstruction # compute the slopes lda = gpu.lslopes(a, nolimit=nolimit) # draw pylab.clf() gpu.drawGrid(gr) gpu.labelCenter(gr, gr.ng + nzones/2, r"$i$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2-1, r"$i-1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2+1, r"$i+1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2-2, r"$i-2$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2+2, r"$i+2$", fontsize="medium") # draw cell averages n = gr.ilo while (n <= gr.ihi): gpu.drawCellAvg(gr, n, a[n], color="0.5", ls=":") n += 1 n = gr.ilo while (n <= gr.ihi): gpu.drawSlope(gr, n, lda[n], a[n], color="r") n += 1 pylab.axis([gr.xmin-0.5*gr.dx,gr.xmax+0.5*gr.dx, -0.25, 1.2]) pylab.axis("off") pylab.subplots_adjust(left=0.05,right=0.95,bottom=0.05,top=0.95) f = pylab.gcf() f.set_size_inches(8.0,2.0) if (nolimit): pylab.savefig("rea-nolimit-reconstruction_%3.3d.png" % (num)) pylab.savefig("rea-nolimit-reconstruction_%3.3d.eps" % (num)) else: pylab.savefig("rea-reconstruction_%3.3d.png" % (num)) pylab.savefig("rea-reconstruction_%3.3d.eps" % (num)) #------------------------------------------------------------------------- # third frame -- evolve # draw pylab.clf() gpu.drawGrid(gr) gpu.labelCenter(gr, gr.ng + nzones/2, r"$i$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2-1, r"$i-1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2+1, r"$i+1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2-2, r"$i-2$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2+2, r"$i+2$", fontsize="medium") # draw cell slopes n = gr.ilo while (n <= gr.ihi): gpu.drawSlope(gr, n, lda[n], a[n], color="0.75", ls=":") n += 1 # evolve n = gr.ilo while (n <= gr.ihi): gpu.evolveToRight(gr, n, lda, a, C, color="r") n += 1 pylab.axis([gr.xmin-0.5*gr.dx,gr.xmax+0.5*gr.dx, -0.25, 1.2]) pylab.axis("off") print gr.xmin-0.5*gr.dx, gr.xmax+0.5*gr.dx pylab.subplots_adjust(left=0.05,right=0.95,bottom=0.05,top=0.95) f = pylab.gcf() f.set_size_inches(8.0,2.0) if (nolimit): pylab.savefig("rea-nolimit-evolve_%3.3d.png" % (num)) pylab.savefig("rea-nolimit-evolve_%3.3d.eps" % (num)) else: pylab.savefig("rea-evolve_%3.3d.png" % (num)) pylab.savefig("rea-evolve_%3.3d.eps" % (num)) #------------------------------------------------------------------------- # fourth frame -- re-average # left states (we don't need the right state when u > 0) al = numpy.zeros(2*gr.ng + gr.nx, dtype=numpy.float64) n = gr.ilo while (n <= gr.ihi+1): al[n] = a[n-1] + 0.5*(1 - C)*lda[n-1] n += 1 # the Riemann problem just picks the left state. Do a conservative # update anew = numpy.zeros(2*gr.ng + gr.nx, dtype=numpy.float64) anew[gr.ilo:gr.ihi+1] = a[gr.ilo:gr.ihi+1] + \ C*(al[gr.ilo:gr.ihi+1] - al[gr.ilo+1:gr.ihi+2]) pylab.clf() gpu.drawGrid(gr) gpu.labelCenter(gr, gr.ng + nzones/2, r"$i$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2-1, r"$i-1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2+1, r"$i+1$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2-2, r"$i-2$", fontsize="medium") gpu.labelCenter(gr, gr.ng + nzones/2+2, r"$i+2$", fontsize="medium") # show the evolved profiles from the old time n = gr.ilo while (n <= gr.ihi): gpu.evolveToRight(gr, n, lda, a, C, color="0.5", ls=":") n += 1 # draw new averages n = gr.ilo while (n <= gr.ihi): gpu.drawCellAvg(gr, n, anew[n], color="red") n += 1 pylab.axis([gr.xmin-0.5*gr.dx,gr.xmax+0.5*gr.dx, -0.25, 1.2]) pylab.axis("off") print gr.xmin-0.5*gr.dx, gr.xmax+0.5*gr.dx pylab.subplots_adjust(left=0.05,right=0.95,bottom=0.05,top=0.95) f = pylab.gcf() f.set_size_inches(8.0,2.0) if (nolimit): pylab.savefig("rea-nolimit-final_%3.3d.png" % (num)) pylab.savefig("rea-nolimit-final_%3.3d.eps" % (num)) else: pylab.savefig("rea-final_%3.3d.png" % (num)) pylab.savefig("rea-final_%3.3d.eps" % (num)) return anew