def prolong(self, varname):
    "\n        prolong the data in the current (coarse) grid to a finer\n        (factor of 2 finer) grid.  Return an array with the resulting\n        data (and same number of ghostcells).\n\n        We will reconstruct the data in the zone from the\n        zone-averaged variables using the centered-difference slopes\n\n                  (x)\n        f(x,y) = m    x/dx + <f>\n\n        When averaged over the parent cell, this reproduces <f>.\n\n        Each zone's reconstrution will be averaged over 2 children.\n\n        |           |     |     |     |\n        |    <f>    | --> |     |     |\n        |           |     |  1  |  2  |\n        +-----------+     +-----+-----+\n\n        We will fill each of the finer resolution zones by filling all\n        the 1's together, using a stride 2 into the fine array.  Then\n        the 2's, this allows us to operate in a vector\n        fashion.  All operations will use the same slopes for their\n        respective parents.\n\n        "
    cG = self.grid
    cData = self.get_var(varname)
    ng_f = cG.ng
    nx_f = (cG.nx * 2)
    fData = numpy.zeros(((2 * ng_f) + nx_f), dtype=self.dtype)
    ilo_f = ng_f
    ihi_f = ((ng_f + nx_f) - 1)
    m_x = cG.scratch_array()
    m_x[cG.ilo:(cG.ihi + 1)] = (0.5 * (cData[(cG.ilo + 1):(cG.ihi + 2)] - cData[(cG.ilo - 1):cG.ihi]))
    fData[ilo_f:(ihi_f + 1):2] = (cData[cG.ilo:(cG.ihi + 1)] - (0.25 * m_x[cG.ilo:(cG.ihi + 1)]))
    fData[(ilo_f + 1):(ihi_f + 1):2] = (cData[cG.ilo:(cG.ihi + 1)] + (0.25 * m_x[cG.ilo:(cG.ihi + 1)]))
    return fData
prolong the data in the current (coarse) grid to a finer
(factor of 2 finer) grid.  Return an array with the resulting
data (and same number of ghostcells).

We will reconstruct the data in the zone from the
zone-averaged variables using the centered-difference slopes

          (x)
f(x,y) = m    x/dx + <f>

When averaged over the parent cell, this reproduces <f>.

Each zone's reconstrution will be averaged over 2 children.

|           |     |     |     |
|    <f>    | --> |     |     |
|           |     |  1  |  2  |
+-----------+     +-----+-----+

We will fill each of the finer resolution zones by filling all
the 1's together, using a stride 2 into the fine array.  Then
the 2's, this allows us to operate in a vector
fashion.  All operations will use the same slopes for their
respective parents.
def prolong(self, varname):
    "\n        prolong the data in the current (coarse) grid to a finer\n        (factor of 2 finer) grid.  Return an array with the resulting\n        data (and same number of ghostcells).\n\n        We will reconstruct the data in the zone from the\n        zone-averaged variables using the centered-difference slopes\n\n                  (x)\n        f(x,y) = m    x/dx + <f>\n\n        When averaged over the parent cell, this reproduces <f>.\n\n        Each zone's reconstrution will be averaged over 2 children.\n\n        |           |     |     |     |\n        |    <f>    | --> |     |     |\n        |           |     |  1  |  2  |\n        +-----------+     +-----+-----+\n\n        We will fill each of the finer resolution zones by filling all\n        the 1's together, using a stride 2 into the fine array.  Then\n        the 2's, this allows us to operate in a vector\n        fashion.  All operations will use the same slopes for their\n        respective parents.\n\n        "
    cG = self.grid
    cData = self.get_var(varname)
    ng_f = cG.ng
    nx_f = (cG.nx * 2)
    fData = numpy.zeros(((2 * ng_f) + nx_f), dtype=self.dtype)
    ilo_f = ng_f
    ihi_f = ((ng_f + nx_f) - 1)
    m_x = cG.scratch_array()
    m_x[cG.ilo:(cG.ihi + 1)] = (0.5 * (cData[(cG.ilo + 1):(cG.ihi + 2)] - cData[(cG.ilo - 1):cG.ihi]))
    fData[ilo_f:(ihi_f + 1):2] = (cData[cG.ilo:(cG.ihi + 1)] - (0.25 * m_x[cG.ilo:(cG.ihi + 1)]))
    fData[(ilo_f + 1):(ihi_f + 1):2] = (cData[cG.ilo:(cG.ihi + 1)] + (0.25 * m_x[cG.ilo:(cG.ihi + 1)]))
    return fData