[yt-svn] commit/yt-3.0: 25 new changesets
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Thu Sep 26 05:16:22 PDT 2013
25 new commits in yt-3.0:
https://bitbucket.org/yt_analysis/yt-3.0/commits/36d4de9d6782/
Changeset: 36d4de9d6782
Branch: yt-3.0
User: MatthewTurk
Date: 2013-08-27 22:27:52
Summary: Minor optimizations for ARTIO.
Affected #: 2 files
diff -r 3e72bfc43c5eaecdd5d496c2228ca6cc85da5434 -r 36d4de9d67827150246ecb1f5a52e583457988f7 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -975,12 +975,16 @@
cdef artio_fileset_handle *handle
cdef np.uint64_t sfc_start
cdef np.uint64_t sfc_end
+ cdef public object _last_mask
+ cdef public object _last_selector_id
def __init__(self, domain_dimensions, # cells
domain_left_edge,
domain_right_edge,
artio_fileset artio_handle,
sfc_start, sfc_end):
+ self._last_selector_id = None
+ self._last_mask = None
self.artio_handle = artio_handle
self.handle = artio_handle.handle
cdef int i
@@ -1086,6 +1090,9 @@
res = np.zeros(num_octs, dtype="int64")
return res
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
def selector_fill(self, SelectorObject selector,
np.ndarray source,
np.ndarray dest = None,
@@ -1130,15 +1137,21 @@
return dest
return filled
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
def mask(self, SelectorObject selector, np.int64_t num_octs = -1):
cdef int i, status
cdef double dpos[3]
cdef np.float64_t pos[3]
+ cdef np.int64_t sfc
+ if self._last_selector_id == hash(selector):
+ return self._last_mask
if num_octs == -1:
# We need to count, but this process will only occur one time,
# since num_octs will later be cached.
num_octs = self.sfc_end - self.sfc_start + 1
- assert(num_octs == (self.sfc_end - self.sfc_start + 1))
+ #assert(num_octs == (self.sfc_end - self.sfc_start + 1))
cdef np.ndarray[np.uint8_t, ndim=1] mask
cdef int num_oct_levels
cdef int max_level = self.artio_handle.max_level
@@ -1165,7 +1178,9 @@
mask[sfc - self.sfc_start] = 1
artio_grid_clear_sfc_cache(self.handle)
free(num_octs_per_level)
- return mask.astype("bool")
+ self._last_mask = mask.astype("bool")
+ self._last_selector_id = hash(selector)
+ return self._last_mask
def fill_sfc_particles(self, fields):
rv = read_sfc_particles(self.artio_handle,
diff -r 3e72bfc43c5eaecdd5d496c2228ca6cc85da5434 -r 36d4de9d67827150246ecb1f5a52e583457988f7 yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -375,7 +375,7 @@
def _chunk_all(self, dobj):
oobjs = getattr(dobj._current_chunk, "objs", dobj._chunk_info)
- yield YTDataChunk(dobj, "all", oobjs, None)
+ yield YTDataChunk(dobj, "all", oobjs, None, cache = True)
def _chunk_spatial(self, dobj, ngz):
if ngz > 0:
@@ -387,7 +387,7 @@
g = og.retrieve_ghost_zones(ngz, [], smoothed=True)
else:
g = og
- yield YTDataChunk(dobj, "spatial", [g], None)
+ yield YTDataChunk(dobj, "spatial", [g], None, cache = True)
def _chunk_io(self, dobj, cache = True):
# _current_chunk is made from identify_base_chunk
https://bitbucket.org/yt_analysis/yt-3.0/commits/3928be73ffdf/
Changeset: 3928be73ffdf
Branch: yt-3.0
User: MatthewTurk
Date: 2013-08-28 20:54:38
Summary: Merging from smoothing bookmark for ARTIO optimizations.
Affected #: 18 files
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/data_objects/octree_subset.py
--- a/yt/data_objects/octree_subset.py
+++ b/yt/data_objects/octree_subset.py
@@ -36,12 +36,12 @@
NeedsProperty, \
NeedsParameter
import yt.geometry.particle_deposit as particle_deposit
+import yt.geometry.particle_smooth as particle_smooth
from yt.funcs import *
class OctreeSubset(YTSelectionContainer):
_spatial = True
_num_ghost_zones = 0
- _num_zones = 2
_type_name = 'octree_subset'
_skip_add = True
_con_args = ('base_region', 'domain', 'pf')
@@ -49,7 +49,8 @@
_domain_offset = 0
_num_octs = -1
- def __init__(self, base_region, domain, pf):
+ def __init__(self, base_region, domain, pf, over_refine_factor = 1):
+ self._num_zones = 1 << (over_refine_factor)
self.field_data = YTFieldData()
self.field_parameters = {}
self.domain = domain
@@ -145,6 +146,28 @@
if vals is None: return
return np.asfortranarray(vals)
+ def smooth(self, positions, fields = None, method = None):
+ # Here we perform our particle deposition.
+ cls = getattr(particle_smooth, "%s_smooth" % method, None)
+ if cls is None:
+ raise YTParticleDepositionNotImplemented(method)
+ nz = self.nz
+ nvals = (nz, nz, nz, (self.domain_ind >= 0).sum())
+ if fields is None: fields = []
+ op = cls(nvals, len(fields), 64)
+ op.initialize()
+ mylog.debug("Smoothing %s particles into %s Octs",
+ positions.shape[0], nvals[-1])
+ op.process_octree(self.oct_handler, self.domain_ind, positions, fields,
+ self.domain_id, self._domain_offset)
+ vals = op.finalize()
+ if vals is None: return
+ if isinstance(vals, list):
+ vals = [np.asfortranarray(v) for v in vals]
+ else:
+ vals = np.asfortranarray(vals)
+ return vals
+
def select_icoords(self, dobj):
d = self.oct_handler.icoords(self.selector, domain_id = self.domain_id,
num_octs = self._num_octs)
@@ -206,8 +229,10 @@
_type_name = 'indexed_octree_subset'
_con_args = ('data_files', 'pf', 'min_ind', 'max_ind')
domain_id = -1
- def __init__(self, base_region, data_files, pf, min_ind = 0, max_ind = 0):
+ def __init__(self, base_region, data_files, pf, min_ind = 0, max_ind = 0,
+ over_refine_factor = 1):
# The first attempt at this will not work in parallel.
+ self._num_zones = 1 << (over_refine_factor)
self.data_files = data_files
self.field_data = YTFieldData()
self.field_parameters = {}
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -55,6 +55,7 @@
domain_id = 2
_con_args = ("base_region", "sfc_start", "sfc_end", "pf")
_type_name = 'octree_subset'
+ _num_zones = 2
def __init__(self, base_region, sfc_start, sfc_end, pf):
self.field_data = YTFieldData()
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/frontends/ramses/data_structures.py
--- a/yt/frontends/ramses/data_structures.py
+++ b/yt/frontends/ramses/data_structures.py
@@ -215,6 +215,7 @@
self.amr_header['nboundary']*l]
return ng
min_level = self.pf.min_level
+ max_level = min_level
nx, ny, nz = (((i-1.0)/2.0) for i in self.amr_header['nx'])
for level in range(self.amr_header['nlevelmax']):
# Easier if do this 1-indexed
@@ -248,6 +249,8 @@
assert(pos.shape[0] == ng)
n = self.oct_handler.add(cpu + 1, level - min_level, pos)
assert(n == ng)
+ if n > 0: max_level = max(level - min_level, max_level)
+ self.max_level = max_level
self.oct_handler.finalize()
def included(self, selector):
@@ -297,7 +300,7 @@
# for now, the hierarchy file is the parameter file!
self.hierarchy_filename = self.parameter_file.parameter_filename
self.directory = os.path.dirname(self.hierarchy_filename)
- self.max_level = pf.max_level
+ self.max_level = None
self.float_type = np.float64
super(RAMSESGeometryHandler, self).__init__(pf, data_style)
@@ -308,6 +311,7 @@
for i in range(self.parameter_file['ncpu'])]
total_octs = sum(dom.local_oct_count #+ dom.ngridbound.sum()
for dom in self.domains)
+ self.max_level = max(dom.max_level for dom in self.domains)
self.num_grids = total_octs
def _detect_fields(self):
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/frontends/sph/data_structures.py
--- a/yt/frontends/sph/data_structures.py
+++ b/yt/frontends/sph/data_structures.py
@@ -96,6 +96,7 @@
class ParticleStaticOutput(StaticOutput):
_unit_base = None
+ over_refine_factor = 1
def _set_units(self):
self.units = {}
@@ -154,8 +155,10 @@
def __init__(self, filename, data_style="gadget_binary",
additional_fields = (),
- unit_base = None, n_ref = 64):
+ unit_base = None, n_ref = 64,
+ over_refine_factor = 1):
self.n_ref = n_ref
+ self.over_refine_factor = over_refine_factor
self.storage_filename = None
if unit_base is not None and "UnitLength_in_cm" in unit_base:
# We assume this is comoving, because in the absence of comoving
@@ -188,7 +191,8 @@
self.domain_left_edge = np.zeros(3, "float64")
self.domain_right_edge = np.ones(3, "float64") * hvals["BoxSize"]
- self.domain_dimensions = np.ones(3, "int32") * 2
+ nz = 1 << self.over_refine_factor
+ self.domain_dimensions = np.ones(3, "int32") * nz
self.periodicity = (True, True, True)
self.cosmological_simulation = 1
@@ -268,11 +272,13 @@
_particle_coordinates_name = "Coordinates"
_header_spec = None # Override so that there's no confusion
- def __init__(self, filename, data_style="OWLS", n_ref = 64):
+ def __init__(self, filename, data_style="OWLS", n_ref = 64,
+ over_refine_factor = 1):
self.storage_filename = None
- super(OWLSStaticOutput, self).__init__(filename, data_style,
- unit_base = None,
- n_ref = n_ref)
+ super(OWLSStaticOutput, self).__init__(
+ filename, data_style,
+ unit_base = None, n_ref = n_ref,
+ over_refine_factor = over_refine_factor)
def __repr__(self):
return os.path.basename(self.parameter_filename).split(".")[0]
@@ -292,7 +298,8 @@
self.current_time = hvals["Time_GYR"] * sec_conversion["Gyr"]
self.domain_left_edge = np.zeros(3, "float64")
self.domain_right_edge = np.ones(3, "float64") * hvals["BoxSize"]
- self.domain_dimensions = np.ones(3, "int32") * 2
+ nz = 1 << self.over_refine_factor
+ self.domain_dimensions = np.ones(3, "int32") * nz
self.cosmological_simulation = 1
self.periodicity = (True, True, True)
self.current_redshift = hvals["Redshift"]
@@ -438,7 +445,8 @@
self.parameters[param] = val
self.current_time = hvals["time"]
- self.domain_dimensions = np.ones(3, "int32") * 2
+ nz = 1 << self.over_refine_factor
+ self.domain_dimensions = np.ones(3, "int32") * nz
if self.parameters.get('bPeriodic', True):
self.periodicity = (True, True, True)
else:
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/frontends/stream/data_structures.py
--- a/yt/frontends/stream/data_structures.py
+++ b/yt/frontends/stream/data_structures.py
@@ -738,10 +738,11 @@
file_count = 1
filename_template = "stream_file"
n_ref = 64
+ over_refine_factor = 1
def load_particles(data, sim_unit_to_cm, bbox=None,
sim_time=0.0, periodicity=(True, True, True),
- n_ref = 64):
+ n_ref = 64, over_refine_factor = 1):
r"""Load a set of particles into yt as a
:class:`~yt.frontends.stream.data_structures.StreamParticleHandler`.
@@ -828,6 +829,7 @@
spf = StreamParticlesStaticOutput(handler)
spf.n_ref = n_ref
+ spf.over_refine_factor = over_refine_factor
spf.units["cm"] = sim_unit_to_cm
spf.units['1'] = 1.0
spf.units["unitary"] = 1.0
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/oct_container.pxd
--- a/yt/geometry/oct_container.pxd
+++ b/yt/geometry/oct_container.pxd
@@ -40,6 +40,8 @@
cdef struct OctInfo:
np.float64_t left_edge[3]
np.float64_t dds[3]
+ np.int64_t ipos[3]
+ np.int32_t level
cdef struct OctAllocationContainer
cdef struct OctAllocationContainer:
@@ -49,6 +51,16 @@
OctAllocationContainer *next
Oct *my_octs
+cdef struct OctList
+
+cdef struct OctList:
+ OctList *next
+ Oct *o
+
+cdef OctList *OctList_append(OctList *list, Oct *o)
+cdef int OctList_count(OctList *list)
+cdef void OctList_delete(OctList *list)
+
cdef class OctreeContainer:
cdef OctAllocationContainer *cont
cdef OctAllocationContainer **domains
@@ -56,12 +68,13 @@
cdef oct_visitor_function *fill_func
cdef int partial_coverage
cdef int nn[3]
+ cdef np.uint8_t oref
cdef np.float64_t DLE[3], DRE[3]
cdef public np.int64_t nocts
cdef public int max_domain
cdef Oct *get(self, np.float64_t ppos[3], OctInfo *oinfo = ?)
cdef int get_root(self, int ind[3], Oct **o)
- cdef void neighbors(self, Oct *, Oct **)
+ cdef Oct **neighbors(self, OctInfo *oinfo, np.int64_t *nneighbors)
cdef void oct_bounds(self, Oct *, np.float64_t *, np.float64_t *)
# This function must return the offset from global-to-local domains; i.e.,
# OctAllocationContainer.offset if such a thing exists.
@@ -71,6 +84,7 @@
OctVisitorData *data)
cdef Oct *next_root(self, int domain_id, int ind[3])
cdef Oct *next_child(self, int domain_id, int ind[3], Oct *parent)
+ cdef void setup_data(self, OctVisitorData *data, int domain_id = ?)
cdef class SparseOctreeContainer(OctreeContainer):
cdef OctKey *root_nodes
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -96,8 +96,10 @@
cdef class OctreeContainer:
def __init__(self, oct_domain_dimensions, domain_left_edge,
- domain_right_edge, partial_coverage = 0):
+ domain_right_edge, partial_coverage = 0,
+ over_refine = 1):
# This will just initialize the root mesh octs
+ self.oref = over_refine
self.partial_coverage = partial_coverage
cdef int i, j, k, p
for i in range(3):
@@ -120,6 +122,21 @@
for k in range(self.nn[2]):
self.root_mesh[i][j][k] = NULL
+ cdef void setup_data(self, OctVisitorData *data, int domain_id = -1):
+ cdef int i
+ data.index = 0
+ data.last = -1
+ data.global_index = -1
+ for i in range(3):
+ data.pos[i] = -1
+ data.ind[i] = -1
+ data.array = NULL
+ data.dims = 0
+ data.domain = domain_id
+ data.level = -1
+ data.oref = self.oref
+ data.nz = (1 << (data.oref*3))
+
def __dealloc__(self):
free_octs(self.cont)
if self.root_mesh == NULL: return
@@ -185,27 +202,39 @@
return 0
cdef int get_root(self, int ind[3], Oct **o):
+ cdef int i
+ for i in range(3):
+ if ind[i] < 0 or ind[i] >= self.nn[i]:
+ o[0] = NULL
+ return 1
o[0] = self.root_mesh[ind[0]][ind[1]][ind[2]]
- return 1
+ return 0
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- cdef Oct *get(self, np.float64_t ppos[3], OctInfo *oinfo = NULL):
+ cdef Oct *get(self, np.float64_t ppos[3], OctInfo *oinfo = NULL,
+ ):
#Given a floating point position, retrieve the most
#refined oct at that time
- cdef int ind[3]
+ cdef int ind[3], level
+ cdef np.int64_t ipos[3]
cdef np.float64_t dds[3], cp[3], pp[3]
cdef Oct *cur, *next
+ cdef int i
cur = next = NULL
- cdef int i
+ level = -1
for i in range(3):
dds[i] = (self.DRE[i] - self.DLE[i])/self.nn[i]
ind[i] = <np.int64_t> ((ppos[i] - self.DLE[i])/dds[i])
cp[i] = (ind[i] + 0.5) * dds[i] + self.DLE[i]
+ ipos[i] = 0
self.get_root(ind, &next)
# We want to stop recursing when there's nowhere else to go
while next != NULL:
+ level += 1
+ for i in range(3):
+ ipos[i] = (ipos[i] << 1) + ind[i]
cur = next
for i in range(3):
dds[i] = dds[i] / 2.0
@@ -227,18 +256,22 @@
cp[i] -= dds[i]/2.0 # Now centered
else:
cp[i] += dds[i]/2.0
- # We don't need to change dds[i] as it has been halved from the
- # oct width, thus making it already the cell width
- oinfo.dds[i] = dds[i] # Cell width
+ # We don't normally need to change dds[i] as it has been halved
+ # from the oct width, thus making it already the cell width.
+ # But, for some cases where the oref != 1, this needs to be
+ # changed.
+ oinfo.dds[i] = dds[i] / (1 << (self.oref-1)) # Cell width
oinfo.left_edge[i] = cp[i] - dds[i] # Center minus dds
+ oinfo.ipos[i] = ipos[i]
+ oinfo.level = level
return cur
def domain_identify(self, SelectorObject selector):
cdef np.ndarray[np.uint8_t, ndim=1] domain_mask
domain_mask = np.zeros(self.max_domain, dtype="uint8")
cdef OctVisitorData data
+ self.setup_data(&data)
data.array = domain_mask.data
- data.domain = -1
self.visit_all_octs(selector, oct_visitors.identify_octs, &data)
cdef int i
domain_ids = []
@@ -250,99 +283,69 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- cdef void neighbors(self, Oct* o, Oct* neighbors[27]):
- #Get 3x3x3 neighbors, although the 1,1,1 oct is the
- #central one.
- #Return an array of Octs
- cdef np.int64_t curopos[3]
- cdef np.int64_t curnpos[3]
- cdef np.int64_t npos[3]
- cdef int i, j, k, ni, nj, nk, ind[3], nn, dl, skip
- cdef np.float64_t dds[3], cp[3], pp[3]
+ cdef Oct** neighbors(self, OctInfo *oi, np.int64_t *nneighbors):
cdef Oct* candidate
- for i in range(27): neighbors[i] = NULL
nn = 0
- raise RuntimeError
- #for ni in range(3):
- # for nj in range(3):
- # for nk in range(3):
- # if ni == nj == nk == 1:
- # neighbors[nn] = o
- # nn += 1
- # continue
- # npos[0] = o.pos[0] + (ni - 1)
- # npos[1] = o.pos[1] + (nj - 1)
- # npos[2] = o.pos[2] + (nk - 1)
- # for i in range(3):
- # # Periodicity
- # if npos[i] == -1:
- # npos[i] = (self.nn[i] << o.level) - 1
- # elif npos[i] == (self.nn[i] << o.level):
- # npos[i] = 0
- # curopos[i] = o.pos[i]
- # curnpos[i] = npos[i]
- # # Now we have our neighbor position and a safe place to
- # # keep it. curnpos will be the root index of the neighbor
- # # at a given level, and npos will be constant. curopos is
- # # the candidate root at a level.
- # candidate = o
- # while candidate != NULL:
- # if ((curopos[0] == curnpos[0]) and
- # (curopos[1] == curnpos[1]) and
- # (curopos[2] == curnpos[2])):
- # break
- # # This one doesn't meet it, so we pop up a level.
- # # First we update our positions, then we update our
- # # candidate.
- # for i in range(3):
- # # We strip a digit off the right
- # curopos[i] = (curopos[i] >> 1)
- # curnpos[i] = (curnpos[i] >> 1)
- # # Now we update to the candidate's parent, which should
- # # have a matching position to curopos[]
- # # TODO: This has not survived the transition to
- # # mostly-stateless Octs!
- # raise RuntimeError
- # candidate = candidate.parent
- # if candidate == NULL:
- # # Worst case scenario
- # for i in range(3):
- # ind[i] = (npos[i] >> (o.level))
- # candidate = self.root_mesh[ind[0]][ind[1]][ind[2]]
- # # Now we have the common root, which may be NULL
- # while candidate.level < o.level:
- # dl = o.level - (candidate.level + 1)
- # for i in range(3):
- # ind[i] = (npos[i] >> dl) & 1
- # if candidate.children[cind(ind[0],ind[1],ind[2])] \
- # == NULL:
- # break
- # candidate = candidate.children[cind(ind[0],ind[1],ind[2])]
- # neighbors[nn] = candidate
- # nn += 1
+ # We are going to do a brute-force search here.
+ # This is not the most efficient -- in fact, it's relatively bad. But
+ # we will attempt to improve it in a future iteration, where we will
+ # grow a stack of parent Octs.
+ # Note that in the first iteration, we will just find the up-to-27
+ # neighbors, including the main oct.
+ cdef int i, j, k, n, level, ind[3], ii, nfound = 0
+ cdef OctList *olist, *my_list
+ my_list = olist = NULL
+ cdef Oct *cand
+ cdef np.int64_t npos[3], ndim[3]
+ # Now we get our boundaries for this level, so that we can wrap around
+ # if need be.
+ # ndim is the oct dimensions of the level, not the cell dimensions.
+ for i in range(3):
+ ndim[i] = <np.int64_t> ((self.DRE[i] - self.DLE[i]) / oi.dds[i])
+ ndim[i] = (ndim[i] >> self.oref)
+ for i in range(3):
+ npos[0] = (oi.ipos[0] + (1 - i))
+ if npos[0] < 0: npos[0] += ndim[0]
+ if npos[0] >= ndim[0]: npos[0] -= ndim[0]
+ for j in range(3):
+ npos[1] = (oi.ipos[1] + (1 - j))
+ if npos[1] < 0: npos[1] += ndim[1]
+ if npos[1] >= ndim[1]: npos[1] -= ndim[1]
+ for k in range(3):
+ npos[2] = (oi.ipos[2] + (1 - k))
+ if npos[2] < 0: npos[2] += ndim[2]
+ if npos[2] >= ndim[2]: npos[2] -= ndim[2]
+ # Now we have our npos, which we just need to find.
+ # Level 0 gets bootstrapped
+ for n in range(3):
+ ind[n] = ((npos[n] >> (oi.level)) & 1)
+ cand = NULL
+ self.get_root(ind, &cand)
+ # We should not get a NULL if we handle periodicity
+ # correctly, but we might.
+ if cand == NULL: continue
+ for level in range(1, oi.level+1):
+ if cand.children == NULL: break
+ for n in range(3):
+ ind[n] = (npos[n] >> (oi.level - (level))) & 1
+ ii = cind(ind[0],ind[1],ind[2])
+ if cand.children[ii] == NULL: break
+ cand = cand.children[ii]
+ if cand != NULL:
+ nfound += 1
+ olist = OctList_append(olist, cand)
+ if my_list == NULL: my_list = olist
- @cython.boundscheck(False)
- @cython.wraparound(False)
- @cython.cdivision(True)
- def get_neighbor_boundaries(self, oppos):
- cdef int i, ii
- cdef np.float64_t ppos[3]
- for i in range(3):
- ppos[i] = oppos[i]
- cdef Oct *main = self.get(ppos)
- cdef Oct* neighbors[27]
- self.neighbors(main, neighbors)
- cdef np.ndarray[np.float64_t, ndim=2] bounds
- cdef np.float64_t corner[3], size[3]
- bounds = np.zeros((27,6), dtype="float64")
- tnp = 0
- raise RuntimeError
- for i in range(27):
- self.oct_bounds(neighbors[i], corner, size)
- for ii in range(3):
- bounds[i, ii] = corner[ii]
- bounds[i, 3+ii] = size[ii]
- return bounds
+ olist = my_list
+ cdef int noct = OctList_count(olist)
+ cdef Oct **neighbors
+ neighbors = <Oct **> malloc(sizeof(Oct*)*noct)
+ for i in range(noct):
+ neighbors[i] = olist.o
+ olist = olist.next
+ OctList_delete(my_list)
+ nneighbors[0] = noct
+ return neighbors
@cython.boundscheck(False)
@cython.wraparound(False)
@@ -352,11 +355,10 @@
if num_octs == -1:
num_octs = selector.count_octs(self, domain_id)
cdef np.ndarray[np.uint8_t, ndim=1] coords
- coords = np.zeros((num_octs * 8), dtype="uint8")
cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
+ coords = np.zeros((num_octs * data.nz), dtype="uint8")
data.array = <void *> coords.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.mask_octs, &data)
return coords.astype("bool")
@@ -367,12 +369,11 @@
int domain_id = -1):
if num_octs == -1:
num_octs = selector.count_octs(self, domain_id)
+ cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
cdef np.ndarray[np.int64_t, ndim=2] coords
- coords = np.empty((num_octs * 8, 3), dtype="int64")
- cdef OctVisitorData data
+ coords = np.empty((num_octs * data.nz, 3), dtype="int64")
data.array = <void *> coords.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.icoords_octs, &data)
return coords
@@ -383,13 +384,12 @@
int domain_id = -1):
if num_octs == -1:
num_octs = selector.count_octs(self, domain_id)
+ cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
#Return the 'resolution' of each cell; ie the level
cdef np.ndarray[np.int64_t, ndim=1] res
- res = np.empty(num_octs * 8, dtype="int64")
- cdef OctVisitorData data
+ res = np.empty(num_octs * data.nz, dtype="int64")
data.array = <void *> res.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.ires_octs, &data)
return res
@@ -400,12 +400,11 @@
int domain_id = -1):
if num_octs == -1:
num_octs = selector.count_octs(self, domain_id)
+ cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
cdef np.ndarray[np.float64_t, ndim=2] fwidth
- fwidth = np.empty((num_octs * 8, 3), dtype="float64")
- cdef OctVisitorData data
+ fwidth = np.empty((num_octs * data.nz, 3), dtype="float64")
data.array = <void *> fwidth.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.fwidth_octs, &data)
cdef np.float64_t base_dx
for i in range(3):
@@ -420,13 +419,12 @@
int domain_id = -1):
if num_octs == -1:
num_octs = selector.count_octs(self, domain_id)
+ cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
#Return the floating point unitary position of every cell
cdef np.ndarray[np.float64_t, ndim=2] coords
- coords = np.empty((num_octs * 8, 3), dtype="float64")
- cdef OctVisitorData data
+ coords = np.empty((num_octs * data.nz, 3), dtype="float64")
data.array = <void *> coords.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.fcoords_octs, &data)
cdef int i
cdef np.float64_t base_dx
@@ -456,8 +454,8 @@
else:
dest = np.zeros(num_cells, dtype=source.dtype, order='C')
cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
data.index = offset
- data.domain = domain_id
# We only need this so we can continue calculating the offset
data.dims = dims
cdef void *p[2]
@@ -474,14 +472,16 @@
else:
raise NotImplementedError
self.visit_all_octs(selector, func, &data)
- if (data.global_index + 1) * 8 * data.dims > source.size:
+ if (data.global_index + 1) * data.nz * data.dims > source.size:
print "GLOBAL INDEX RAN AHEAD.",
- print (data.global_index + 1) * 8 * data.dims - source.size
+ print (data.global_index + 1) * data.nz * data.dims - source.size
print dest.size, source.size, num_cells
raise RuntimeError
if data.index > dest.size:
print "DEST INDEX RAN AHEAD.",
print data.index - dest.size
+ print (data.global_index + 1) * data.nz * data.dims, source.size
+ print num_cells
raise RuntimeError
if num_cells >= 0:
return dest
@@ -492,10 +492,8 @@
# Here's where we grab the masked items.
ind = np.zeros(self.nocts, 'int64') - 1
cdef OctVisitorData data
- data.domain = domain_id
+ self.setup_data(&data, domain_id)
data.array = ind.data
- data.index = 0
- data.last = -1
self.visit_all_octs(selector, oct_visitors.index_octs, &data)
return ind
@@ -578,6 +576,7 @@
if parent.children != NULL:
next = parent.children[cind(ind[0],ind[1],ind[2])]
else:
+ # This *8 does NOT need to be made generic.
parent.children = <Oct **> malloc(sizeof(Oct *) * 8)
for i in range(8):
parent.children[i] = NULL
@@ -607,13 +606,12 @@
file_inds[i] = -1
cell_inds[i] = 9
cdef OctVisitorData data
- data.index = 0
+ self.setup_data(&data, domain_id)
cdef void *p[3]
p[0] = levels.data
p[1] = file_inds.data
p[2] = cell_inds.data
data.array = p
- data.domain = domain_id
self.visit_all_octs(selector, self.fill_func, &data)
return levels, cell_inds, file_inds
@@ -641,10 +639,9 @@
def finalize(self):
cdef SelectorObject selector = selection_routines.AlwaysSelector(None)
cdef OctVisitorData data
- data.index = 0
- data.domain = 1
+ self.setup_data(&data, 1)
self.visit_all_octs(selector, oct_visitors.assign_domain_ind, &data)
- assert ((data.global_index+1)*8 == data.index)
+ assert ((data.global_index+1)*data.nz == data.index)
cdef int root_node_compare(void *a, void *b) nogil:
cdef OctKey *ao, *bo
@@ -659,9 +656,11 @@
cdef class SparseOctreeContainer(OctreeContainer):
- def __init__(self, domain_dimensions, domain_left_edge, domain_right_edge):
+ def __init__(self, domain_dimensions, domain_left_edge, domain_right_edge,
+ over_refine = 1):
cdef int i, j, k, p
self.partial_coverage = 1
+ self.oref = over_refine
for i in range(3):
self.nn[i] = domain_dimensions[i]
self.max_domain = -1
@@ -807,3 +806,33 @@
dest[local_filled + offset] = source[ox,oy,oz]
local_filled += 1
return local_filled
+
+cdef OctList *OctList_append(OctList *olist, Oct *o):
+ cdef OctList *this = olist
+ if this == NULL:
+ this = <OctList *> malloc(sizeof(OctList))
+ this.next = NULL
+ this.o = o
+ return this
+ while this.next != NULL:
+ this = this.next
+ this.next = <OctList*> malloc(sizeof(OctList))
+ this = this.next
+ this.o = o
+ this.next = NULL
+ return this
+
+cdef int OctList_count(OctList *olist):
+ cdef OctList *this = olist
+ cdef int i = 0 # Count the list
+ while this != NULL:
+ i += 1
+ this = this.next
+ return i
+
+cdef void OctList_delete(OctList *olist):
+ cdef OctList *next, *this = olist
+ while this != NULL:
+ next = this.next
+ free(this)
+ this = next
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/oct_visitors.pxd
--- a/yt/geometry/oct_visitors.pxd
+++ b/yt/geometry/oct_visitors.pxd
@@ -3,7 +3,7 @@
Author: Matthew Turk <matthewturk at gmail.com>
Affiliation: Columbia University
-Homepage: http://yt.enzotools.org/
+Homepage: http://yt-project.org/
License:
Copyright (C) 2013 Matthew Turk. All Rights Reserved.
@@ -43,6 +43,10 @@
int dims
np.int32_t domain
np.int8_t level
+ np.int8_t oref # This is the level of overref. 1 => 8 zones, 2 => 64, etc.
+ # To calculate nzones, 1 << (oref * 3)
+ np.int32_t nz
+
ctypedef void oct_visitor_function(Oct *, OctVisitorData *visitor,
np.uint8_t selected)
@@ -64,10 +68,13 @@
cdef oct_visitor_function fill_file_indices_rind
cdef inline int cind(int i, int j, int k):
+ # THIS ONLY WORKS FOR CHILDREN. It is not general for zones.
return (((i*2)+j)*2+k)
cdef inline int oind(OctVisitorData *data):
- return (((data.ind[0]*2)+data.ind[1])*2+data.ind[2])
+ cdef int d = (1 << data.oref)
+ return (((data.ind[0]*d)+data.ind[1])*d+data.ind[2])
cdef inline int rind(OctVisitorData *data):
- return (((data.ind[2]*2)+data.ind[1])*2+data.ind[0])
+ cdef int d = (1 << data.oref)
+ return (((data.ind[2]*d)+data.ind[1])*d+data.ind[0])
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/oct_visitors.pyx
--- a/yt/geometry/oct_visitors.pyx
+++ b/yt/geometry/oct_visitors.pyx
@@ -38,7 +38,7 @@
if selected == 0: return
cdef int i
# There are this many records between "octs"
- cdef np.int64_t index = (data.global_index * 8)*data.dims
+ cdef np.int64_t index = (data.global_index * data.nz)*data.dims
cdef np.float64_t **p = <np.float64_t**> data.array
index += oind(data)*data.dims
for i in range(data.dims):
@@ -50,7 +50,7 @@
# "last" here tells us the dimensionality of the array.
if selected == 0: return
cdef int i
- cdef np.int64_t index = (data.global_index * 8)*data.dims
+ cdef np.int64_t index = (data.global_index * data.nz)*data.dims
cdef np.int64_t **p = <np.int64_t**> data.array
index += oind(data)*data.dims
for i in range(data.dims):
@@ -75,7 +75,7 @@
if data.last != o.domain_ind:
data.last = o.domain_ind
data.index += 1
- cdef np.int64_t index = data.index * 8
+ cdef np.int64_t index = data.index * data.nz
index += oind(data)
arr[index] = 1
@@ -83,7 +83,7 @@
if selected == 0: return
cdef int i
cdef np.uint8_t *arr = <np.uint8_t *> data.array
- cdef np.int64_t index = data.global_index * 8
+ cdef np.int64_t index = data.global_index * data.nz
index += oind(data)
arr[index] = 1
@@ -102,7 +102,7 @@
cdef np.int64_t *coords = <np.int64_t*> data.array
cdef int i
for i in range(3):
- coords[data.index * 3 + i] = (data.pos[i] << 1) + data.ind[i]
+ coords[data.index * 3 + i] = (data.pos[i] << data.oref) + data.ind[i]
data.index += 1
cdef void ires_octs(Oct *o, OctVisitorData *data, np.uint8_t selected):
@@ -120,9 +120,9 @@
cdef np.float64_t *fcoords = <np.float64_t*> data.array
cdef int i
cdef np.float64_t c, dx
- dx = 1.0 / (2 << data.level)
+ dx = 1.0 / ((1 << data.oref) << data.level)
for i in range(3):
- c = <np.float64_t> ((data.pos[i] << 1 ) + data.ind[i])
+ c = <np.float64_t> ((data.pos[i] << data.oref ) + data.ind[i])
fcoords[data.index * 3 + i] = (c + 0.5) * dx
data.index += 1
@@ -135,7 +135,7 @@
cdef np.float64_t *fwidth = <np.float64_t*> data.array
cdef int i
cdef np.float64_t dx
- dx = 1.0 / (2 << data.level)
+ dx = 1.0 / ((1 << data.oref) << data.level)
for i in range(3):
fwidth[data.index * 3 + i] = dx
data.index += 1
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/particle_deposit.pxd
--- a/yt/geometry/particle_deposit.pxd
+++ b/yt/geometry/particle_deposit.pxd
@@ -5,7 +5,7 @@
Affiliation: UC Santa Cruz
Author: Matthew Turk <matthewturk at gmail.com>
Affiliation: Columbia University
-Homepage: http://yt.enzotools.org/
+Homepage: http://yt-project.org/
License:
Copyright (C) 2013 Matthew Turk. All Rights Reserved.
@@ -32,7 +32,7 @@
from libc.math cimport sqrt
from fp_utils cimport *
-from oct_container cimport Oct, OctAllocationContainer, OctreeContainer
+from .oct_container cimport Oct, OctAllocationContainer, OctreeContainer
cdef extern from "alloca.h":
void *alloca(int)
@@ -62,7 +62,6 @@
cdef class ParticleDepositOperation:
# We assume each will allocate and define their own temporary storage
cdef public object nvals
- cdef public int bad_indices
cdef public int update_values
cdef void process(self, int dim[3], np.float64_t left_edge[3],
np.float64_t dds[3], np.int64_t offset,
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/particle_deposit.pyx
--- a/yt/geometry/particle_deposit.pyx
+++ b/yt/geometry/particle_deposit.pyx
@@ -54,7 +54,6 @@
fields = None, int domain_id = -1,
int domain_offset = 0):
cdef int nf, i, j
- self.bad_indices = 0
if fields is None:
fields = []
nf = len(fields)
@@ -66,7 +65,8 @@
tarr = fields[i]
field_pointers[i] = <np.float64_t *> tarr.data
cdef int dims[3]
- dims[0] = dims[1] = dims[2] = 2
+ dims[0] = dims[1] = dims[2] = (1 << octree.oref)
+ cdef int nz = dims[0] * dims[1] * dims[2]
cdef OctInfo oi
cdef np.int64_t offset, moff
cdef Oct *oct
@@ -98,7 +98,7 @@
if oct == NULL or (domain_id > 0 and oct.domain != domain_id):
continue
# Note that this has to be our local index, not our in-file index.
- offset = dom_ind[oct.domain_ind - moff] * 8
+ offset = dom_ind[oct.domain_ind - moff] * nz
if offset < 0: continue
# Check that we found the oct ...
self.process(dims, oi.left_edge, oi.dds,
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/particle_geometry_handler.py
--- a/yt/geometry/particle_geometry_handler.py
+++ b/yt/geometry/particle_geometry_handler.py
@@ -86,7 +86,8 @@
sum(d.total_particles.values()) for d in self.data_files)
pf = self.parameter_file
self.oct_handler = ParticleOctreeContainer(
- [1, 1, 1], pf.domain_left_edge, pf.domain_right_edge)
+ [1, 1, 1], pf.domain_left_edge, pf.domain_right_edge,
+ over_refine = pf.over_refine_factor)
self.oct_handler.n_ref = pf.n_ref
mylog.info("Allocating for %0.3e particles", self.total_particles)
# No more than 256^3 in the region finder.
@@ -147,8 +148,9 @@
data_files = [self.data_files[i] for i in
self.regions.identify_data_files(dobj.selector)]
base_region = getattr(dobj, "base_region", dobj)
+ oref = self.parameter_file.over_refine_factor
subset = [ParticleOctreeSubset(base_region, data_files,
- self.parameter_file)]
+ self.parameter_file, over_refine_factor = oref)]
dobj._chunk_info = subset
dobj._current_chunk = list(self._chunk_all(dobj))[0]
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/particle_oct_container.pyx
--- a/yt/geometry/particle_oct_container.pyx
+++ b/yt/geometry/particle_oct_container.pyx
@@ -205,6 +205,7 @@
cdef int i, j, k, m, n, ind[3]
cdef Oct *noct
cdef np.uint64_t prefix1, prefix2
+ # TODO: This does not need to be changed.
o.children = <Oct **> malloc(sizeof(Oct *)*8)
for i in range(2):
for j in range(2):
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/particle_smooth.pxd
--- /dev/null
+++ b/yt/geometry/particle_smooth.pxd
@@ -0,0 +1,92 @@
+"""
+Particle Deposition onto Octs
+
+Author: Christopher Moody <chris.e.moody at gmail.com>
+Affiliation: UC Santa Cruz
+Author: Matthew Turk <matthewturk at gmail.com>
+Affiliation: Columbia University
+Homepage: http://yt.enzotools.org/
+License:
+ Copyright (C) 2013 Matthew Turk. All Rights Reserved.
+
+ This file is part of yt.
+
+ yt is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+cimport numpy as np
+import numpy as np
+from libc.stdlib cimport malloc, free, qsort
+cimport cython
+from libc.math cimport sqrt
+
+from fp_utils cimport *
+from oct_container cimport Oct, OctAllocationContainer, OctreeContainer
+from .particle_deposit cimport sph_kernel, gind
+
+cdef extern from "alloca.h":
+ void *alloca(int)
+
+cdef struct NeighborList
+cdef struct NeighborList:
+ np.int64_t pn # Particle number
+ np.float64_t r2 # radius**2
+
+cdef inline np.float64_t r2dist(np.float64_t ppos[3],
+ np.float64_t cpos[3],
+ np.float64_t DW[3]):
+ cdef int i
+ cdef np.float64_t r2, DR
+ r2 = 0.0
+ for i in range(3):
+ DR = (ppos[i] - cpos[i])
+ if (DR > DW[i]/2.0):
+ DR -= DW[i]/2.0
+ elif (DR < -DW[i]/2.0):
+ DR += DW[i]/2.0
+ r2 += DR * DR
+ return r2
+
+cdef class ParticleSmoothOperation:
+ # We assume each will allocate and define their own temporary storage
+ cdef public object nvals
+ cdef np.float64_t DW[3]
+ cdef int nfields
+ cdef int maxn
+ cdef int curn
+ cdef np.int64_t *doffs
+ cdef np.int64_t *pinds
+ cdef np.int64_t *pcounts
+ cdef np.float64_t *ppos
+ # Note that we are preallocating here, so this is *not* threadsafe.
+ cdef NeighborList *neighbors
+ cdef void neighbor_process(self, int dim[3], np.float64_t left_edge[3],
+ np.float64_t dds[3], np.float64_t *ppos,
+ np.float64_t **fields, np.int64_t nneighbors,
+ np.int64_t *nind, np.int64_t *doffs,
+ np.int64_t *pinds, np.int64_t *pcounts,
+ np.int64_t offset)
+ cdef void neighbor_eval(self, np.int64_t pn, np.float64_t ppos[3],
+ np.float64_t cpos[3])
+ cdef void neighbor_reset(self)
+ cdef void neighbor_find(self,
+ np.int64_t nneighbors,
+ np.int64_t *nind,
+ np.int64_t *doffs,
+ np.int64_t *pcounts,
+ np.int64_t *pinds,
+ np.float64_t *ppos,
+ np.float64_t cpos[3])
+ cdef void process(self, np.int64_t offset, int i, int j, int k,
+ int dim[3], np.float64_t cpos[3], np.float64_t **fields)
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/particle_smooth.pyx
--- /dev/null
+++ b/yt/geometry/particle_smooth.pyx
@@ -0,0 +1,359 @@
+"""
+Particle smoothing in cells
+
+Author: Matthew Turk <matthewturk at gmail.com>
+Affiliation: Columbia University
+Homepage: http://yt-project.org/
+License:
+ Copyright (C) 2013 Matthew Turk. All Rights Reserved.
+
+ This file is part of yt.
+
+ yt is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+cimport numpy as np
+import numpy as np
+from libc.stdlib cimport malloc, free, realloc
+cimport cython
+from libc.math cimport sqrt
+
+from fp_utils cimport *
+from oct_container cimport Oct, OctAllocationContainer, \
+ OctreeContainer, OctInfo
+
+cdef int Neighbor_compare(void *on1, void *on2) nogil:
+ cdef NeighborList *n1, *n2
+ n1 = <NeighborList *> on1
+ n2 = <NeighborList *> on2
+ # Note that we set this up so that "greatest" evaluates to the *end* of the
+ # list, so we can do standard radius comparisons.
+ if n1.r2 < n2.r2:
+ return -1
+ elif n1.r2 == n2.r2:
+ return 0
+ else:
+ return 1
+
+cdef class ParticleSmoothOperation:
+ def __init__(self, nvals, nfields, max_neighbors):
+ # This is the set of cells, in grids, blocks or octs, we are handling.
+ cdef int i
+ self.nvals = nvals
+ self.nfields = nfields
+ self.maxn = max_neighbors
+ self.neighbors = <NeighborList *> malloc(
+ sizeof(NeighborList) * self.maxn)
+ self.neighbor_reset()
+
+ def initialize(self, *args):
+ raise NotImplementedError
+
+ def finalize(self, *args):
+ raise NotImplementedError
+
+ @cython.cdivision(True)
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ def process_octree(self, OctreeContainer octree,
+ np.ndarray[np.int64_t, ndim=1] dom_ind,
+ np.ndarray[np.float64_t, ndim=2] positions,
+ fields = None, int domain_id = -1,
+ int domain_offset = 0,
+ int test_neighbors = 0):
+ # This will be a several-step operation.
+ #
+ # We first take all of our particles and assign them to Octs. If they
+ # are not in an Oct, we will assume they are out of bounds. Note that
+ # this means that if we have loaded neighbor particles for which an Oct
+ # does not exist, we are going to be discarding them -- so sparse
+ # octrees will need to ensure that neighbor octs *exist*. Particles
+ # will be assigned in a new NumPy array. Note that this incurs
+ # overhead, but reduces complexity as we will now be able to use
+ # argsort.
+ #
+ # After the particles have been assigned to Octs, we process each Oct
+ # individually. We will do this by calling "get" for the *first*
+ # particle in each set of Octs in the sorted list. After this, we get
+ # neighbors for each Oct.
+ #
+ # Now, with the set of neighbors (and thus their indices) we allocate
+ # an array of particles and their fields, fill these in, and call our
+ # process function.
+ #
+ # This is not terribly efficient -- for starters, the neighbor function
+ # is not the most efficient yet. We will also need to handle some
+ # mechanism of an expandable array for holding pointers to Octs, so
+ # that we can deal with >27 neighbors. As I write this comment,
+ # neighbors() only returns 27 neighbors.
+ cdef int nf, i, j, dims[3], n
+ cdef np.float64_t **field_pointers, *field_vals, pos[3], *ppos, dds[3]
+ cdef int nsize = 0
+ cdef np.int64_t *nind = NULL
+ cdef OctInfo oi
+ cdef Oct *oct, **neighbors = NULL
+ cdef np.int64_t nneighbors, numpart, offset, moff, local_ind
+ cdef np.int64_t *doffs, *pinds, *pcounts, poff
+ cdef np.ndarray[np.int64_t, ndim=1] pind, doff, pdoms, pcount
+ cdef np.ndarray[np.float64_t, ndim=1] tarr
+ dims[0] = dims[1] = dims[2] = (1 << octree.oref)
+ cdef int nz = dims[0] * dims[1] * dims[2]
+ numpart = positions.shape[0]
+ # pcount is the number of particles per oct.
+ pcount = np.zeros_like(dom_ind)
+ # doff is the offset to a given oct in the sorted particles.
+ doff = np.zeros_like(dom_ind) - 1
+ moff = octree.get_domain_offset(domain_id + domain_offset)
+ # pdoms points particles at their octs. So the value in this array, for
+ # a given index, is the local oct index.
+ pdoms = np.zeros(positions.shape[0], dtype="int64") - 1
+ nf = len(fields)
+ if fields is None:
+ fields = []
+ field_pointers = <np.float64_t**> alloca(sizeof(np.float64_t *) * nf)
+ for i in range(nf):
+ tarr = fields[i]
+ field_pointers[i] = <np.float64_t *> tarr.data
+ for i in range(3):
+ self.DW[i] = (octree.DRE[i] - octree.DLE[i])
+ for i in range(positions.shape[0]):
+ for j in range(3):
+ pos[j] = positions[i, j]
+ oct = octree.get(pos)
+ if oct == NULL or (domain_id > 0 and oct.domain != domain_id):
+ continue
+ # Note that this has to be our local index, not our in-file index.
+ # This is the particle count, which we'll use once we have sorted
+ # the particles to calculate the offsets into each oct's particles.
+ offset = oct.domain_ind - moff
+ pcount[offset] += 1
+ pdoms[i] = offset # We store the *actual* offset.
+ # Now we have oct assignments. Let's sort them.
+ # Note that what we will be providing to our processing functions will
+ # actually be indirectly-sorted fields. This preserves memory at the
+ # expense of additional pointer lookups.
+ pind = np.argsort(pdoms)
+ pind = np.asarray(pind, dtype='int64', order='C')
+ # So what this means is that we now have all the oct-0 particle indices
+ # in order, then the oct-1, etc etc.
+ # This now gives us the indices to the particles for each domain.
+ for i in range(positions.shape[0]):
+ # This value, poff, is the index of the particle in the *unsorted*
+ # arrays.
+ poff = pind[i]
+ offset = pdoms[poff]
+ # If we have yet to assign the starting index to this oct, we do so
+ # now.
+ if doff[offset] < 0: doff[offset] = i
+ # Now doff is full of offsets to the first entry in the pind that
+ # refers to that oct's particles.
+ ppos = <np.float64_t *> positions.data
+ doffs = <np.int64_t*> doff.data
+ pinds = <np.int64_t*> pind.data
+ pcounts = <np.int64_t*> pcount.data
+ nsize = 27
+ nind = <np.int64_t *> malloc(sizeof(np.int64_t)*nsize)
+ for i in range(doff.shape[0]):
+ # Nothing assigned.
+ if doff[i] < 0: continue
+ # The first particle assigned to this oct should be the one we
+ # want.
+ poff = pind[doff[i]]
+ for j in range(3):
+ pos[j] = positions[poff, j]
+ oct = octree.get(pos, &oi)
+ if oct == NULL or (domain_id > 0 and oct.domain != domain_id):
+ continue
+ offset = dom_ind[oct.domain_ind - moff] * nz
+ neighbors = octree.neighbors(&oi, &nneighbors)
+ # Now we have all our neighbors. And, we should be set for what
+ # else we need to do.
+ if nneighbors > nsize:
+ nind = <np.int64_t *> realloc(
+ nind, sizeof(np.int64_t)*nneighbors)
+ nsize = nneighbors
+ for j in range(nneighbors):
+ nind[j] = neighbors[j].domain_ind - moff
+ for n in range(j):
+ if nind[j] == nind[n]:
+ nind[j] = -1
+ break
+ # This is allocated by the neighbors function, so we deallocate it.
+ free(neighbors)
+ self.neighbor_process(dims, oi.left_edge, oi.dds,
+ ppos, field_pointers, nneighbors, nind, doffs,
+ pinds, pcounts, offset)
+ if nind != NULL:
+ free(nind)
+
+ @cython.cdivision(True)
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ def process_grid(self, gobj,
+ np.ndarray[np.float64_t, ndim=2] positions,
+ fields = None):
+ raise NotImplementedError
+
+ cdef void process(self, np.int64_t offset, int i, int j, int k,
+ int dim[3], np.float64_t cpos[3], np.float64_t **fields):
+ raise NotImplementedError
+
+ cdef void neighbor_reset(self):
+ self.curn = 0
+ for i in range(self.maxn):
+ self.neighbors[i].pn = -1
+ self.neighbors[i].r2 = 1e300
+
+ cdef void neighbor_eval(self, np.int64_t pn, np.float64_t ppos[3],
+ np.float64_t cpos[3]):
+ cdef NeighborList *cur
+ cdef int i
+ # _c means candidate (what we're evaluating)
+ # _o means other (the item in the list)
+ cdef np.float64_t r2_c, r2_o
+ cdef np.int64_t pn_c, pn_o
+ # If we're less than the maximum number of neighbors, we simply append.
+ # After that, we will sort, and then only compare against the rightmost
+ # entries.
+ if self.curn < self.maxn:
+ cur = &self.neighbors[self.curn]
+ cur.pn = pn
+ cur.r2 = r2dist(ppos, cpos, self.DW)
+ self.curn += 1
+ if self.curn == self.maxn:
+ # This time we sort it, so that future insertions will be able
+ # to be done in order.
+ qsort(self.neighbors, self.curn, sizeof(NeighborList),
+ Neighbor_compare)
+ return
+ # This will go (curn - 1) through 0.
+ r2_c = r2dist(ppos, cpos, self.DW)
+ pn_c = pn
+ for i in range((self.curn - 1), -1, -1):
+ # First we evaluate against i. If our candidate radius is greater
+ # than the one we're inspecting, we quit.
+ cur = &self.neighbors[i]
+ r2_o = cur.r2
+ pn_o = cur.pn
+ if r2_c >= r2_o:
+ break
+ # Now we know we need to swap them. First we assign our candidate
+ # values to cur.
+ cur.r2 = r2_c
+ cur.pn = pn_c
+ if i + 1 >= self.maxn:
+ continue # No swapping
+ cur = &self.neighbors[i + 1]
+ cur.r2 = r2_o
+ cur.pn = pn_o
+ # At this point, we've evaluated all the particles and we should have a
+ # sorted set of values. So, we're done.
+
+ cdef void neighbor_find(self,
+ np.int64_t nneighbors,
+ np.int64_t *nind,
+ np.int64_t *doffs,
+ np.int64_t *pcounts,
+ np.int64_t *pinds,
+ np.float64_t *ppos,
+ np.float64_t cpos[3]
+ ):
+ # We are now given the number of neighbors, the indices into the
+ # domains for them, and the number of particles for each.
+ cdef int ni, i, j
+ cdef np.int64_t offset, pn, pc
+ cdef np.float64_t pos[3]
+ self.neighbor_reset()
+ for ni in range(nneighbors):
+ if nind[ni] == -1: continue
+ offset = doffs[nind[ni]]
+ pc = pcounts[nind[ni]]
+ for i in range(pc):
+ pn = pinds[offset + i]
+ for j in range(3):
+ pos[j] = ppos[pn * 3 + j]
+ self.neighbor_eval(pn, pos, cpos)
+
+ cdef void neighbor_process(self, int dim[3], np.float64_t left_edge[3],
+ np.float64_t dds[3], np.float64_t *ppos,
+ np.float64_t **fields, np.int64_t nneighbors,
+ np.int64_t *nind, np.int64_t *doffs,
+ np.int64_t *pinds, np.int64_t *pcounts,
+ np.int64_t offset):
+ # Note that we assume that fields[0] == smoothing length in the native
+ # units supplied. We can now iterate over every cell in the block and
+ # every particle to find the nearest. We will use a priority heap.
+ cdef int i, j, k
+ cdef np.float64_t cpos[3]
+ cpos[0] = left_edge[0] + 0.5*dds[0]
+ for i in range(dim[0]):
+ cpos[1] = left_edge[1] + 0.5*dds[1]
+ for j in range(dim[1]):
+ cpos[2] = left_edge[2] + 0.5*dds[2]
+ for k in range(dim[2]):
+ self.neighbor_find(nneighbors, nind, doffs, pcounts,
+ pinds, ppos, cpos)
+ # Now we have all our neighbors in our neighbor list.
+ self.process(offset, i, j, k, dim, cpos, fields)
+ cpos[2] += dds[2]
+ cpos[1] += dds[1]
+ cpos[0] += dds[0]
+
+
+cdef class SimpleNeighborSmooth(ParticleSmoothOperation):
+ cdef np.float64_t **fp
+ cdef public object vals
+ def initialize(self):
+ cdef int i
+ if self.nfields < 4:
+ # We need at least two fields, the smoothing length and the
+ # field to smooth, to operate.
+ raise RuntimeError
+ cdef np.ndarray tarr
+ self.fp = <np.float64_t **> malloc(
+ sizeof(np.float64_t *) * self.nfields)
+ self.vals = []
+ for i in range(self.nfields):
+ tarr = np.zeros(self.nvals, dtype="float64", order="F")
+ self.vals.append(tarr)
+ self.fp[i] = <np.float64_t *> tarr.data
+
+ def finalize(self):
+ free(self.fp)
+ return self.vals
+
+ @cython.cdivision(True)
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ cdef void process(self, np.int64_t offset, int i, int j, int k,
+ int dim[3], np.float64_t cpos[3], np.float64_t **fields):
+ # We have our i, j, k for our cell, as well as the cell position.
+ # We also have a list of neighboring particles with particle numbers.
+ cdef int n, fi
+ cdef np.float64_t weight, r2, val
+ cdef np.int64_t pn
+ for n in range(self.curn):
+ # No normalization for the moment.
+ # fields[0] is the smoothing length.
+ r2 = self.neighbors[n].r2
+ pn = self.neighbors[n].pn
+ # Smoothing kernel weight function
+ weight = sph_kernel(sqrt(r2) / fields[0][pn])
+ # Mass of the particle times the value divided by the Density
+ for fi in range(self.nfields - 3):
+ val = fields[1][pn] * fields[fi + 3][pn]/fields[2][pn]
+ self.fp[fi + 3][gind(i,j,k,dim) + offset] = val * weight
+ return
+
+simple_neighbor_smooth = SimpleNeighborSmooth
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/selection_routines.pxd
--- a/yt/geometry/selection_routines.pxd
+++ b/yt/geometry/selection_routines.pxd
@@ -40,6 +40,9 @@
oct_visitor_function *func,
OctVisitorData *data,
int visit_covered = ?)
+ cdef void visit_oct_cells(self, OctVisitorData *data, Oct *root, Oct *ch,
+ np.float64_t spos[3], np.float64_t sdds[3],
+ oct_visitor_function *func, int i, int j, int k)
cdef int select_grid(self, np.float64_t left_edge[3],
np.float64_t right_edge[3],
np.int32_t level, Oct *o = ?) nogil
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/selection_routines.pyx
--- a/yt/geometry/selection_routines.pyx
+++ b/yt/geometry/selection_routines.pyx
@@ -157,16 +157,13 @@
def count_octs(self, OctreeContainer octree, int domain_id = -1):
cdef OctVisitorData data
- data.index = 0
- data.last = -1
- data.domain = domain_id
+ octree.setup_data(&data, domain_id)
octree.visit_all_octs(self, oct_visitors.count_total_octs, &data)
return data.index
def count_oct_cells(self, OctreeContainer octree, int domain_id = -1):
cdef OctVisitorData data
- data.index = 0
- data.domain = domain_id
+ octree.setup_data(&data, domain_id)
octree.visit_all_octs(self, oct_visitors.count_total_cells, &data)
return data.index
@@ -230,6 +227,10 @@
if root.children != NULL:
ch = root.children[cind(i, j, k)]
if iter == 1 and next_level == 1 and ch != NULL:
+ # Note that data.pos is always going to be the
+ # position of the Oct -- it is *not* always going
+ # to be the same as the position of the cell under
+ # investigation.
data.pos[0] = (data.pos[0] << 1) + i
data.pos[1] = (data.pos[1] << 1) + j
data.pos[2] = (data.pos[2] << 1) + k
@@ -242,21 +243,60 @@
data.pos[2] = (data.pos[2] >> 1)
data.level -= 1
elif this_level == 1:
- selected = self.select_cell(spos, sdds)
- if ch != NULL:
- selected *= self.overlap_cells
data.global_index += increment
increment = 0
- data.ind[0] = i
- data.ind[1] = j
- data.ind[2] = k
- func(root, data, selected)
+ self.visit_oct_cells(data, root, ch, spos, sdds,
+ func, i, j, k)
spos[2] += sdds[2]
spos[1] += sdds[1]
spos[0] += sdds[0]
this_level = 0 # We turn this off for the second pass.
iter += 1
+ cdef void visit_oct_cells(self, OctVisitorData *data, Oct *root, Oct *ch,
+ np.float64_t spos[3], np.float64_t sdds[3],
+ oct_visitor_function *func, int i, int j, int k):
+ # We can short-circuit the whole process if data.oref == 1.
+ # This saves us some funny-business.
+ cdef int selected
+ if data.oref == 1:
+ selected = self.select_cell(spos, sdds)
+ if ch != NULL:
+ selected *= self.overlap_cells
+ # data.ind refers to the cell, not to the oct.
+ data.ind[0] = i
+ data.ind[1] = j
+ data.ind[2] = k
+ func(root, data, selected)
+ return
+ # Okay, now that we've got that out of the way, we have to do some
+ # other checks here. In this case, spos[] is the position of the
+ # center of a *possible* oct child, which means it is the center of a
+ # cluster of cells. That cluster might have 1, 8, 64, ... cells in it.
+ # But, we can figure it out by calculating the cell dds.
+ cdef np.float64_t dds[3], pos[3]
+ cdef int ci, cj, ck
+ cdef int nr = (1 << (data.oref - 1))
+ for ci in range(3):
+ dds[ci] = sdds[ci] / nr
+ # Boot strap at the first index.
+ pos[0] = (spos[0] - sdds[0]/2.0) + dds[0] * 0.5
+ for ci in range(nr):
+ pos[1] = (spos[1] - sdds[1]/2.0) + dds[1] * 0.5
+ for cj in range(nr):
+ pos[2] = (spos[2] - sdds[2]/2.0) + dds[2] * 0.5
+ for ck in range(nr):
+ selected = self.select_cell(pos, dds)
+ if ch != NULL:
+ selected *= self.overlap_cells
+ data.ind[0] = ci + i * nr
+ data.ind[1] = cj + j * nr
+ data.ind[2] = ck + k * nr
+ func(root, data, selected)
+ pos[2] += dds[2]
+ pos[1] += dds[1]
+ pos[0] += dds[0]
+
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
diff -r 36d4de9d67827150246ecb1f5a52e583457988f7 -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d yt/geometry/setup.py
--- a/yt/geometry/setup.py
+++ b/yt/geometry/setup.py
@@ -43,6 +43,15 @@
"yt/geometry/oct_container.pxd",
"yt/geometry/selection_routines.pxd",
"yt/geometry/particle_deposit.pxd"])
+ config.add_extension("particle_smooth",
+ ["yt/geometry/particle_smooth.pyx"],
+ include_dirs=["yt/utilities/lib/"],
+ libraries=["m"],
+ depends=["yt/utilities/lib/fp_utils.pxd",
+ "yt/geometry/oct_container.pxd",
+ "yt/geometry/selection_routines.pxd",
+ "yt/geometry/particle_deposit.pxd",
+ "yt/geometry/particle_smooth.pxd"])
config.add_extension("fake_octree",
["yt/geometry/fake_octree.pyx"],
include_dirs=["yt/utilities/lib/"],
https://bitbucket.org/yt_analysis/yt-3.0/commits/61bab0aea184/
Changeset: 61bab0aea184
Branch: yt-3.0
User: MatthewTurk
Date: 2013-08-28 21:17:54
Summary: Removing unncessary selector_fill calls.
Affected #: 3 files
diff -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d -r 61bab0aea1843046034e3de17e7a1dc5e195bbf7 yt/data_objects/octree_subset.py
--- a/yt/data_objects/octree_subset.py
+++ b/yt/data_objects/octree_subset.py
@@ -39,6 +39,16 @@
import yt.geometry.particle_smooth as particle_smooth
from yt.funcs import *
+def cell_count_cache(func):
+ def cc_cache_func(self, dobj):
+ if hash(dobj.selector) != self._last_selector_id:
+ self._cell_count = -1
+ rv = func(self, dobj)
+ self._cell_count = rv.shape[0]
+ self._last_selector_id = hash(dobj.selector)
+ return rv
+ return cc_cache_func
+
class OctreeSubset(YTSelectionContainer):
_spatial = True
_num_ghost_zones = 0
@@ -47,7 +57,7 @@
_con_args = ('base_region', 'domain', 'pf')
_container_fields = ("dx", "dy", "dz")
_domain_offset = 0
- _num_octs = -1
+ _cell_count = -1
def __init__(self, base_region, domain, pf, over_refine_factor = 1):
self._num_zones = 1 << (over_refine_factor)
@@ -168,37 +178,25 @@
vals = np.asfortranarray(vals)
return vals
+ @cell_count_cache
def select_icoords(self, dobj):
- d = self.oct_handler.icoords(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 3,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.icoords(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
+ @cell_count_cache
def select_fcoords(self, dobj):
- d = self.oct_handler.fcoords(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 3,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.fcoords(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
+ @cell_count_cache
def select_fwidth(self, dobj):
- d = self.oct_handler.fwidth(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 3,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.fwidth(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
+ @cell_count_cache
def select_ires(self, dobj):
- d = self.oct_handler.ires(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 1,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.ires(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
def select(self, selector, source, dest, offset):
n = self.oct_handler.selector_fill(selector, source, dest, offset,
@@ -206,11 +204,7 @@
return n
def count(self, selector):
- if hash(selector) == self._last_selector_id:
- if self._last_mask is None: return 0
- return self._last_mask.sum()
- self.select(selector)
- return self.count(selector)
+ return -1
def count_particles(self, selector, x, y, z):
# We don't cache the selector results
diff -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d -r 61bab0aea1843046034e3de17e7a1dc5e195bbf7 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -1022,17 +1022,16 @@
cdef int i
return self.mask(selector).sum()
- def icoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def icoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
# Note that num_octs does not have to equal sfc_end - sfc_start + 1.
cdef np.int64_t sfc
cdef int acoords[3], i
- # We call it num_octs, but it's really num_cells.
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.int64_t, ndim=2] coords
- coords = np.empty((num_octs, 3), dtype="int64")
+ coords = np.empty((num_cells, 3), dtype="int64")
cdef int filled = 0
for sfc in range(self.sfc_start, self.sfc_end + 1):
if mask[sfc - self.sfc_start] == 0: continue
@@ -1045,18 +1044,17 @@
filled += 1
return coords
- def fcoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fcoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- # Note that num_octs does not have to equal sfc_end - sfc_start + 1.
+ # Note that num_cells does not have to equal sfc_end - sfc_start + 1.
cdef np.int64_t sfc
cdef np.float64_t pos[3]
cdef int acoords[3], i
- # We call it num_octs, but it's really num_cells.
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.float64_t, ndim=2] coords
- coords = np.empty((num_octs, 3), dtype="float64")
+ coords = np.empty((num_cells, 3), dtype="float64")
cdef int filled = 0
for sfc in range(self.sfc_start, self.sfc_end + 1):
if mask[sfc - self.sfc_start] == 0: continue
@@ -1069,25 +1067,25 @@
filled += 1
return coords
- def fwidth(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fwidth(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
cdef int i
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.float64_t, ndim=2] width
- width = np.zeros((num_octs, 3), dtype="float64")
+ width = np.zeros((num_cells, 3), dtype="float64")
for i in range(3):
width[:,i] = self.dds[i]
return width
- def ires(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def ires(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.int64_t, ndim=1] res
- res = np.zeros(num_octs, dtype="int64")
+ res = np.zeros(num_cells, dtype="int64")
return res
@cython.boundscheck(False)
@@ -1140,24 +1138,23 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def mask(self, SelectorObject selector, np.int64_t num_octs = -1):
+ def mask(self, SelectorObject selector, np.int64_t num_cells = -1):
cdef int i, status
cdef double dpos[3]
cdef np.float64_t pos[3]
cdef np.int64_t sfc
if self._last_selector_id == hash(selector):
return self._last_mask
- if num_octs == -1:
+ if num_cells == -1:
# We need to count, but this process will only occur one time,
- # since num_octs will later be cached.
- num_octs = self.sfc_end - self.sfc_start + 1
- #assert(num_octs == (self.sfc_end - self.sfc_start + 1))
+ # since num_cells will later be cached.
+ num_cells = self.sfc_end - self.sfc_start + 1
cdef np.ndarray[np.uint8_t, ndim=1] mask
cdef int num_oct_levels
cdef int max_level = self.artio_handle.max_level
cdef int *num_octs_per_level = <int *>malloc(
(max_level + 1)*sizeof(int))
- mask = np.zeros((num_octs), dtype="uint8")
+ mask = np.zeros((num_cells), dtype="uint8")
status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
self.sfc_end)
check_artio_status(status)
diff -r 3928be73ffdf87d0d8fb71f531fc9add3ce3b02d -r 61bab0aea1843046034e3de17e7a1dc5e195bbf7 yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -350,14 +350,14 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def mask(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def mask(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
cdef np.ndarray[np.uint8_t, ndim=1] coords
cdef OctVisitorData data
self.setup_data(&data, domain_id)
- coords = np.zeros((num_octs * data.nz), dtype="uint8")
+ coords = np.zeros((num_cells), dtype="uint8")
data.array = <void *> coords.data
self.visit_all_octs(selector, oct_visitors.mask_octs, &data)
return coords.astype("bool")
@@ -365,14 +365,14 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def icoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def icoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
cdef OctVisitorData data
self.setup_data(&data, domain_id)
cdef np.ndarray[np.int64_t, ndim=2] coords
- coords = np.empty((num_octs * data.nz, 3), dtype="int64")
+ coords = np.empty((num_cells, 3), dtype="int64")
data.array = <void *> coords.data
self.visit_all_octs(selector, oct_visitors.icoords_octs, &data)
return coords
@@ -380,15 +380,15 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def ires(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def ires(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
cdef OctVisitorData data
self.setup_data(&data, domain_id)
#Return the 'resolution' of each cell; ie the level
cdef np.ndarray[np.int64_t, ndim=1] res
- res = np.empty(num_octs * data.nz, dtype="int64")
+ res = np.empty(num_cells, dtype="int64")
data.array = <void *> res.data
self.visit_all_octs(selector, oct_visitors.ires_octs, &data)
return res
@@ -396,14 +396,14 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def fwidth(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fwidth(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
cdef OctVisitorData data
self.setup_data(&data, domain_id)
cdef np.ndarray[np.float64_t, ndim=2] fwidth
- fwidth = np.empty((num_octs * data.nz, 3), dtype="float64")
+ fwidth = np.empty((num_cells, 3), dtype="float64")
data.array = <void *> fwidth.data
self.visit_all_octs(selector, oct_visitors.fwidth_octs, &data)
cdef np.float64_t base_dx
@@ -415,15 +415,15 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def fcoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fcoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
cdef OctVisitorData data
self.setup_data(&data, domain_id)
#Return the floating point unitary position of every cell
cdef np.ndarray[np.float64_t, ndim=2] coords
- coords = np.empty((num_octs * data.nz, 3), dtype="float64")
+ coords = np.empty((num_cells, 3), dtype="float64")
data.array = <void *> coords.data
self.visit_all_octs(selector, oct_visitors.fcoords_octs, &data)
cdef int i
https://bitbucket.org/yt_analysis/yt-3.0/commits/4c2653d013ab/
Changeset: 4c2653d013ab
Branch: yt-3.0
User: drudd
Date: 2013-08-27 22:36:26
Summary: Updated to latest version of artio, including LGPL license. Added support for grid-only ARTIO files
Affected #: 16 files
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -8,7 +8,6 @@
from yt.geometry.selection_routines cimport SelectorObject, AlwaysSelector
from yt.geometry.oct_container cimport \
- OctreeContainer, OctAllocationContainer, \
SparseOctreeContainer
from yt.geometry.oct_visitors cimport \
OctVisitorData, oct_visitor_function, Oct
@@ -66,6 +65,9 @@
int artio_fileset_open_grid(artio_fileset_handle *handle)
int artio_fileset_close_grid(artio_fileset_handle *handle)
+ int artio_fileset_has_grid( artio_fileset_handle *handle )
+ int artio_fileset_has_particles( artio_fileset_handle *handle )
+
# selection functions
artio_selection *artio_selection_allocate( artio_fileset_handle *handle )
artio_selection *artio_select_all( artio_fileset_handle *handle )
@@ -136,12 +138,14 @@
cdef int64_t sfc_min, sfc_max
# grid attributes
+ cdef public int has_grid
cdef public int min_level, max_level
cdef public int num_grid_variables
cdef int *num_octs_per_level
cdef float *grid_variables
# particle attributes
+ cdef public int has_particles
cdef public int num_species
cdef int *particle_position_index
cdef int *num_particles_per_species
@@ -178,32 +182,48 @@
if (not self.num_octs_per_level) or (not self.grid_variables) :
raise MemoryError
- status = artio_fileset_open_grid( self.handle )
- check_artio_status(status)
+ if artio_fileset_has_grid(self.handle):
+ status = artio_fileset_open_grid(self.handle)
+ check_artio_status(status)
+ self.has_grid = 1
+ else:
+ self.has_grid = 0
# particle detection
- self.num_species = self.parameters['num_particle_species'][0]
- self.particle_position_index = <int *>malloc(3*sizeof(int)*self.num_species)
- if not self.particle_position_index :
- raise MemoryError
- for ispec in range(self.num_species) :
- labels = self.parameters["species_%02d_primary_variable_labels"% (ispec,)]
- try :
- self.particle_position_index[3*ispec+0] = labels.index('POSITION_X')
- self.particle_position_index[3*ispec+1] = labels.index('POSITION_Y')
- self.particle_position_index[3*ispec+2] = labels.index('POSITION_Z')
- except ValueError :
- raise RuntimeError("Unable to locate position information for particle species", ispec )
+ if ( artio_fileset_has_particles(self.handle) ):
+ status = artio_fileset_open_particles(self.handle)
+ check_artio_status(status)
+ self.has_particles = 1
- self.num_particles_per_species = <int *>malloc(sizeof(int)*self.num_species)
- self.primary_variables = <double *>malloc(sizeof(double)*max(self.parameters['num_primary_variables']))
- self.secondary_variables = <float *>malloc(sizeof(float)*max(self.parameters['num_secondary_variables']))
- if (not self.num_particles_per_species) or (not self.primary_variables) or (not self.secondary_variables) :
- raise MemoryError
+ for v in ["num_particle_species","num_primary_variables","num_secondary_variables"]:
+ if not self.parameters.has_key(v):
+ raise RuntimeError("Unable to locate particle header information in artio header: key=", v)
- status = artio_fileset_open_particles( self.handle )
- check_artio_status(status)
-
+ self.num_species = self.parameters['num_particle_species'][0]
+ self.particle_position_index = <int *>malloc(3*sizeof(int)*self.num_species)
+ if not self.particle_position_index :
+ raise MemoryError
+ for ispec in range(self.num_species) :
+ species_labels = "species_%02d_primary_variable_labels"% (ispec,)
+ if not self.parameters.has_key(species_labels):
+ raise RuntimeError("Unable to locate variable labels for species",ispec)
+
+ labels = self.parameters[species_labels]
+ try :
+ self.particle_position_index[3*ispec+0] = labels.index('POSITION_X')
+ self.particle_position_index[3*ispec+1] = labels.index('POSITION_Y')
+ self.particle_position_index[3*ispec+2] = labels.index('POSITION_Z')
+ except ValueError :
+ raise RuntimeError("Unable to locate position information for particle species", ispec)
+
+ self.num_particles_per_species = <int *>malloc(sizeof(int)*self.num_species)
+ self.primary_variables = <double *>malloc(sizeof(double)*max(self.parameters['num_primary_variables']))
+ self.secondary_variables = <float *>malloc(sizeof(float)*max(self.parameters['num_secondary_variables']))
+ if (not self.num_particles_per_species) or (not self.primary_variables) or (not self.secondary_variables) :
+ raise MemoryError
+ else:
+ self.has_particles = 0
+
def __dealloc__(self) :
if self.num_octs_per_level : free(self.num_octs_per_level)
if self.grid_variables : free(self.grid_variables)
@@ -390,7 +410,6 @@
raise RuntimeError("Field",f,"is not known to ARTIO")
field_order[i] = var_labels.index(f)
- # dhr - cache the entire domain (replace later)
status = artio_grid_cache_sfc_range( self.handle, self.sfc_min, self.sfc_max )
check_artio_status(status)
@@ -702,7 +721,8 @@
raise RuntimeError
si = ei
domain = 2
- artio_grid_clear_sfc_cache(handle)
+ #status = artio_grid_clear_sfc_cache(handle)
+ #check_artio_status(status)
free(mask)
free(num_octs_per_level)
free(tot_octs_per_level)
@@ -951,11 +971,11 @@
status = artio_particle_read_root_cell_end( handle )
check_artio_status(status)
- status = artio_particle_clear_sfc_cache(handle)
- check_artio_status(status)
+ #status = artio_particle_clear_sfc_cache(handle)
+ #check_artio_status(status)
- status = artio_grid_clear_sfc_cache(handle)
- check_artio_status(status)
+ #status = artio_grid_clear_sfc_cache(handle)
+ #check_artio_status(status)
free(num_octs_per_level)
free(num_particles_per_species)
@@ -1010,6 +1030,8 @@
cdef np.int64_t count_cells(self, SelectorObject selector):
# We visit each cell if it is not refined and determine whether it is
# included or not.
+ # DHR - selector was used to construct the initial sfc list, so
+ # this should always equal the number of root cells
cdef np.int64_t sfc
cdef np.float64_t pos[3], right_edge[3]
cdef int num_cells = 0
@@ -1161,7 +1183,8 @@
# If refined, we skip
if num_oct_levels > 0: continue
mask[sfc - self.sfc_start] = 1
- artio_grid_clear_sfc_cache(self.handle)
+ #status = artio_grid_clear_sfc_cache(self.handle)
+ #check_artio_status(status)
free(num_octs_per_level)
return mask.astype("bool")
@@ -1220,8 +1243,8 @@
status = artio_grid_read_root_cell_end( handle )
check_artio_status(status)
# Now we have all our sources.
- status = artio_grid_clear_sfc_cache(handle)
- check_artio_status(status)
+ #status = artio_grid_clear_sfc_cache(handle)
+ #check_artio_status(status)
free(field_ind)
free(field_vals)
free(grid_variables)
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/LICENSE
--- /dev/null
+++ b/yt/frontends/artio/artio_headers/LICENSE
@@ -0,0 +1,850 @@
+ARTIO is licensed under the GNU Lesser General Public License (LGPL) version 3,
+which is an extension of the GNU Gneral Public License (GPL). The text of both
+licenses are included here.
+
+===============================================================================
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
+===============================================================================
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year><name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year><name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+===============================================================================
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio.c
--- a/yt/frontends/artio/artio_headers/artio.c
+++ b/yt/frontends/artio/artio_headers/artio.c
@@ -1,10 +1,24 @@
-/*
- * artio.c
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
*
- * Created on: Feb 21, 2010
- * Author: Yongen Yu
- */
-
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
#include "artio.h"
#include "artio_internal.h"
@@ -20,7 +34,7 @@
int artio_fh_buffer_size = ARTIO_DEFAULT_BUFFER_SIZE;
-int artio_set_buffer_size( int buffer_size ) {
+int artio_fileset_set_buffer_size( int buffer_size ) {
if ( buffer_size < 0 ) {
return ARTIO_ERR_INVALID_BUFFER_SIZE;
}
@@ -199,16 +213,18 @@
if ( handle != NULL ) {
handle->parameters = artio_parameter_list_init();
+#ifdef ARTIO_MPI
handle->context = (artio_context *)malloc(sizeof(artio_context));
if ( handle->context == NULL ) {
return NULL;
}
memcpy( handle->context, context, sizeof(artio_context) );
-#ifdef ARTIO_MPI
MPI_Comm_size(handle->context->comm, &num_procs);
MPI_Comm_rank(handle->context->comm, &my_rank);
#else
+ handle->context = NULL;
+
num_procs = 1;
my_rank = 0;
#endif /* MPI */
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio.h
--- a/yt/frontends/artio/artio_headers/artio.h
+++ b/yt/frontends/artio/artio_headers/artio.h
@@ -1,20 +1,30 @@
-/*
- * artio.h
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
*
- * Created on: Feb 21, 2010
- * Author: Yongen Yu
- * Modified: Jun 6, 2010 - Doug Rudd
- * Nov 18, 2010 - Doug Rudd
- * Nov 14, 2012 - Doug Rudd
- * Feb 7, 2013 - Doug Rudd - Version 1.0
- * March 3, 2013 - Doug Rudd - Version 1.1 (inc. selectors)
- */
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
#ifndef __ARTIO_H__
#define __ARTIO_H__
#define ARTIO_MAJOR_VERSION 1
-#define ARTIO_MINOR_VERSION 1
+#define ARTIO_MINOR_VERSION 2
#ifdef ARTIO_MPI
#include <mpi.h>
@@ -146,7 +156,7 @@
* Description Close the file
*/
int artio_fileset_close(artio_fileset *handle);
-
+int artio_fileset_set_buffer_size( int buffer_size );
int artio_fileset_has_grid( artio_fileset *handle );
int artio_fileset_has_particles( artio_fileset *handle );
@@ -228,8 +238,6 @@
int artio_fileset_open_grid(artio_fileset *handle);
int artio_fileset_close_grid(artio_fileset *handle);
-int artio_fileset_open_particle(artio_fileset *handle);
-int artio_fileset_close_particle(artio_fileset *handle);
/*
* Description: Output the variables of the root level cell and the hierarchy of the Oct tree correlated with this root level cell
@@ -305,7 +313,7 @@
int artio_grid_clear_sfc_cache(artio_fileset *handle );
int artio_grid_count_octs_in_sfc_range(artio_fileset *handle,
- int64_t start, int64_t end, int64_t *num_octs);
+ int64_t start, int64_t end, int64_t *num_octs_in_range );
/*
* Description: Read a segment of oct nodes
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio_endian.c
--- a/yt/frontends/artio/artio_headers/artio_endian.c
+++ b/yt/frontends/artio/artio_headers/artio_endian.c
@@ -1,3 +1,25 @@
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
+ *
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
+
#include "artio_endian.h"
#include <stdint.h>
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio_endian.h
--- a/yt/frontends/artio/artio_headers/artio_endian.h
+++ b/yt/frontends/artio/artio_headers/artio_endian.h
@@ -1,3 +1,25 @@
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
+ *
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
+
#ifndef __ARTIO_EDIAN_H__
#define __ARTIO_EDIAN_H__
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio_file.c
--- /dev/null
+++ b/yt/frontends/artio/artio_headers/artio_file.c
@@ -0,0 +1,161 @@
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
+ *
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
+
+#include "artio.h"
+#include "artio_internal.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+artio_fh *artio_file_fopen( char * filename, int mode, const artio_context *context) {
+ artio_fh *fh;
+#ifdef ARTIO_DEBUG
+ printf( "artio_file_fopen( filename=%s, mode=%d, context=%p )\n",
+ filename, mode, context ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ fh = artio_file_fopen_i(filename,mode,context);
+#ifdef ARTIO_DEBUG
+ printf(" artio_file_fopen = %p\n", fh ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ return fh;
+}
+
+int artio_file_attach_buffer( artio_fh *handle, void *buf, int buf_size ) {
+ int status;
+#ifdef ARTIO_DEBUG
+ printf( "artio_file_attach_buffer( handle=%p, buf=%p, buf_size = %d )\n",
+ handle, buf, buf_size ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ status = artio_file_attach_buffer_i(handle,buf,buf_size);
+#ifdef ARTIO_DEBUG
+ if ( status != ARTIO_SUCCESS ) {
+ printf(" artio_file_attach_buffer(%p) = %d\n", handle, status ); fflush(stdout);
+ }
+#endif /* ARTIO_DEBUG */
+ return status;
+}
+
+int artio_file_detach_buffer( artio_fh *handle ) {
+ int status;
+#ifdef ARTIO_DEBUG
+ printf( "artio_file_detach_buffer( handle=%p )\n", handle ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ status = artio_file_detach_buffer_i(handle);
+#ifdef ARTIO_DEBUG
+ if ( status != ARTIO_SUCCESS ) {
+ printf( "artio_file_detach_buffer(%p) = %d\n", handle, status ); fflush(stdout);
+ }
+#endif /* ARTIO_DEBUG */
+ return status;
+}
+
+int artio_file_fwrite( artio_fh *handle, const void *buf, int64_t count, int type ) {
+ int status;
+#ifdef ARTIO_DEBUG
+ printf( "artio_file_fwrite( handle=%p, buf=%p, count=%ld, type=%d )\n",
+ handle, buf, count, type ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ status = artio_file_fwrite_i(handle,buf,count,type);
+#ifdef ARTIO_DEBUG
+ if ( status != ARTIO_SUCCESS ) {
+ printf( "artio_file_fwrite(%p) = %d", handle, status ); fflush(stdout);
+ }
+#endif /* ARTIO_DEBUG */
+ return status;
+}
+
+int artio_file_fflush(artio_fh *handle) {
+ int status;
+#ifdef ARTIO_DEBUG
+ printf( "artio_file_fflush( handle=%p )\n", handle ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ status = artio_file_fflush_i(handle);
+#ifdef ARTIO_DEBUG
+ if ( status != ARTIO_SUCCESS ) {
+ printf( "artio_file_fflush(%p) = %d\n", handle, status ); fflush(stdout);
+ }
+#endif /* ARTIO_DEBUG */
+ return status;
+}
+
+int artio_file_fread(artio_fh *handle, void *buf, int64_t count, int type ) {
+ int status;
+#ifdef ARTIO_DEBUG
+ printf( "artio_file_fread( handle=%p, buf=%p, count=%ld, type=%d )\n",
+ handle, buf, count, type ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ status = artio_file_fread_i(handle,buf,count,type);
+#ifdef ARTIO_DEBUG
+ if ( status != ARTIO_SUCCESS ) {
+ printf( "artio_file_fread(%p) = %d", handle, status );
+ }
+#endif /* ARTIO_DEBUG */
+ return status;
+}
+
+int artio_file_ftell(artio_fh *handle, int64_t *offset) {
+ int status;
+#ifdef ARTIO_DEBUG
+ printf( "artio_file_ftell( handle=%p, offset=%p )\n",
+ handle, offset ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ status = artio_file_ftell_i(handle,offset);
+#ifdef ARTIO_DEBUG
+ if ( status != ARTIO_SUCCESS ) {
+ printf("artio_file_ftell(%p) = %d\n", handle, status ); fflush(stdout);
+ }
+#endif /* ARTIO_DEBUG */
+ return status;
+}
+
+int artio_file_fseek(artio_fh *handle, int64_t offset, int whence ) {
+ int status;
+#ifdef ARTIO_DEBUG
+ printf( "artio_file_fseek( handle=%p, offset=%ld, whence=%d )\n",
+ handle, offset, whence ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ status = artio_file_fseek_i(handle,offset,whence);
+#ifdef ARTIO_DEBUG
+ if ( status != ARTIO_SUCCESS ) {
+ printf( "artio_file_fseek(%p) = %d\n", handle, status ); fflush(stdout);
+ }
+#endif /* ARTIO_DEBUG */
+ return status;
+}
+
+int artio_file_fclose(artio_fh *handle) {
+ int status;
+#ifdef ARTIO_DEBUG
+ printf( "artio_file_fclose( handle=%p )\n", handle ); fflush(stdout);
+#endif /* ARTIO_DEBUG */
+ status = artio_file_fclose_i(handle);
+#ifdef ARTIO_DEBUG
+ if ( status != ARTIO_SUCCESS ) {
+ printf( "artio_file_fclose(%p) = %d\n", handle, status ); fflush(stdout);
+ }
+#endif /* ARTIO_DEBUG */
+ return status;
+}
+
+void artio_file_set_endian_swap_tag(artio_fh *handle) {
+ artio_file_set_endian_swap_tag_i(handle);
+}
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio_grid.c
--- a/yt/frontends/artio/artio_headers/artio_grid.c
+++ b/yt/frontends/artio/artio_headers/artio_grid.c
@@ -1,9 +1,25 @@
-/*
- * artio_grid.c
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
*
- * Created on: May 10, 2011
- * Author: Yongen Yu
- */
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
+
#include "artio.h"
#include "artio_internal.h"
@@ -310,7 +326,7 @@
}
}
- handle->grid = ghandle;
+ handle->grid = ghandle;
artio_parameter_set_long_array(handle, "grid_file_sfc_index",
ghandle->num_grid_files + 1, ghandle->file_sfc_index);
@@ -396,7 +412,7 @@
}
int artio_grid_count_octs_in_sfc_range(artio_fileset *handle,
- int64_t start, int64_t end, int64_t *num_octs) {
+ int64_t start, int64_t end, int64_t *num_octs_in_range ) {
int i;
int ret;
int file, first;
@@ -428,7 +444,7 @@
return ARTIO_ERR_INVALID_STATE;
}
- *num_octs = 0;
+ *num_octs_in_range = 0;
if ( 8*ghandle->num_grid_variables <= ghandle->file_max_level ) {
/* we can't compute the number of octs through the offset table */
@@ -446,7 +462,7 @@
if ( ret != ARTIO_SUCCESS ) return ret;
for ( i = 0; i < num_oct_levels; i++ ) {
- *num_octs += num_octs_per_level[i];
+ *num_octs_in_range += num_octs_per_level[i];
}
ret = artio_grid_read_root_cell_end( handle );
@@ -490,7 +506,7 @@
/* this assumes (num_levels_per_root_tree)*sizeof(int) <
* size of an oct, or 8*num_variables > max_level so the
* number of levels drops off in rounding to int */
- *num_octs += (size_offset - offset -
+ *num_octs_in_range += (size_offset - offset -
sizeof(float)*ghandle->num_grid_variables - sizeof(int) ) /
(8*(sizeof(float)*ghandle->num_grid_variables + sizeof(int) ));
offset = next_offset;
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio_internal.h
--- a/yt/frontends/artio/artio_headers/artio_internal.h
+++ b/yt/frontends/artio/artio_headers/artio_internal.h
@@ -1,10 +1,24 @@
-/*
- * artio_internal.h
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
*
- * Created on: Apr 9, 2010
- * Author: Yongen Yu
- * Renamed/Modified: Nov 18, 2010 - Douglas Rudd
- */
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
#ifndef __ARTIO_INTERNAL_H__
#define __ARTIO_INTERNAL_H__
@@ -160,6 +174,7 @@
#define ARTIO_SEEK_CUR 1
#define ARTIO_SEEK_END 2
+/* wrapper functions for profiling and debugging */
artio_fh *artio_file_fopen( char * filename, int amode, const artio_context *context );
int artio_file_attach_buffer( artio_fh *handle, void *buf, int buf_size );
int artio_file_detach_buffer( artio_fh *handle );
@@ -169,7 +184,19 @@
int artio_file_fseek(artio_fh *ffh, int64_t offset, int whence);
int artio_file_fread(artio_fh *handle, void *buf, int64_t count, int type );
int artio_file_fclose(artio_fh *handle);
-void artio_set_endian_swap_tag(artio_fh *handle);
+void artio_file_set_endian_swap_tag(artio_fh *handle);
+
+/* internal versions */
+artio_fh *artio_file_fopen_i( char * filename, int amode, const artio_context *context );
+int artio_file_attach_buffer_i( artio_fh *handle, void *buf, int buf_size );
+int artio_file_detach_buffer_i( artio_fh *handle );
+int artio_file_fwrite_i(artio_fh *handle, const void *buf, int64_t count, int type );
+int artio_file_ftell_i( artio_fh *handle, int64_t *offset );
+int artio_file_fflush_i(artio_fh *handle);
+int artio_file_fseek_i(artio_fh *ffh, int64_t offset, int whence);
+int artio_file_fread_i(artio_fh *handle, void *buf, int64_t count, int type );
+int artio_file_fclose_i(artio_fh *handle);
+void artio_file_set_endian_swap_tag_i(artio_fh *handle);
#define ARTIO_ENDIAN_MAGIC 0x1234
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio_mpi.c
--- a/yt/frontends/artio/artio_headers/artio_mpi.c
+++ b/yt/frontends/artio/artio_headers/artio_mpi.c
@@ -1,10 +1,24 @@
-/*
- * artio_mpi.c
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
*
- * Created on: Apr 9, 2010
- * Author: Yongen Yu
- * Modified: Nov 18, 2010 - Douglas Rudd
- */
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
#include "artio.h"
#include "artio_internal.h"
@@ -29,7 +43,7 @@
int bfend;
};
-artio_fh *artio_file_fopen( char * filename, int mode, const artio_context *context) {
+artio_fh *artio_file_fopen_i( char * filename, int mode, const artio_context *context) {
int status;
int flag;
int rank;
@@ -53,7 +67,9 @@
ffh->mode = mode;
ffh->data = NULL;
- ffh->bfsize = 0;
+ ffh->bfsize = -1;
+ ffh->bfend = -1;
+ ffh->bfptr = -1;
flag = mode & ARTIO_MODE_ACCESS;
@@ -77,7 +93,7 @@
return ffh;
}
-int artio_file_attach_buffer( artio_fh *handle, void *buf, int buf_size ) {
+int artio_file_attach_buffer_i( artio_fh *handle, void *buf, int buf_size ) {
if ( !(handle->mode & ARTIO_MODE_ACCESS ) ) {
return ARTIO_ERR_INVALID_FILE_MODE;
}
@@ -94,7 +110,7 @@
return ARTIO_SUCCESS;
}
-int artio_file_detach_buffer( artio_fh *handle ) {
+int artio_file_detach_buffer_i( artio_fh *handle ) {
int ret;
ret = artio_file_fflush(handle);
if ( ret != ARTIO_SUCCESS ) return ret;
@@ -107,7 +123,7 @@
return ARTIO_SUCCESS;
}
-int artio_file_fwrite( artio_fh *handle, const void *buf, int64_t count, int type ) {
+int artio_file_fwrite_i( artio_fh *handle, const void *buf, int64_t count, int type ) {
size_t size;
int64_t remain;
int size32;
@@ -119,9 +135,9 @@
}
size = artio_type_size( type );
- if ( size == (size_t)-1 ) {
- return ARTIO_ERR_INVALID_DATATYPE;
- }
+ if ( size == (size_t)-1 ) {
+ return ARTIO_ERR_INVALID_DATATYPE;
+ }
if ( count > ARTIO_INT64_MAX / size ) {
return ARTIO_ERR_IO_OVERFLOW;
@@ -151,6 +167,8 @@
MPI_BYTE, MPI_STATUS_IGNORE ) != MPI_SUCCESS ) {
return ARTIO_ERR_IO_WRITE;
}
+ p += size32;
+ remain -= size32;
while ( remain > handle->bfsize ) {
if ( MPI_File_write(handle->fh, p, handle->bfsize,
@@ -168,7 +186,7 @@
return ARTIO_SUCCESS;
}
-int artio_file_fflush(artio_fh *handle) {
+int artio_file_fflush_i(artio_fh *handle) {
if ( !(handle->mode & ARTIO_MODE_ACCESS) ) {
return ARTIO_ERR_INVALID_FILE_MODE;
}
@@ -182,8 +200,8 @@
handle->bfptr = 0;
}
} else if ( handle->mode & ARTIO_MODE_READ ) {
+ handle->bfend = -1;
handle->bfptr = 0;
- handle->bfend = -1;
} else {
return ARTIO_ERR_INVALID_FILE_MODE;
}
@@ -191,13 +209,12 @@
return ARTIO_SUCCESS;
}
-int artio_file_fread(artio_fh *handle, void *buf, int64_t count, int type ) {
+int artio_file_fread_i(artio_fh *handle, void *buf, int64_t count, int type ) {
MPI_Status status;
size_t size, avail, remain;
int size_read, size32;
char *p;
-
if ( !(handle->mode & ARTIO_MODE_READ) ) {
return ARTIO_ERR_INVALID_FILE_MODE;
}
@@ -290,18 +307,22 @@
return ARTIO_SUCCESS;
}
-int artio_file_ftell(artio_fh *handle, int64_t *offset) {
+int artio_file_ftell_i(artio_fh *handle, int64_t *offset) {
MPI_Offset current;
MPI_File_get_position( handle->fh, ¤t );
- if ( handle->bfend == 0 ) {
- *offset = current;
- } else {
- *offset = current - handle->bfend + handle->bfptr;
+
+ if ( handle->bfend > 0 ) {
+ current -= handle->bfend;
+ }
+ if ( handle->bfptr > 0 ) {
+ current += handle->bfptr;
}
+ *offset = (int64_t)current;
+
return ARTIO_SUCCESS;
}
-int artio_file_fseek(artio_fh *handle, int64_t offset, int whence ) {
+int artio_file_fseek_i(artio_fh *handle, int64_t offset, int whence ) {
MPI_Offset current;
if ( handle->mode & ARTIO_MODE_ACCESS ) {
@@ -309,6 +330,7 @@
if ( offset == 0 ) {
return ARTIO_SUCCESS;
} else if ( handle->mode & ARTIO_MODE_READ &&
+ handle->bfend > 0 &&
handle->bfptr + offset >= 0 &&
handle->bfptr + offset < handle->bfend ) {
handle->bfptr += offset;
@@ -326,13 +348,14 @@
} else if ( whence == ARTIO_SEEK_SET ) {
MPI_File_get_position( handle->fh, ¤t );
if (handle->mode & ARTIO_MODE_WRITE &&
- current<=offset && offset<(current + handle->bfsize) &&
- handle->bfptr==(offset - current)) {
+ current <= offset &&
+ offset < current + handle->bfsize &&
+ handle->bfptr == offset - current ) {
return ARTIO_SUCCESS;
} else if ( handle->mode & ARTIO_MODE_READ &&
handle->bfptr > 0 &&
+ handle->bfend > 0 &&
handle->bfptr < handle->bfend &&
- handle->bfend > 0 &&
offset >= current - handle->bfend &&
offset < current ) {
handle->bfptr = offset - current + handle->bfend;
@@ -355,7 +378,7 @@
return ARTIO_SUCCESS;
}
-int artio_file_fclose(artio_fh *handle) {
+int artio_file_fclose_i(artio_fh *handle) {
if ( handle->mode & ARTIO_MODE_ACCESS ) {
artio_file_fflush(handle);
MPI_File_close(&handle->fh);
@@ -365,7 +388,7 @@
return ARTIO_SUCCESS;
}
-void artio_set_endian_swap_tag(artio_fh *handle) {
+void artio_file_set_endian_swap_tag_i(artio_fh *handle) {
handle->mode |= ARTIO_MODE_ENDIAN_SWAP;
}
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio_parameter.c
--- a/yt/frontends/artio/artio_headers/artio_parameter.c
+++ b/yt/frontends/artio/artio_headers/artio_parameter.c
@@ -1,9 +1,24 @@
-/*
- * artio_parameter.c
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
*
- * Created on: Jun 8, 2010
- * Author: Yongen Yu
- */
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
#include "artio.h"
#include "artio_internal.h"
@@ -68,7 +83,7 @@
if ( endian_tag != ARTIO_ENDIAN_MAGIC ) {
artio_int_swap( &endian_tag, 1 );
if ( endian_tag == ARTIO_ENDIAN_MAGIC ) {
- artio_set_endian_swap_tag(handle);
+ artio_file_set_endian_swap_tag(handle);
} else {
return ARTIO_ERR_PARAM_CORRUPTED_MAGIC;
}
diff -r f6c18705bf76fa980051bd4cb8e1fd4b60d94563 -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f yt/frontends/artio/artio_headers/artio_particle.c
--- a/yt/frontends/artio/artio_headers/artio_particle.c
+++ b/yt/frontends/artio/artio_headers/artio_particle.c
@@ -1,9 +1,25 @@
-/*
- * artio_particle.c
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
*
- * Created on: May 10, 2011
- * Author: eric
- */
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
+
#include "artio.h"
#include "artio_internal.h"
This diff is so big that we needed to truncate the remainder.
https://bitbucket.org/yt_analysis/yt-3.0/commits/59edd14640f7/
Changeset: 59edd14640f7
Branch: yt-3.0
User: drudd
Date: 2013-08-29 17:24:16
Summary: Updated with upstream, performance fixes in artio front end
Affected #: 39 files
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -5158,3 +5158,4 @@
0000000000000000000000000000000000000000 hop callback
a71dffe4bc813fdadc506ccad9efb632e23dc843 yt-3.0a1
954d1ffcbf04c3d1b394c2ea05324d903a9a07cf yt-3.0a2
+f4853999c2b5b852006d6628719c882cddf966df yt-3.0a3
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 doc/install_script.sh
--- a/doc/install_script.sh
+++ b/doc/install_script.sh
@@ -473,11 +473,18 @@
function do_setup_py
{
[ -e $1/done ] && return
- echo "Installing $1 (arguments: '$*')"
- [ ! -e $1/extracted ] && tar xfz $1.tar.gz
- touch $1/extracted
- cd $1
- if [ ! -z `echo $1 | grep h5py` ]
+ LIB=$1
+ shift
+ if [ -z "$@" ]
+ then
+ echo "Installing $LIB"
+ else
+ echo "Installing $LIB (arguments: '$@')"
+ fi
+ [ ! -e $LIB/extracted ] && tar xfz $LIB.tar.gz
+ touch $LIB/extracted
+ cd $LIB
+ if [ ! -z `echo $LIB | grep h5py` ]
then
shift
( ${DEST_DIR}/bin/python2.7 setup.py build --hdf5=${HDF5_DIR} $* 2>&1 ) 1>> ${LOG_FILE} || do_exit
@@ -519,8 +526,8 @@
function get_ytproject
{
+ [ -e $1 ] && return
echo "Downloading $1 from yt-project.org"
- [ -e $1 ] && return
${GETFILE} "http://yt-project.org/dependencies/$1" || do_exit
( ${SHASUM} -c $1.sha512 2>&1 ) 1>> ${LOG_FILE} || do_exit
}
@@ -551,67 +558,93 @@
mkdir -p ${DEST_DIR}/src
cd ${DEST_DIR}/src
+CYTHON='Cython-0.19.1'
+FORTHON='Forthon-0.8.11'
+PYX='PyX-0.12.1'
+PYTHON='Python-2.7.5'
+BZLIB='bzip2-1.0.6'
+FREETYPE_VER='freetype-2.4.12'
+H5PY='h5py-2.1.3'
+HDF5='hdf5-1.8.11'
+IPYTHON='ipython-1.0.0'
+LAPACK='lapack-3.4.2'
+PNG=libpng-1.6.3
+MATPLOTLIB='matplotlib-1.3.0'
+MERCURIAL='mercurial-2.7'
+NOSE='nose-1.3.0'
+NUMPY='numpy-1.7.1'
+PYTHON_HGLIB='python-hglib-1.0'
+PYZMQ='pyzmq-13.1.0'
+ROCKSTAR='rockstar-0.99.6'
+SCIPY='scipy-0.12.0'
+SQLITE='sqlite-autoconf-3071700'
+SYMPY='sympy-0.7.3'
+TORNADO='tornado-3.1'
+ZEROMQ='zeromq-3.2.3'
+ZLIB='zlib-1.2.8'
+
# Now we dump all our SHA512 files out.
-echo 'fb85d71bb4f80b35f0d0f1735c650dd75c5f84b05635ddf91d6241ff103b5a49158c5b851a20c15e05425f6dde32a4971b35fcbd7445f61865b4d61ffd1fbfa1 Cython-0.18.tar.gz' > Cython-0.18.tar.gz.sha512
+echo '9dcdda5b2ee2e63c2d3755245b7b4ed2f4592455f40feb6f8e86503195d9474559094ed27e789ab1c086d09da0bb21c4fe844af0e32a7d47c81ff59979b18ca0 Cython-0.19.1.tar.gz' > Cython-0.19.1.tar.gz.sha512
+echo '3f53d0b474bfd79fea2536d0a9197eaef6c0927e95f2f9fd52dbd6c1d46409d0e649c21ac418d8f7767a9f10fe6114b516e06f2be4b06aec3ab5bdebc8768220 Forthon-0.8.11.tar.gz' > Forthon-0.8.11.tar.gz.sha512
echo '4941f5aa21aff3743546495fb073c10d2657ff42b2aff401903498638093d0e31e344cce778980f28a7170c6d29eab72ac074277b9d4088376e8692dc71e55c1 PyX-0.12.1.tar.gz' > PyX-0.12.1.tar.gz.sha512
-echo '3349152c47ed2b63c5c9aabcfa92b8497ea9d71ca551fd721e827fcb8f91ff9fbbee6bba8f8cb2dea185701b8798878b4b2435c1496b63d4b4a37c624a625299 Python-2.7.4.tgz' > Python-2.7.4.tgz.sha512
+echo 'd6580eb170b36ad50f3a30023fe6ca60234156af91ccb3971b0b0983119b86f3a9f6c717a515c3c6cb72b3dcbf1d02695c6d0b92745f460b46a3defd3ff6ef2f Python-2.7.5.tgz' > Python-2.7.5.tgz.sha512
+echo '172f2bc671145ebb0add2669c117863db35851fb3bdb192006cd710d4d038e0037497eb39a6d01091cb923f71a7e8982a77b6e80bf71d6275d5d83a363c8d7e5 rockstar-0.99.6.tar.gz' > rockstar-0.99.6.tar.gz.sha512
+echo '276bd9c061ec9a27d478b33078a86f93164ee2da72210e12e2c9da71dcffeb64767e4460b93f257302b09328eda8655e93c4b9ae85e74472869afbeae35ca71e blas.tar.gz' > blas.tar.gz.sha512
echo '00ace5438cfa0c577e5f578d8a808613187eff5217c35164ffe044fbafdfec9e98f4192c02a7d67e01e5a5ccced630583ad1003c37697219b0f147343a3fdd12 bzip2-1.0.6.tar.gz' > bzip2-1.0.6.tar.gz.sha512
echo 'a296dfcaef7e853e58eed4e24b37c4fa29cfc6ac688def048480f4bb384b9e37ca447faf96eec7b378fd764ba291713f03ac464581d62275e28eb2ec99110ab6 reason-js-20120623.zip' > reason-js-20120623.zip.sha512
-echo 'b46c93d76f8ce09c94765b20b2eeadf71207671f1131777de178b3727c235b4dd77f6e60d62442b96648c3c6749e9e4c1194c1b02af7e946576be09e1ff7ada3 freetype-2.4.11.tar.gz' > freetype-2.4.11.tar.gz.sha512
-echo '15ca0209e8d8f172cb0708a2de946fbbde8551d9bebc4a95fa7ae31558457a7f43249d5289d7675490c577deb4e0153698fd2407644078bf30bd5ab10135fce3 h5py-2.1.2.tar.gz' > h5py-2.1.2.tar.gz.sha512
-echo 'c68a425bacaa7441037910b9166f25b89e1387776a7749a5350793f89b1690350df5f018060c31d03686e7c3ed2aa848bd2b945c96350dc3b6322e087934783a hdf5-1.8.9.tar.gz' > hdf5-1.8.9.tar.gz.sha512
-echo 'b2b53ed358bacab9e8d63a51f17bd5f121ece60a1d7c53e8a8eb08ad8b1e4393a8d7a86eec06e2efc62348114f0d84c0a3dfc805e68e6edd93b20401962b3554 libpng-1.6.1.tar.gz' > libpng-1.6.1.tar.gz.sha512
-echo '497f91725eaf361bdb9bdf38db2bff5068a77038f1536df193db64c9b887e3b0d967486daee722eda6e2c4e60f034eee030673e53d07bf0db0f3f7c0ef3bd208 matplotlib-1.2.1.tar.gz' > matplotlib-1.2.1.tar.gz.sha512
-echo '928fdeaaf0eaec80adbd8765521de9666ab56aaa2101fb9ab2cb392d8b29475d3b052d89652ff9b67522cfcc6cd958717ac715f51b0573ee088e9a595f29afe2 mercurial-2.5.4.tar.gz' > mercurial-2.5.4.tar.gz.sha512
-echo 'a485daa556f6c76003de1dbb3e42b3daeee0a320c69c81b31a7d2ebbc2cf8ab8e96c214a4758e5e7bf814295dc1d6aa563092b714db7e719678d8462135861a8 numpy-1.7.0.tar.gz' > numpy-1.7.0.tar.gz.sha512
-echo '293d78d14a9347cb83e1a644e5f3e4447ed6fc21642c51683e5495dda08d2312194a73d1fc3c1d78287e33ed065aa251ecbaa7c0ea9189456c1702e96d78becd sqlite-autoconf-3071601.tar.gz' > sqlite-autoconf-3071601.tar.gz.sha512
-echo 'b1c073ad26684e354f7c522c14655840592e03872bc0a94690f89cae2ff88f146fce1dad252ff27a889dac4a32ff9f8ab63ba940671f9da89e9ba3e19f1bf58d zlib-1.2.7.tar.gz' > zlib-1.2.7.tar.gz.sha512
-echo '05ac335727a2c3036f31a2506fdd2615aa436bfbe2f81799fe6c51bffe2591ad6a8427f3b25c34e7e709fb4e7607a0589dc7a22185c1f9b894e90de6711a88aa ipython-0.13.1.tar.gz' > ipython-0.13.1.tar.gz.sha512
-echo 'b9d061ca49e54ea917e0aed2b2a48faef33061dbf6d17eae7f8c3fff0b35ca883e7324f6cb24bda542443f669dcd5748037a5f2309f4c359d68adef520894865 zeromq-3.2.2.tar.gz' > zeromq-3.2.2.tar.gz.sha512
-echo '852fce8a8308c4e1e4b19c77add2b2055ca2ba570b28e8364888df490af92b860c72e860adfb075b3405a9ceb62f343889f20a8711c9353a7d9059adee910f83 pyzmq-13.0.2.tar.gz' > pyzmq-13.0.2.tar.gz.sha512
-echo '303bd3fbea22be57fddf7df78ddf5a783d355a0c8071b1363250daafc20232ddd28eedc44aa1194f4a7afd82f9396628c5bb06819e02b065b6a1b1ae8a7c19e1 tornado-3.0.tar.gz' > tornado-3.0.tar.gz.sha512
-echo '3f53d0b474bfd79fea2536d0a9197eaef6c0927e95f2f9fd52dbd6c1d46409d0e649c21ac418d8f7767a9f10fe6114b516e06f2be4b06aec3ab5bdebc8768220 Forthon-0.8.11.tar.gz' > Forthon-0.8.11.tar.gz.sha512
-echo 'c13116c1f0547000cc565e15774687b9e884f8b74fb62a84e578408a868a84961704839065ae4f21b662e87f2aaedf6ea424ea58dfa9d3d73c06281f806d15dd nose-1.2.1.tar.gz' > nose-1.2.1.tar.gz.sha512
-echo 'd67de9567256e6f1649e4f3f7dfee63371d5f00fd3fd4f92426198f862e97c57f70e827d19f4e5e1929ad85ef2ce7aa5a0596b101cafdac71672e97dc115b397 python-hglib-0.3.tar.gz' > python-hglib-0.3.tar.gz.sha512
-echo 'ffc602eb346717286b3d0a6770c60b03b578b3cf70ebd12f9e8b1c8c39cdb12ef219ddaa041d7929351a6b02dbb8caf1821b5452d95aae95034cbf4bc9904a7a sympy-0.7.2.tar.gz' > sympy-0.7.2.tar.gz.sha512
+echo '609a68a3675087e0cc95268574f31e104549daa48efe15a25a33b8e269a93b4bd160f4c3e8178dca9c950ef5ca514b039d6fd1b45db6af57f25342464d0429ce freetype-2.4.12.tar.gz' > freetype-2.4.12.tar.gz.sha512
+echo '2eb7030f8559ff5cb06333223d98fda5b3a663b6f4a026949d1c423aa9a869d824e612ed5e1851f3bf830d645eea1a768414f73731c23ab4d406da26014fe202 h5py-2.1.3.tar.gz' > h5py-2.1.3.tar.gz.sha512
+echo 'e9db26baa297c8ed10f1ca4a3fcb12d6985c6542e34c18d48b2022db73014f054c8b8434f3df70dcf44631f38b016e8050701d52744953d0fced3272d7b6b3c1 hdf5-1.8.11.tar.gz' > hdf5-1.8.11.tar.gz.sha512
+echo '1b309c08009583e66d1725a2d2051e6de934db246129568fa6d5ba33ad6babd3b443e7c2782d817128d2b112e21bcdd71e66be34fbd528badd900f1d0ed3db56 ipython-1.0.0.tar.gz' > ipython-1.0.0.tar.gz.sha512
+echo '8770214491e31f0a7a3efaade90eee7b0eb20a8a6ab635c5f854d78263f59a1849133c14ef5123d01023f0110cbb9fc6f818da053c01277914ae81473430a952 lapack-3.4.2.tar.gz' > lapack-3.4.2.tar.gz.sha512
+echo '887582e5a22e4cde338aa8fec7a89f6dd31f2f02b8842735f00f970f64582333fa03401cea6d01704083403c7e8b7ebc26655468ce930165673b33efa4bcd586 libpng-1.6.3.tar.gz' > libpng-1.6.3.tar.gz.sha512
+echo '990e3a155ca7a9d329c41a43b44a9625f717205e81157c668a8f3f2ad5459ed3fed8c9bd85e7f81c509e0628d2192a262d4aa30c8bfc348bb67ed60a0362505a matplotlib-1.3.0.tar.gz' > matplotlib-1.3.0.tar.gz.sha512
+echo 'e425778edb0f71c34e719e04561ee3de37feaa1be4d60b94c780aebdbe6d41f8f4ab15103a8bbe8894ebeb228c42f0e2cd41b8db840f8384e1cd7cd2d5b67b97 mercurial-2.7.tar.gz' > mercurial-2.7.tar.gz.sha512
+echo 'a3b8060e415560a868599224449a3af636d24a060f1381990b175dcd12f30249edd181179d23aea06b0c755ff3dc821b7a15ed8840f7855530479587d4d814f4 nose-1.3.0.tar.gz' > nose-1.3.0.tar.gz.sha512
+echo 'd58177f3971b6d07baf6f81a2088ba371c7e43ea64ee7ada261da97c6d725b4bd4927122ac373c55383254e4e31691939276dab08a79a238bfa55172a3eff684 numpy-1.7.1.tar.gz' > numpy-1.7.1.tar.gz.sha512
+echo '9c0a61299779aff613131aaabbc255c8648f0fa7ab1806af53f19fbdcece0c8a68ddca7880d25b926d67ff1b9201954b207919fb09f6a290acb078e8bbed7b68 python-hglib-1.0.tar.gz' > python-hglib-1.0.tar.gz.sha512
+echo 'c65013293dd4049af5db009fdf7b6890a3c6b1e12dd588b58fb5f5a5fef7286935851fb7a530e03ea16f28de48b964e50f48bbf87d34545fd23b80dd4380476b pyzmq-13.1.0.tar.gz' > pyzmq-13.1.0.tar.gz.sha512
echo '172f2bc671145ebb0add2669c117863db35851fb3bdb192006cd710d4d038e0037497eb39a6d01091cb923f71a7e8982a77b6e80bf71d6275d5d83a363c8d7e5 rockstar-0.99.6.tar.gz' > rockstar-0.99.6.tar.gz.sha512
-echo 'd4fdd62f2db5285cd133649bd1bfa5175cb9da8304323abd74e0ef1207d55e6152f0f944da1da75f73e9dafb0f3bb14efba3c0526c732c348a653e0bd223ccfa scipy-0.11.0.tar.gz' > scipy-0.11.0.tar.gz.sha512
-echo '276bd9c061ec9a27d478b33078a86f93164ee2da72210e12e2c9da71dcffeb64767e4460b93f257302b09328eda8655e93c4b9ae85e74472869afbeae35ca71e blas.tar.gz' > blas.tar.gz.sha512
-echo '8770214491e31f0a7a3efaade90eee7b0eb20a8a6ab635c5f854d78263f59a1849133c14ef5123d01023f0110cbb9fc6f818da053c01277914ae81473430a952 lapack-3.4.2.tar.gz' > lapack-3.4.2.tar.gz.sha512
+echo '80c8e137c3ccba86575d4263e144ba2c4684b94b5cd620e200f094c92d4e118ea6a631d27bdb259b0869771dfaeeae68c0fdd37fdd740b9027ee185026e921d4 scipy-0.12.0.tar.gz' > scipy-0.12.0.tar.gz.sha512
+echo '96f3e51b46741450bc6b63779c10ebb4a7066860fe544385d64d1eda52592e376a589ef282ace2e1df73df61c10eab1a0d793abbdaf770e60289494d4bf3bcb4 sqlite-autoconf-3071700.tar.gz' > sqlite-autoconf-3071700.tar.gz.sha512
+echo '2992baa3edfb4e1842fb642abf0bf0fc0bf56fc183aab8fed6b3c42fbea928fa110ede7fdddea2d63fc5953e8d304b04da433dc811134fadefb1eecc326121b8 sympy-0.7.3.tar.gz' > sympy-0.7.3.tar.gz.sha512
+echo '101544db6c97beeadc5a02b2ef79edefa0a07e129840ace2e4aa451f3976002a273606bcdc12d6cef5c22ff4c1c9dcf60abccfdee4cbef8e3f957cd25c0430cf tornado-3.1.tar.gz' > tornado-3.1.tar.gz.sha512
+echo '34ffb6aa645f62bd1158a8f2888bf92929ccf90917a6c50ed51ed1240732f498522e164d1536f26480c87ad5457fe614a93bf0e15f2f89b0b168e64a30de68ca zeromq-3.2.3.tar.gz' > zeromq-3.2.3.tar.gz.sha512
+echo 'ece209d4c7ec0cb58ede791444dc754e0d10811cbbdebe3df61c0fd9f9f9867c1c3ccd5f1827f847c005e24eef34fb5bf87b5d3f894d75da04f1797538290e4a zlib-1.2.8.tar.gz' > zlib-1.2.8.tar.gz.sha512
# Individual processes
-[ -z "$HDF5_DIR" ] && get_ytproject hdf5-1.8.9.tar.gz
-[ $INST_ZLIB -eq 1 ] && get_ytproject zlib-1.2.7.tar.gz
-[ $INST_BZLIB -eq 1 ] && get_ytproject bzip2-1.0.6.tar.gz
-[ $INST_PNG -eq 1 ] && get_ytproject libpng-1.6.1.tar.gz
-[ $INST_FTYPE -eq 1 ] && get_ytproject freetype-2.4.11.tar.gz
-[ $INST_SQLITE3 -eq 1 ] && get_ytproject sqlite-autoconf-3071601.tar.gz
-[ $INST_PYX -eq 1 ] && get_ytproject PyX-0.12.1.tar.gz
-[ $INST_0MQ -eq 1 ] && get_ytproject zeromq-3.2.2.tar.gz
-[ $INST_0MQ -eq 1 ] && get_ytproject pyzmq-13.0.2.tar.gz
-[ $INST_0MQ -eq 1 ] && get_ytproject tornado-3.0.tar.gz
-[ $INST_SCIPY -eq 1 ] && get_ytproject scipy-0.11.0.tar.gz
+[ -z "$HDF5_DIR" ] && get_ytproject $HDF5.tar.gz
+[ $INST_ZLIB -eq 1 ] && get_ytproject $ZLIB.tar.gz
+[ $INST_BZLIB -eq 1 ] && get_ytproject $BZLIB.tar.gz
+[ $INST_PNG -eq 1 ] && get_ytproject $PNG.tar.gz
+[ $INST_FTYPE -eq 1 ] && get_ytproject $FREETYPE_VER.tar.gz
+[ $INST_SQLITE3 -eq 1 ] && get_ytproject $SQLITE.tar.gz
+[ $INST_PYX -eq 1 ] && get_ytproject $PYX.tar.gz
+[ $INST_0MQ -eq 1 ] && get_ytproject $ZEROMQ.tar.gz
+[ $INST_0MQ -eq 1 ] && get_ytproject $PYZMQ.tar.gz
+[ $INST_0MQ -eq 1 ] && get_ytproject $TORNADO.tar.gz
+[ $INST_SCIPY -eq 1 ] && get_ytproject $SCIPY.tar.gz
[ $INST_SCIPY -eq 1 ] && get_ytproject blas.tar.gz
-[ $INST_SCIPY -eq 1 ] && get_ytproject lapack-3.4.2.tar.gz
-get_ytproject Python-2.7.4.tgz
-get_ytproject numpy-1.7.0.tar.gz
-get_ytproject matplotlib-1.2.1.tar.gz
-get_ytproject mercurial-2.5.4.tar.gz
-get_ytproject ipython-0.13.1.tar.gz
-get_ytproject h5py-2.1.2.tar.gz
-get_ytproject Cython-0.18.tar.gz
+[ $INST_SCIPY -eq 1 ] && get_ytproject $LAPACK.tar.gz
+get_ytproject $PYTHON.tgz
+get_ytproject $NUMPY.tar.gz
+get_ytproject $MATPLOTLIB.tar.gz
+get_ytproject $MERCURIAL.tar.gz
+get_ytproject $IPYTHON.tar.gz
+get_ytproject $H5PY.tar.gz
+get_ytproject $CYTHON.tar.gz
get_ytproject reason-js-20120623.zip
-get_ytproject Forthon-0.8.11.tar.gz
-get_ytproject nose-1.2.1.tar.gz
-get_ytproject python-hglib-0.3.tar.gz
-get_ytproject sympy-0.7.2.tar.gz
-get_ytproject rockstar-0.99.6.tar.gz
+get_ytproject $FORTHON.tar.gz
+get_ytproject $NOSE.tar.gz
+get_ytproject $PYTHON_HGLIB.tar.gz
+get_ytproject $SYMPY.tar.gz
+get_ytproject $ROCKSTAR.tar.gz
if [ $INST_BZLIB -eq 1 ]
then
- if [ ! -e bzip2-1.0.6/done ]
+ if [ ! -e $BZLIB/done ]
then
- [ ! -e bzip2-1.0.6 ] && tar xfz bzip2-1.0.6.tar.gz
+ [ ! -e $BZLIB ] && tar xfz $BZLIB.tar.gz
echo "Installing BZLIB"
- cd bzip2-1.0.6
+ cd $BZLIB
if [ `uname` = "Darwin" ]
then
if [ -z "${CC}" ]
@@ -634,11 +667,11 @@
if [ $INST_ZLIB -eq 1 ]
then
- if [ ! -e zlib-1.2.7/done ]
+ if [ ! -e $ZLIB/done ]
then
- [ ! -e zlib-1.2.7 ] && tar xfz zlib-1.2.7.tar.gz
+ [ ! -e $ZLIB ] && tar xfz $ZLIB.tar.gz
echo "Installing ZLIB"
- cd zlib-1.2.7
+ cd $ZLIB
( ./configure --shared --prefix=${DEST_DIR}/ 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make install 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make clean 2>&1) 1>> ${LOG_FILE} || do_exit
@@ -652,11 +685,11 @@
if [ $INST_PNG -eq 1 ]
then
- if [ ! -e libpng-1.6.1/done ]
+ if [ ! -e $PNG/done ]
then
- [ ! -e libpng-1.6.1 ] && tar xfz libpng-1.6.1.tar.gz
+ [ ! -e $PNG ] && tar xfz $PNG.tar.gz
echo "Installing PNG"
- cd libpng-1.6.1
+ cd $PNG
( ./configure CPPFLAGS=-I${DEST_DIR}/include CFLAGS=-I${DEST_DIR}/include --prefix=${DEST_DIR}/ 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make install 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make clean 2>&1) 1>> ${LOG_FILE} || do_exit
@@ -670,13 +703,14 @@
if [ $INST_FTYPE -eq 1 ]
then
- if [ ! -e freetype-2.4.11/done ]
+ if [ ! -e $FREETYPE_VER/done ]
then
- [ ! -e freetype-2.4.11 ] && tar xfz freetype-2.4.11.tar.gz
+ [ ! -e $FREETYPE_VER ] && tar xfz $FREETYPE_VER.tar.gz
echo "Installing FreeType2"
- cd freetype-2.4.11
+ cd $FREETYPE_VER
( ./configure CFLAGS=-I${DEST_DIR}/include --prefix=${DEST_DIR}/ 2>&1 ) 1>> ${LOG_FILE} || do_exit
- ( make install 2>&1 ) 1>> ${LOG_FILE} || do_exit
+ ( make 2>&1 ) 1>> ${LOG_FILE} || do_exit
+ ( make install 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make clean 2>&1) 1>> ${LOG_FILE} || do_exit
touch done
cd ..
@@ -688,11 +722,11 @@
if [ -z "$HDF5_DIR" ]
then
- if [ ! -e hdf5-1.8.9/done ]
+ if [ ! -e $HDF5/done ]
then
- [ ! -e hdf5-1.8.9 ] && tar xfz hdf5-1.8.9.tar.gz
+ [ ! -e $HDF5 ] && tar xfz $HDF5.tar.gz
echo "Installing HDF5"
- cd hdf5-1.8.9
+ cd $HDF5
( ./configure --prefix=${DEST_DIR}/ --enable-shared 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make ${MAKE_PROCS} install 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make clean 2>&1) 1>> ${LOG_FILE} || do_exit
@@ -707,11 +741,11 @@
if [ $INST_SQLITE3 -eq 1 ]
then
- if [ ! -e sqlite-autoconf-3071601/done ]
+ if [ ! -e $SQLITE/done ]
then
- [ ! -e sqlite-autoconf-3071601 ] && tar xfz sqlite-autoconf-3071601.tar.gz
+ [ ! -e $SQLITE ] && tar xfz $SQLITE.tar.gz
echo "Installing SQLite3"
- cd sqlite-autoconf-3071601
+ cd $SQLITE
( ./configure --prefix=${DEST_DIR}/ 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make ${MAKE_PROCS} install 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make clean 2>&1) 1>> ${LOG_FILE} || do_exit
@@ -720,11 +754,11 @@
fi
fi
-if [ ! -e Python-2.7.4/done ]
+if [ ! -e $PYTHON/done ]
then
echo "Installing Python. This may take a while, but don't worry. yt loves you."
- [ ! -e Python-2.7.4 ] && tar xfz Python-2.7.4.tgz
- cd Python-2.7.4
+ [ ! -e $PYTHON ] && tar xfz $PYTHON.tgz
+ cd $PYTHON
( ./configure --prefix=${DEST_DIR}/ ${PYCONF_ARGS} 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make ${MAKE_PROCS} 2>&1 ) 1>> ${LOG_FILE} || do_exit
@@ -739,7 +773,7 @@
if [ $INST_HG -eq 1 ]
then
- do_setup_py mercurial-2.5.4
+ do_setup_py $MERCURIAL
export HG_EXEC=${DEST_DIR}/bin/hg
else
# We assume that hg can be found in the path.
@@ -788,9 +822,9 @@
if [ $INST_SCIPY -eq 0 ]
then
- do_setup_py numpy-1.7.0 ${NUMPY_ARGS}
+ do_setup_py $NUMPY ${NUMPY_ARGS}
else
- if [ ! -e scipy-0.11.0/done ]
+ if [ ! -e $SCIPY/done ]
then
if [ ! -e BLAS/done ]
then
@@ -798,27 +832,27 @@
echo "Building BLAS"
cd BLAS
gfortran -O2 -fPIC -fno-second-underscore -c *.f
- ar r libfblas.a *.o 1>> ${LOG_FILE}
- ranlib libfblas.a 1>> ${LOG_FILE}
+ ( ar r libfblas.a *.o 2>&1 ) 1>> ${LOG_FILE}
+ ( ranlib libfblas.a 2>&1 ) 1>> ${LOG_FILE}
rm -rf *.o
touch done
cd ..
fi
- if [ ! -e lapack-3.4.2/done ]
+ if [ ! -e $LAPACK/done ]
then
- tar xfz lapack-3.4.2.tar.gz
+ tar xfz $LAPACK.tar.gz
echo "Building LAPACK"
- cd lapack-3.4.2/
+ cd $LAPACK/
cp INSTALL/make.inc.gfortran make.inc
- make lapacklib OPTS="-fPIC -O2" NOOPT="-fPIC -O0" CFLAGS=-fPIC LDFLAGS=-fPIC 1>> ${LOG_FILE} || do_exit
+ ( make lapacklib OPTS="-fPIC -O2" NOOPT="-fPIC -O0" CFLAGS=-fPIC LDFLAGS=-fPIC 2>&1 ) 1>> ${LOG_FILE} || do_exit
touch done
cd ..
fi
fi
export BLAS=$PWD/BLAS/libfblas.a
- export LAPACK=$PWD/lapack-3.4.2/liblapack.a
- do_setup_py numpy-1.7.0 ${NUMPY_ARGS}
- do_setup_py scipy-0.11.0 ${NUMPY_ARGS}
+ export LAPACK=$PWD/$LAPACK/liblapack.a
+ do_setup_py $NUMPY ${NUMPY_ARGS}
+ do_setup_py $SCIPY ${NUMPY_ARGS}
fi
if [ -n "${MPL_SUPP_LDFLAGS}" ]
@@ -840,10 +874,10 @@
echo "Setting CFLAGS ${CFLAGS}"
fi
# Now we set up the basedir for matplotlib:
-mkdir -p ${DEST_DIR}/src/matplotlib-1.2.1
-echo "[directories]" >> ${DEST_DIR}/src/matplotlib-1.2.1/setup.cfg
-echo "basedirlist = ${DEST_DIR}" >> ${DEST_DIR}/src/matplotlib-1.2.1/setup.cfg
-do_setup_py matplotlib-1.2.1
+mkdir -p ${DEST_DIR}/src/$MATPLOTLIB
+echo "[directories]" >> ${DEST_DIR}/src/$MATPLOTLIB/setup.cfg
+echo "basedirlist = ${DEST_DIR}" >> ${DEST_DIR}/src/$MATPLOTLIB/setup.cfg
+do_setup_py $MATPLOTLIB
if [ -n "${OLD_LDFLAGS}" ]
then
export LDFLAG=${OLD_LDFLAGS}
@@ -855,36 +889,36 @@
# Now we do our IPython installation, which has two optional dependencies.
if [ $INST_0MQ -eq 1 ]
then
- if [ ! -e zeromq-3.2.2/done ]
+ if [ ! -e $ZEROMQ/done ]
then
- [ ! -e zeromq-3.2.2 ] && tar xfz zeromq-3.2.2.tar.gz
+ [ ! -e $ZEROMQ ] && tar xfz $ZEROMQ.tar.gz
echo "Installing ZeroMQ"
- cd zeromq-3.2.2
+ cd $ZEROMQ
( ./configure --prefix=${DEST_DIR}/ 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make install 2>&1 ) 1>> ${LOG_FILE} || do_exit
( make clean 2>&1) 1>> ${LOG_FILE} || do_exit
touch done
cd ..
fi
- do_setup_py pyzmq-13.0.2 --zmq=${DEST_DIR}
- do_setup_py tornado-3.0
+ do_setup_py $PYZMQ --zmq=${DEST_DIR}
+ do_setup_py $TORNADO
fi
-do_setup_py ipython-0.13.1
-do_setup_py h5py-2.1.2
-do_setup_py Cython-0.18
-do_setup_py Forthon-0.8.11
-do_setup_py nose-1.2.1
-do_setup_py python-hglib-0.3
-do_setup_py sympy-0.7.2
-[ $INST_PYX -eq 1 ] && do_setup_py PyX-0.12.1
+do_setup_py $IPYTHON
+do_setup_py $H5PY
+do_setup_py $CYTHON
+do_setup_py $FORTHON
+do_setup_py $NOSE
+do_setup_py $PYTHON_HGLIB
+do_setup_py $SYMPY
+[ $INST_PYX -eq 1 ] && do_setup_py $PYX
# Now we build Rockstar and set its environment variable.
if [ $INST_ROCKSTAR -eq 1 ]
then
if [ ! -e Rockstar/done ]
then
- [ ! -e Rockstar ] && tar xfz rockstar-0.99.6.tar.gz
+ [ ! -e Rockstar ] && tar xfz $ROCKSTAR.tar.gz
echo "Building Rockstar"
cd Rockstar
( make lib 2>&1 ) 1>> ${LOG_FILE} || do_exit
@@ -909,10 +943,10 @@
touch done
cd $MY_PWD
-if !(${DEST_DIR}/bin/python2.7 -c "import readline" >> ${LOG_FILE})
+if !( ( ${DEST_DIR}/bin/python2.7 -c "import readline" 2>&1 )>> ${LOG_FILE})
then
echo "Installing pure-python readline"
- ${DEST_DIR}/bin/pip install readline 1>> ${LOG_FILE}
+ ( ${DEST_DIR}/bin/pip install readline 2>&1 ) 1>> ${LOG_FILE}
fi
if [ $INST_ENZO -eq 1 ]
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/analysis_modules/halo_finding/halo_objects.py
--- a/yt/analysis_modules/halo_finding/halo_objects.py
+++ b/yt/analysis_modules/halo_finding/halo_objects.py
@@ -1062,8 +1062,9 @@
def __init__(self, data_source, dm_only=True, redshift=-1):
"""
Run hop on *data_source* with a given density *threshold*. If
- *dm_only* is True (default), only run it on the dark matter particles, otherwise
- on all particles. Returns an iterable collection of *HopGroup* items.
+ *dm_only* is True (default), only run it on the dark matter particles,
+ otherwise on all particles. Returns an iterable collection of
+ *HopGroup* items.
"""
self._data_source = data_source
self.dm_only = dm_only
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/config.py
--- a/yt/config.py
+++ b/yt/config.py
@@ -62,7 +62,7 @@
notebook_password = '',
answer_testing_tolerance = '3',
answer_testing_bitwise = 'False',
- gold_standard_filename = 'gold009',
+ gold_standard_filename = 'gold010',
local_standard_filename = 'local001',
sketchfab_api_key = 'None',
thread_field_detection = 'False'
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/data_objects/api.py
--- a/yt/data_objects/api.py
+++ b/yt/data_objects/api.py
@@ -89,3 +89,6 @@
from particle_trajectories import \
ParticleTrajectoryCollection
+
+from particle_filters import \
+ particle_filter
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/data_objects/particle_fields.py
--- a/yt/data_objects/particle_fields.py
+++ b/yt/data_objects/particle_fields.py
@@ -45,6 +45,7 @@
def _AllFields(field, data):
v = []
for ptype in data.pf.particle_types:
+ data.pf._last_freq = (ptype, None)
if ptype == "all" or \
ptype in data.pf.known_filters:
continue
@@ -57,6 +58,7 @@
def _AllFields(field, data):
v = []
for ptype in data.pf.particle_types:
+ data.pf._last_freq = (ptype, None)
if ptype == "all" or \
ptype in data.pf.known_filters:
continue
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/data_objects/tests/test_cutting_plane.py
--- a/yt/data_objects/tests/test_cutting_plane.py
+++ b/yt/data_objects/tests/test_cutting_plane.py
@@ -1,5 +1,6 @@
from yt.testing import *
import os
+import tempfile
def setup():
from yt.config import ytcfg
@@ -7,7 +8,10 @@
def teardown_func(fns):
for fn in fns:
- os.remove(fn)
+ try:
+ os.remove(fn)
+ except OSError:
+ pass
def test_cutting_plane():
for nprocs in [8, 1]:
@@ -23,7 +27,9 @@
yield assert_equal, cut["Ones"].min(), 1.0
yield assert_equal, cut["Ones"].max(), 1.0
pw = cut.to_pw()
- fns += pw.save()
+ tmpfd, tmpname = tempfile.mkstemp(suffix='.png')
+ os.close(tmpfd)
+ fns += pw.save(name=tmpname)
frb = cut.to_frb((1.0,'unitary'), 64)
for cut_field in ['Ones', 'Density']:
yield assert_equal, frb[cut_field].info['data_source'], \
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/data_objects/tests/test_image_array.py
--- a/yt/data_objects/tests/test_image_array.py
+++ b/yt/data_objects/tests/test_image_array.py
@@ -1,130 +1,94 @@
-from yt.testing import *
-from yt.data_objects.image_array import ImageArray
import numpy as np
import os
import tempfile
import shutil
+import unittest
+from yt.data_objects.image_array import ImageArray
+from yt.testing import \
+ assert_equal
+
def setup():
from yt.config import ytcfg
- ytcfg["yt","__withintesting"] = "True"
- np.seterr(all = 'ignore')
+ ytcfg["yt", "__withintesting"] = "True"
+ np.seterr(all='ignore')
+
+
+def dummy_image(kstep, nlayers):
+ im = np.zeros([64, 128, nlayers])
+ for i in xrange(im.shape[0]):
+ for k in xrange(im.shape[2]):
+ im[i, :, k] = np.linspace(0.0, kstep * k, im.shape[1])
+ return im
+
def test_rgba_rescale():
- im = np.zeros([64,128,4])
- for i in xrange(im.shape[0]):
- for k in xrange(im.shape[2]):
- im[i,:,k] = np.linspace(0.,10.*k, im.shape[1])
- im_arr = ImageArray(im)
+ im_arr = ImageArray(dummy_image(10.0, 4))
new_im = im_arr.rescale(inline=False)
- yield assert_equal, im_arr[:,:,:3].max(), 2*10.
- yield assert_equal, im_arr[:,:,3].max(), 3*10.
- yield assert_equal, new_im[:,:,:3].sum(axis=2).max(), 1.0
- yield assert_equal, new_im[:,:,3].max(), 1.0
+ yield assert_equal, im_arr[:, :, :3].max(), 2 * 10.
+ yield assert_equal, im_arr[:, :, 3].max(), 3 * 10.
+ yield assert_equal, new_im[:, :, :3].sum(axis=2).max(), 1.0
+ yield assert_equal, new_im[:, :, 3].max(), 1.0
im_arr.rescale()
- yield assert_equal, im_arr[:,:,:3].sum(axis=2).max(), 1.0
- yield assert_equal, im_arr[:,:,3].max(), 1.0
+ yield assert_equal, im_arr[:, :, :3].sum(axis=2).max(), 1.0
+ yield assert_equal, im_arr[:, :, 3].max(), 1.0
-def test_image_array_hdf5():
- # Perform I/O in safe place instead of yt main dir
- tmpdir = tempfile.mkdtemp()
- curdir = os.getcwd()
- os.chdir(tmpdir)
- im = np.zeros([64,128,3])
- for i in xrange(im.shape[0]):
- for k in xrange(im.shape[2]):
- im[i,:,k] = np.linspace(0.,0.3*k, im.shape[1])
+class TestImageArray(unittest.TestCase):
- myinfo = {'field':'dinosaurs', 'east_vector':np.array([1.,0.,0.]),
- 'north_vector':np.array([0.,0.,1.]), 'normal_vector':np.array([0.,1.,0.]),
- 'width':0.245, 'units':'cm', 'type':'rendering'}
+ tmpdir = None
+ curdir = None
- im_arr = ImageArray(im, info=myinfo)
- im_arr.save('test_3d_ImageArray')
+ def setUp(self):
+ self.tmpdir = tempfile.mkdtemp()
+ self.curdir = os.getcwd()
+ os.chdir(self.tmpdir)
- im = np.zeros([64,128])
- for i in xrange(im.shape[0]):
- im[i,:] = np.linspace(0.,0.3*k, im.shape[1])
+ def test_image_array_hdf5(self):
+ myinfo = {'field': 'dinosaurs', 'east_vector': np.array([1., 0., 0.]),
+ 'north_vector': np.array([0., 0., 1.]),
+ 'normal_vector': np.array([0., 1., 0.]),
+ 'width': 0.245, 'units': 'cm', 'type': 'rendering'}
- myinfo = {'field':'dinosaurs', 'east_vector':np.array([1.,0.,0.]),
- 'north_vector':np.array([0.,0.,1.]), 'normal_vector':np.array([0.,1.,0.]),
- 'width':0.245, 'units':'cm', 'type':'rendering'}
+ im_arr = ImageArray(dummy_image(0.3, 3), info=myinfo)
+ im_arr.save('test_3d_ImageArray')
- im_arr = ImageArray(im, info=myinfo)
- im_arr.save('test_2d_ImageArray')
+ im = np.zeros([64, 128])
+ for i in xrange(im.shape[0]):
+ im[i, :] = np.linspace(0., 0.3 * 2, im.shape[1])
- os.chdir(curdir)
- # clean up
- shutil.rmtree(tmpdir)
+ myinfo = {'field': 'dinosaurs', 'east_vector': np.array([1., 0., 0.]),
+ 'north_vector': np.array([0., 0., 1.]),
+ 'normal_vector': np.array([0., 1., 0.]),
+ 'width': 0.245, 'units': 'cm', 'type': 'rendering'}
-def test_image_array_rgb_png():
- # Perform I/O in safe place instead of yt main dir
- tmpdir = tempfile.mkdtemp()
- curdir = os.getcwd()
- os.chdir(tmpdir)
+ im_arr = ImageArray(im, info=myinfo)
+ im_arr.save('test_2d_ImageArray')
- im = np.zeros([64,128,3])
- for i in xrange(im.shape[0]):
- for k in xrange(im.shape[2]):
- im[i,:,k] = np.linspace(0.,10.*k, im.shape[1])
+ def test_image_array_rgb_png(self):
+ im_arr = ImageArray(dummy_image(10.0, 3))
+ im_arr.write_png('standard.png')
- im_arr = ImageArray(im)
- im_arr.write_png('standard.png')
+ def test_image_array_rgba_png(self):
+ im_arr = ImageArray(dummy_image(10.0, 4))
+ im_arr.write_png('standard.png')
+ im_arr.write_png('non-scaled.png', rescale=False)
+ im_arr.write_png('black_bg.png', background='black')
+ im_arr.write_png('white_bg.png', background='white')
+ im_arr.write_png('green_bg.png', background=[0., 1., 0., 1.])
+ im_arr.write_png('transparent_bg.png', background=None)
-def test_image_array_rgba_png():
- # Perform I/O in safe place instead of yt main dir
- tmpdir = tempfile.mkdtemp()
- curdir = os.getcwd()
- os.chdir(tmpdir)
+ def test_image_array_background(self):
+ im_arr = ImageArray(dummy_image(10.0, 4))
+ im_arr.rescale()
+ new_im = im_arr.add_background_color([1., 0., 0., 1.], inline=False)
+ new_im.write_png('red_bg.png')
+ im_arr.add_background_color('black')
+ im_arr.write_png('black_bg2.png')
- im = np.zeros([64,128,4])
- for i in xrange(im.shape[0]):
- for k in xrange(im.shape[2]):
- im[i,:,k] = np.linspace(0.,10.*k, im.shape[1])
-
- im_arr = ImageArray(im)
- im_arr.write_png('standard.png')
- im_arr.write_png('non-scaled.png', rescale=False)
- im_arr.write_png('black_bg.png', background='black')
- im_arr.write_png('white_bg.png', background='white')
- im_arr.write_png('green_bg.png', background=[0.,1.,0.,1.])
- im_arr.write_png('transparent_bg.png', background=None)
-
-
-def test_image_array_background():
- # Perform I/O in safe place instead of yt main dir
- tmpdir = tempfile.mkdtemp()
- curdir = os.getcwd()
- os.chdir(tmpdir)
-
- im = np.zeros([64,128,4])
- for i in xrange(im.shape[0]):
- for k in xrange(im.shape[2]):
- im[i,:,k] = np.linspace(0.,10.*k, im.shape[1])
-
- im_arr = ImageArray(im)
- im_arr.rescale()
- new_im = im_arr.add_background_color([1.,0.,0.,1.], inline=False)
- new_im.write_png('red_bg.png')
- im_arr.add_background_color('black')
- im_arr.write_png('black_bg2.png')
-
- os.chdir(curdir)
- # clean up
- shutil.rmtree(tmpdir)
-
-
-
-
-
-
-
-
-
-
-
-
-
+ def tearDown(self):
+ os.chdir(self.curdir)
+ # clean up
+ shutil.rmtree(self.tmpdir)
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/data_objects/tests/test_projection.py
--- a/yt/data_objects/tests/test_projection.py
+++ b/yt/data_objects/tests/test_projection.py
@@ -1,5 +1,6 @@
from yt.testing import *
import os
+import tempfile
def setup():
from yt.config import ytcfg
@@ -7,7 +8,10 @@
def teardown_func(fns):
for fn in fns:
- os.remove(fn)
+ try:
+ os.remove(fn)
+ except OSError:
+ pass
def test_projection():
for nprocs in [8, 1]:
@@ -37,7 +41,9 @@
yield assert_equal, np.unique(proj["pdx"]), 1.0/(dims[xax]*2.0)
yield assert_equal, np.unique(proj["pdy"]), 1.0/(dims[yax]*2.0)
pw = proj.to_pw()
- fns += pw.save()
+ tmpfd, tmpname = tempfile.mkstemp(suffix='.png')
+ os.close(tmpfd)
+ fns += pw.save(name=tmpname)
frb = proj.to_frb((1.0,'unitary'), 64)
for proj_field in ['Ones', 'Density']:
yield assert_equal, frb[proj_field].info['data_source'], \
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/data_objects/tests/test_slice.py
--- a/yt/data_objects/tests/test_slice.py
+++ b/yt/data_objects/tests/test_slice.py
@@ -27,6 +27,7 @@
"""
import os
import numpy as np
+import tempfile
from nose.tools import raises
from yt.testing import \
fake_random_pf, assert_equal, assert_array_equal
@@ -42,7 +43,10 @@
def teardown_func(fns):
for fn in fns:
- os.remove(fn)
+ try:
+ os.remove(fn)
+ except OSError:
+ pass
def test_slice():
@@ -72,7 +76,9 @@
yield assert_equal, np.unique(slc["pdx"]), 0.5 / dims[xax]
yield assert_equal, np.unique(slc["pdy"]), 0.5 / dims[yax]
pw = slc.to_pw()
- fns += pw.save()
+ tmpfd, tmpname = tempfile.mkstemp(suffix='.png')
+ os.close(tmpfd)
+ fns += pw.save(name=tmpname)
frb = slc.to_frb((1.0, 'unitary'), 64)
for slc_field in ['Ones', 'Density']:
yield assert_equal, frb[slc_field].info['data_source'], \
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/extern/__init__.py
--- /dev/null
+++ b/yt/extern/__init__.py
@@ -0,0 +1,4 @@
+"""
+This packages contains python packages that are bundled with yt
+and are developed by 3rd party upstream.
+"""
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/extern/parameterized.py
--- /dev/null
+++ b/yt/extern/parameterized.py
@@ -0,0 +1,226 @@
+import re
+import inspect
+from functools import wraps
+from collections import namedtuple
+
+from nose.tools import nottest
+from unittest import TestCase
+
+from . import six
+
+if six.PY3:
+ def new_instancemethod(f, *args):
+ return f
+else:
+ import new
+ new_instancemethod = new.instancemethod
+
+_param = namedtuple("param", "args kwargs")
+
+class param(_param):
+ """ Represents a single parameter to a test case.
+
+ For example::
+
+ >>> p = param("foo", bar=16)
+ >>> p
+ param("foo", bar=16)
+ >>> p.args
+ ('foo', )
+ >>> p.kwargs
+ {'bar': 16}
+
+ Intended to be used as an argument to ``@parameterized``::
+
+ @parameterized([
+ param("foo", bar=16),
+ ])
+ def test_stuff(foo, bar=16):
+ pass
+ """
+
+ def __new__(cls, *args , **kwargs):
+ return _param.__new__(cls, args, kwargs)
+
+ @classmethod
+ def explicit(cls, args=None, kwargs=None):
+ """ Creates a ``param`` by explicitly specifying ``args`` and
+ ``kwargs``::
+
+ >>> param.explicit([1,2,3])
+ param(*(1, 2, 3))
+ >>> param.explicit(kwargs={"foo": 42})
+ param(*(), **{"foo": "42"})
+ """
+ args = args or ()
+ kwargs = kwargs or {}
+ return cls(*args, **kwargs)
+
+ @classmethod
+ def from_decorator(cls, args):
+ """ Returns an instance of ``param()`` for ``@parameterized`` argument
+ ``args``::
+
+ >>> param.from_decorator((42, ))
+ param(args=(42, ), kwargs={})
+ >>> param.from_decorator("foo")
+ param(args=("foo", ), kwargs={})
+ """
+ if isinstance(args, param):
+ return args
+ if isinstance(args, six.string_types):
+ args = (args, )
+ return cls(*args)
+
+ def __repr__(self):
+ return "param(*%r, **%r)" %self
+
+class parameterized(object):
+ """ Parameterize a test case::
+
+ class TestInt(object):
+ @parameterized([
+ ("A", 10),
+ ("F", 15),
+ param("10", 42, base=42)
+ ])
+ def test_int(self, input, expected, base=16):
+ actual = int(input, base=base)
+ assert_equal(actual, expected)
+
+ @parameterized([
+ (2, 3, 5)
+ (3, 5, 8),
+ ])
+ def test_add(a, b, expected):
+ assert_equal(a + b, expected)
+ """
+
+ def __init__(self, input):
+ self.get_input = self.input_as_callable(input)
+
+ def __call__(self, test_func):
+ self.assert_not_in_testcase_subclass()
+
+ @wraps(test_func)
+ def parameterized_helper_method(test_self=None):
+ f = test_func
+ if test_self is not None:
+ # If we are a test method (which we suppose to be true if we
+ # are being passed a "self" argument), we first need to create
+ # an instance method, attach it to the instance of the test
+ # class, then pull it back off to turn it into a bound method.
+ # If we don't do this, Nose gets cranky.
+ f = self.make_bound_method(test_self, test_func)
+ # Note: because nose is so very picky, the more obvious
+ # ``return self.yield_nose_tuples(f)`` won't work here.
+ for nose_tuple in self.yield_nose_tuples(f):
+ yield nose_tuple
+
+ test_func.__name__ = "_helper_for_%s" %(test_func.__name__, )
+ parameterized_helper_method.parameterized_input = input
+ parameterized_helper_method.parameterized_func = test_func
+ return parameterized_helper_method
+
+ def yield_nose_tuples(self, func):
+ for args in self.get_input():
+ p = param.from_decorator(args)
+ # ... then yield that as a tuple. If those steps aren't
+ # followed precicely, Nose gets upset and doesn't run the test
+ # or doesn't run setup methods.
+ yield self.param_as_nose_tuple(p, func)
+
+ def param_as_nose_tuple(self, p, func):
+ nose_func = func
+ nose_args = p.args
+ if p.kwargs:
+ nose_func = wraps(func)(lambda args, kwargs: func(*args, **kwargs))
+ nose_args = (p.args, p.kwargs)
+ return (nose_func, ) + nose_args
+
+ def make_bound_method(self, instance, func):
+ cls = type(instance)
+ im_f = new_instancemethod(func, None, cls)
+ setattr(cls, func.__name__, im_f)
+ return getattr(instance, func.__name__)
+
+ def assert_not_in_testcase_subclass(self):
+ parent_classes = self._terrible_magic_get_defining_classes()
+ if any(issubclass(cls, TestCase) for cls in parent_classes):
+ raise Exception("Warning: '@parameterized' tests won't work "
+ "inside subclasses of 'TestCase' - use "
+ "'@parameterized.expand' instead")
+
+ def _terrible_magic_get_defining_classes(self):
+ """ Returns the set of parent classes of the class currently being defined.
+ Will likely only work if called from the ``parameterized`` decorator.
+ This function is entirely @brandon_rhodes's fault, as he suggested
+ the implementation: http://stackoverflow.com/a/8793684/71522
+ """
+ stack = inspect.stack()
+ if len(stack) <= 4:
+ return []
+ frame = stack[4]
+ code_context = frame[4] and frame[4][0].strip()
+ if not (code_context and code_context.startswith("class ")):
+ return []
+ _, parents = code_context.split("(", 1)
+ parents, _ = parents.rsplit(")", 1)
+ return eval("[" + parents + "]", frame[0].f_globals, frame[0].f_locals)
+
+ @classmethod
+ def input_as_callable(cls, input):
+ if callable(input):
+ return lambda: cls.check_input_values(input())
+ input_values = cls.check_input_values(input)
+ return lambda: input_values
+
+ @classmethod
+ def check_input_values(cls, input_values):
+ if not hasattr(input_values, "__iter__"):
+ raise ValueError("expected iterable input; got %r" %(input, ))
+ return input_values
+
+ @classmethod
+ def expand(cls, input):
+ """ A "brute force" method of parameterizing test cases. Creates new
+ test cases and injects them into the namespace that the wrapped
+ function is being defined in. Useful for parameterizing tests in
+ subclasses of 'UnitTest', where Nose test generators don't work.
+
+ >>> @parameterized.expand([("foo", 1, 2)])
+ ... def test_add1(name, input, expected):
+ ... actual = add1(input)
+ ... assert_equal(actual, expected)
+ ...
+ >>> locals()
+ ... 'test_add1_foo_0': <function ...> ...
+ >>>
+ """
+
+ def parameterized_expand_wrapper(f):
+ stack = inspect.stack()
+ frame = stack[1]
+ frame_locals = frame[0].f_locals
+
+ base_name = f.__name__
+ get_input = cls.input_as_callable(input)
+ for num, args in enumerate(get_input()):
+ p = param.from_decorator(args)
+ name_suffix = "_%s" %(num, )
+ if len(p.args) > 0 and isinstance(p.args[0], six.string_types):
+ name_suffix += "_" + cls.to_safe_name(p.args[0])
+ name = base_name + name_suffix
+ frame_locals[name] = cls.param_as_standalone_func(p, f, name)
+ return nottest(f)
+ return parameterized_expand_wrapper
+
+ @classmethod
+ def param_as_standalone_func(cls, p, func, name):
+ standalone_func = lambda *a: func(*(a + p.args), **p.kwargs)
+ standalone_func.__name__ = name
+ return standalone_func
+
+ @classmethod
+ def to_safe_name(cls, s):
+ return str(re.sub("[^a-zA-Z0-9_]", "", s))
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/extern/six.py
--- /dev/null
+++ b/yt/extern/six.py
@@ -0,0 +1,404 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+# Copyright (c) 2010-2013 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy of
+# this software and associated documentation files (the "Software"), to deal in
+# the Software without restriction, including without limitation the rights to
+# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+# the Software, and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin at python.org>"
+__version__ = "1.3.0"
+
+
+# True if we are running on Python 3.
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+ string_types = str,
+ integer_types = int,
+ class_types = type,
+ text_type = str
+ binary_type = bytes
+
+ MAXSIZE = sys.maxsize
+else:
+ string_types = basestring,
+ integer_types = (int, long)
+ class_types = (type, types.ClassType)
+ text_type = unicode
+ binary_type = str
+
+ if sys.platform.startswith("java"):
+ # Jython always uses 32 bits.
+ MAXSIZE = int((1 << 31) - 1)
+ else:
+ # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+ class X(object):
+ def __len__(self):
+ return 1 << 31
+ try:
+ len(X())
+ except OverflowError:
+ # 32-bit
+ MAXSIZE = int((1 << 31) - 1)
+ else:
+ # 64-bit
+ MAXSIZE = int((1 << 63) - 1)
+ del X
+
+
+def _add_doc(func, doc):
+ """Add documentation to a function."""
+ func.__doc__ = doc
+
+
+def _import_module(name):
+ """Import module, returning the module after the last dot."""
+ __import__(name)
+ return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+ def __init__(self, name):
+ self.name = name
+
+ def __get__(self, obj, tp):
+ result = self._resolve()
+ setattr(obj, self.name, result)
+ # This is a bit ugly, but it avoids running this again.
+ delattr(tp, self.name)
+ return result
+
+
+class MovedModule(_LazyDescr):
+
+ def __init__(self, name, old, new=None):
+ super(MovedModule, self).__init__(name)
+ if PY3:
+ if new is None:
+ new = name
+ self.mod = new
+ else:
+ self.mod = old
+
+ def _resolve(self):
+ return _import_module(self.mod)
+
+
+class MovedAttribute(_LazyDescr):
+
+ def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+ super(MovedAttribute, self).__init__(name)
+ if PY3:
+ if new_mod is None:
+ new_mod = name
+ self.mod = new_mod
+ if new_attr is None:
+ if old_attr is None:
+ new_attr = name
+ else:
+ new_attr = old_attr
+ self.attr = new_attr
+ else:
+ self.mod = old_mod
+ if old_attr is None:
+ old_attr = name
+ self.attr = old_attr
+
+ def _resolve(self):
+ module = _import_module(self.mod)
+ return getattr(module, self.attr)
+
+
+
+class _MovedItems(types.ModuleType):
+ """Lazy loading of moved objects"""
+
+
+_moved_attributes = [
+ MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+ MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+ MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+ MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+ MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
+ MovedAttribute("reduce", "__builtin__", "functools"),
+ MovedAttribute("StringIO", "StringIO", "io"),
+ MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+ MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+
+ MovedModule("builtins", "__builtin__"),
+ MovedModule("configparser", "ConfigParser"),
+ MovedModule("copyreg", "copy_reg"),
+ MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+ MovedModule("http_cookies", "Cookie", "http.cookies"),
+ MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+ MovedModule("html_parser", "HTMLParser", "html.parser"),
+ MovedModule("http_client", "httplib", "http.client"),
+ MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+ MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+ MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+ MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+ MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+ MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+ MovedModule("cPickle", "cPickle", "pickle"),
+ MovedModule("queue", "Queue"),
+ MovedModule("reprlib", "repr"),
+ MovedModule("socketserver", "SocketServer"),
+ MovedModule("tkinter", "Tkinter"),
+ MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+ MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+ MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+ MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+ MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+ MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+ MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+ MovedModule("tkinter_colorchooser", "tkColorChooser",
+ "tkinter.colorchooser"),
+ MovedModule("tkinter_commondialog", "tkCommonDialog",
+ "tkinter.commondialog"),
+ MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+ MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+ MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+ MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+ "tkinter.simpledialog"),
+ MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+ MovedModule("winreg", "_winreg"),
+]
+for attr in _moved_attributes:
+ setattr(_MovedItems, attr.name, attr)
+del attr
+
+moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves")
+
+
+def add_move(move):
+ """Add an item to six.moves."""
+ setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+ """Remove item from six.moves."""
+ try:
+ delattr(_MovedItems, name)
+ except AttributeError:
+ try:
+ del moves.__dict__[name]
+ except KeyError:
+ raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+ _meth_func = "__func__"
+ _meth_self = "__self__"
+
+ _func_closure = "__closure__"
+ _func_code = "__code__"
+ _func_defaults = "__defaults__"
+ _func_globals = "__globals__"
+
+ _iterkeys = "keys"
+ _itervalues = "values"
+ _iteritems = "items"
+ _iterlists = "lists"
+else:
+ _meth_func = "im_func"
+ _meth_self = "im_self"
+
+ _func_closure = "func_closure"
+ _func_code = "func_code"
+ _func_defaults = "func_defaults"
+ _func_globals = "func_globals"
+
+ _iterkeys = "iterkeys"
+ _itervalues = "itervalues"
+ _iteritems = "iteritems"
+ _iterlists = "iterlists"
+
+
+try:
+ advance_iterator = next
+except NameError:
+ def advance_iterator(it):
+ return it.next()
+next = advance_iterator
+
+
+try:
+ callable = callable
+except NameError:
+ def callable(obj):
+ return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+ def get_unbound_function(unbound):
+ return unbound
+
+ Iterator = object
+else:
+ def get_unbound_function(unbound):
+ return unbound.im_func
+
+ class Iterator(object):
+
+ def next(self):
+ return type(self).__next__(self)
+
+ callable = callable
+_add_doc(get_unbound_function,
+ """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+def iterkeys(d, **kw):
+ """Return an iterator over the keys of a dictionary."""
+ return iter(getattr(d, _iterkeys)(**kw))
+
+def itervalues(d, **kw):
+ """Return an iterator over the values of a dictionary."""
+ return iter(getattr(d, _itervalues)(**kw))
+
+def iteritems(d, **kw):
+ """Return an iterator over the (key, value) pairs of a dictionary."""
+ return iter(getattr(d, _iteritems)(**kw))
+
+def iterlists(d, **kw):
+ """Return an iterator over the (key, [values]) pairs of a dictionary."""
+ return iter(getattr(d, _iterlists)(**kw))
+
+
+if PY3:
+ def b(s):
+ return s.encode("latin-1")
+ def u(s):
+ return s
+ if sys.version_info[1] <= 1:
+ def int2byte(i):
+ return bytes((i,))
+ else:
+ # This is about 2x faster than the implementation above on 3.2+
+ int2byte = operator.methodcaller("to_bytes", 1, "big")
+ import io
+ StringIO = io.StringIO
+ BytesIO = io.BytesIO
+else:
+ def b(s):
+ return s
+ def u(s):
+ return unicode(s, "unicode_escape")
+ int2byte = chr
+ import StringIO
+ StringIO = BytesIO = StringIO.StringIO
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+if PY3:
+ import builtins
+ exec_ = getattr(builtins, "exec")
+
+
+ def reraise(tp, value, tb=None):
+ if value.__traceback__ is not tb:
+ raise value.with_traceback(tb)
+ raise value
+
+
+ print_ = getattr(builtins, "print")
+ del builtins
+
+else:
+ def exec_(_code_, _globs_=None, _locs_=None):
+ """Execute code in a namespace."""
+ if _globs_ is None:
+ frame = sys._getframe(1)
+ _globs_ = frame.f_globals
+ if _locs_ is None:
+ _locs_ = frame.f_locals
+ del frame
+ elif _locs_ is None:
+ _locs_ = _globs_
+ exec("""exec _code_ in _globs_, _locs_""")
+
+
+ exec_("""def reraise(tp, value, tb=None):
+ raise tp, value, tb
+""")
+
+
+ def print_(*args, **kwargs):
+ """The new-style print function."""
+ fp = kwargs.pop("file", sys.stdout)
+ if fp is None:
+ return
+ def write(data):
+ if not isinstance(data, basestring):
+ data = str(data)
+ fp.write(data)
+ want_unicode = False
+ sep = kwargs.pop("sep", None)
+ if sep is not None:
+ if isinstance(sep, unicode):
+ want_unicode = True
+ elif not isinstance(sep, str):
+ raise TypeError("sep must be None or a string")
+ end = kwargs.pop("end", None)
+ if end is not None:
+ if isinstance(end, unicode):
+ want_unicode = True
+ elif not isinstance(end, str):
+ raise TypeError("end must be None or a string")
+ if kwargs:
+ raise TypeError("invalid keyword arguments to print()")
+ if not want_unicode:
+ for arg in args:
+ if isinstance(arg, unicode):
+ want_unicode = True
+ break
+ if want_unicode:
+ newline = unicode("\n")
+ space = unicode(" ")
+ else:
+ newline = "\n"
+ space = " "
+ if sep is None:
+ sep = space
+ if end is None:
+ end = newline
+ for i, arg in enumerate(args):
+ if i:
+ write(sep)
+ write(arg)
+ write(end)
+
+_add_doc(reraise, """Reraise an exception.""")
+
+
+def with_metaclass(meta, base=object):
+ """Create a base class with a metaclass."""
+ return meta("NewBase", (base,), {})
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -1,3 +1,4 @@
+#cython: profile=True
"""
"""
@@ -134,7 +135,7 @@
# common attributes
cdef public int num_grid
- cdef int64_t num_root_cells
+ cdef public int64_t num_root_cells
cdef int64_t sfc_min, sfc_max
# grid attributes
@@ -606,126 +607,118 @@
def _initialize_root_mesh(self):
# We actually will not be initializing the root mesh here, we will be
# initializing the entire mesh between sfc_start and sfc_end.
- cdef np.int64_t oct_ind, sfc, nadded, tot_octs, ipos
- cdef np.uint8_t bits
- cdef int status
+ cdef np.int64_t oct_ind, sfc, tot_octs, ipos
+ cdef int i, status, level, num_oct_levels, num_root, num_octs
+ cdef int num_level_octs
cdef artio_fileset_handle *handle = self.artio_handle.handle
- cdef double dpos[3]
cdef int coords[3]
- cdef int num_oct_levels, level, i, j
cdef int max_level = self.artio_handle.max_level
+ cdef double *dpos
+ cdef double rpos[3]
+ cdef int *olevel
cdef int *num_octs_per_level = <int *>malloc(
(max_level + 1)*sizeof(int))
- cdef np.int64_t *tot_octs_per_level = <np.int64_t *>malloc(
- (max_level + 1)*sizeof(np.int64_t))
self.level_indices = <np.int64_t *>malloc(
(max_level + 1)*sizeof(np.int64_t))
- for level in range(max_level + 1):
- tot_octs_per_level[level] = 0
- status = artio_grid_cache_sfc_range(handle,
- self.sfc_start, self.sfc_end )
- check_artio_status(status)
- # Now we iterate and create them, level by level.
- # Note that we are doing a bit of magic to figure out how many root
- # nodes we will need at most
- cdef int nmask = self.nn[0] * self.nn[1] * self.nn[2] / 8
- cdef np.uint8_t *mask = <np.uint8_t *> malloc(
- self.nn[0] * self.nn[1] * self.nn[2]) # one bit for each one
- for i in range(nmask): mask[i] = 0
- for sfc in range(self.sfc_start, self.sfc_end + 1):
- status = artio_grid_read_root_cell_begin( handle, sfc,
- dpos, NULL, &num_oct_levels, num_octs_per_level )
- check_artio_status(status)
- artio_sfc_coords(handle, sfc, coords)
- # Now we mask that bit
- for i in range(3):
- coords[i] = <int> (coords[i]/2)
- ipos = ((coords[0]*self.nn[1])+coords[1])*self.nn[2]+coords[2]
- bits = ipos % 8
- mask[ <int> (ipos/8) ] |= (1 << bits)
- for level in range(1, num_oct_levels+1):
- # Now we are simply counting so we can pre-allocate arrays.
- # Because the grids have all been cached this should be fine.
- tot_octs_per_level[level] += num_octs_per_level[level-1]
- status = artio_grid_read_root_cell_end( handle )
- check_artio_status(status)
- cdef np.int64_t num_root = 0
- for i in range(nmask):
- for j in range(8):
- num_root += ((mask[i] >> j) & 1)
- tot_octs_per_level[0] = num_root
- cdef np.int64_t tot = 0
- for i in range(max_level + 1):
- self.level_indices[i] = tot
- tot += tot_octs_per_level[i]
- self.allocate_domains([num_root, tot - num_root], num_root)
- # Now we have everything counted, and we need to create the appropriate
- # number of arrays.
- cdef np.ndarray[np.float64_t, ndim=2] pos
- pos = np.empty((tot, 3), dtype="float64")
- # We do a special case for level 0
+ for i in range(max_level+1):
+ self.level_indices[i] = 0
cdef np.float64_t dds[3]
for i in range(3):
dds[i] = (self.DRE[i] - self.DLE[i])/self.nn[i]
+
+ status = artio_grid_cache_sfc_range(handle, 0, self.artio_handle.num_root_cells-1)
+ check_artio_status(status)
+ #status = artio_grid_cache_sfc_range(handle,
+ # self.sfc_start, self.sfc_end )
+ #check_artio_status(status)
+
+ # compute total octs in sfc range (not including root level)
+ status = artio_grid_count_octs_in_sfc_range(handle,self.sfc_start,self.sfc_end,&tot_octs)
+ check_artio_status(status)
+
+ # now determine the number of root octs we touch
+ root_octs = {}
for sfc in range(self.sfc_start, self.sfc_end + 1):
- status = artio_grid_read_root_cell_begin( handle, sfc,
- dpos, NULL, &num_oct_levels, num_octs_per_level)
- check_artio_status(status)
artio_sfc_coords(handle, sfc, coords)
- # Now we check if we have added yet or not
for i in range(3):
coords[i] = <int> (coords[i]/2)
- ipos = ((coords[0]*self.nn[1])+coords[1])*self.nn[2]+coords[2]
- bits = ipos % 8
- if ((mask[<int>(ipos/8)] >> bits) & 1) == 1:
- # We add it here
+ ipos = (coords[0]*self.nn[1]+coords[1])*self.nn[2]+coords[2]
+ root_octs[ipos] = 1
+ num_root = len(root_octs)
+
+ self.allocate_domains([num_root, tot_octs], num_root)
+ pos = np.empty((num_root, 3), dtype="float64")
+
+ for sfc in range(self.sfc_start, self.sfc_end + 1):
+ artio_sfc_coords(handle, sfc, coords)
+ for i in range(3):
+ coords[i] = <int> (coords[i]/2)
+ ipos = (coords[0]*self.nn[1]+coords[1])*self.nn[2]+coords[2]
+ if root_octs[ipos] == 1:
for i in range(3):
- dpos[i] = self.DLE[i] + (coords[i]+0.5)*dds[i]
- pos[self.level_indices[0], i] = dpos[i]
- mask[<int>(ipos/8)] -= (1 << bits)
+ pos[self.level_indices[0], i] = \
+ self.DLE[i] + (coords[i]+0.5)*dds[i]
self.level_indices[0] += 1
- # Now we iterate over all the children
- for level in range(1, num_oct_levels+1):
- status = artio_grid_read_level_begin(handle, level)
- check_artio_status(status)
- for oct_ind in range(num_octs_per_level[level - 1]):
- status = artio_grid_read_oct(handle, dpos, NULL, NULL)
+ root_octs[ipos] = 0
+ del root_octs
+
+ # add all root octs
+ self.add(1, 0, pos)
+ del pos
+
+ # now scan through grid file to load oct positions
+ if tot_octs > 0:
+ dpos = <double *>malloc(3*tot_octs*sizeof(double))
+ olevel = <int *>malloc(tot_octs*sizeof(int))
+
+ num_octs = 0
+ for sfc in range(self.sfc_start, self.sfc_end + 1):
+ status = artio_grid_read_root_cell_begin( handle, sfc,
+ rpos, NULL, &num_oct_levels, num_octs_per_level)
+ check_artio_status(status)
+ for level in range(1, num_oct_levels+1):
+ self.level_indices[level] += num_octs_per_level[level - 1]
+ status = artio_grid_read_level_begin(handle, level)
check_artio_status(status)
- for i in range(3):
- pos[self.level_indices[level], i] = dpos[i]
- self.level_indices[level] += 1
- status = artio_grid_read_level_end(handle)
+ for oct_ind in range(num_octs_per_level[level - 1]):
+ status = artio_grid_read_oct(handle, &dpos[3*num_octs], NULL, NULL)
+ check_artio_status(status)
+ olevel[num_octs] = level
+ num_octs += 1
+ status = artio_grid_read_level_end(handle)
+ check_artio_status(status)
+ status = artio_grid_read_root_cell_end(handle)
check_artio_status(status)
- status = artio_grid_read_root_cell_end( handle )
- check_artio_status(status)
- nadded = 0
- cdef np.int64_t si, ei
- si = 0
- # We initialize domain to 1 so that all root mesh octs are viewed as
- # not belonging to this domain. This way we don't get confused with
- # how the different meshes are interfaced, and the root mesh container
- # will own all the root mesh octs. Then, for all octs at higher
- # levels, we use domain == 2.
- cdef int domain = 1
+
+ num_level_octs = 0
+ for level in range(1, max_level+1):
+ if self.level_indices[level] > num_level_octs:
+ num_level_octs = self.level_indices[level]
+ pos = np.empty((num_level_octs, 3), dtype="float64")
+ for level in range(1, max_level+1):
+ if self.level_indices[level] == 0: continue
+ num_level_octs = 0
+ for oct_ind in range(num_octs):
+ if olevel[oct_ind] == level:
+ for i in range(3):
+ pos[num_level_octs,i] = dpos[3*oct_ind+i]
+ num_level_octs += 1
+ assert(num_level_octs == self.level_indices[level])
+ num_level_octs = self.add( 2, level, pos[:num_level_octs, :])
+ if num_level_octs != self.level_indices[level]:
+ print self.sfc_start, self.sfc_end
+ print level, self.level_indices[level], num_level_octs
+ raise RuntimeError
+
+ free(olevel)
+ free(dpos)
+ free(num_octs_per_level)
+
+ num_octs = 0
for level in range(max_level + 1):
- self.level_indices[level] = si
- ei = si + tot_octs_per_level[level]
- if tot_octs_per_level[level] == 0: break
- nadded = self.add(domain, level, pos[si:ei, :])
- if level > 0 and nadded != (ei - si):
- print domain, self.sfc_start, self.sfc_end
- print level, nadded, ei, si, self.max_root,
- print self.level_indices[level]
- print pos[si:ei,:]
- print nadded, (ei - si), tot_octs_per_level[0]
- raise RuntimeError
- si = ei
- domain = 2
- #status = artio_grid_clear_sfc_cache(handle)
- #check_artio_status(status)
- free(mask)
- free(num_octs_per_level)
- free(tot_octs_per_level)
+ num_level_octs = self.level_indices[level]
+ self.level_indices[level] = num_octs
+ num_octs += num_level_octs
@cython.boundscheck(False)
@cython.wraparound(False)
@@ -770,8 +763,9 @@
field_vals[i] = <np.float32_t*> source.data
# First we need to walk the mesh in the file. Then we fill in the dest
# location based on the file index.
- status = artio_grid_cache_sfc_range(handle,
- self.sfc_start, self.sfc_end )
+ #status = artio_grid_cache_sfc_range(handle,
+ # self.sfc_start, self.sfc_end )
+ status = artio_grid_cache_sfc_range(handle,0,self.artio_handle.num_root_cells-1)
check_artio_status(status)
for sfc in range(self.sfc_start, self.sfc_end + 1):
status = artio_grid_read_root_cell_begin( handle, sfc,
@@ -995,12 +989,16 @@
cdef artio_fileset_handle *handle
cdef np.uint64_t sfc_start
cdef np.uint64_t sfc_end
+ cdef public object _last_mask
+ cdef public object _last_selector_id
def __init__(self, domain_dimensions, # cells
domain_left_edge,
domain_right_edge,
artio_fileset artio_handle,
sfc_start, sfc_end):
+ self._last_selector_id = None
+ self._last_mask = None
self.artio_handle = artio_handle
self.handle = artio_handle.handle
cdef int i
@@ -1012,6 +1010,7 @@
self.sfc_start = sfc_start
self.sfc_end = sfc_end
+ @cython.cdivision(True)
cdef np.int64_t pos_to_sfc(self, np.float64_t pos[3]) nogil:
# Calculate the index
cdef int coords[3], i
@@ -1021,6 +1020,7 @@
sfc = artio_sfc_index(self.handle, coords)
return sfc
+ @cython.cdivision(True)
cdef void sfc_to_pos(self, np.int64_t sfc, np.float64_t pos[3]) nogil:
cdef int coords[3], i
artio_sfc_coords(self.handle, sfc, coords)
@@ -1030,8 +1030,6 @@
cdef np.int64_t count_cells(self, SelectorObject selector):
# We visit each cell if it is not refined and determine whether it is
# included or not.
- # DHR - selector was used to construct the initial sfc list, so
- # this should always equal the number of root cells
cdef np.int64_t sfc
cdef np.float64_t pos[3], right_edge[3]
cdef int num_cells = 0
@@ -1106,6 +1104,9 @@
res = np.zeros(num_octs, dtype="int64")
return res
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
def selector_fill(self, SelectorObject selector,
np.ndarray source,
np.ndarray dest = None,
@@ -1150,30 +1151,46 @@
return dest
return filled
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
def mask(self, SelectorObject selector, np.int64_t num_octs = -1):
+ if self._last_selector_id == hash(selector):
+ return self._last_mask
+ else:
+ return self.mask2(selector,num_octs)
+
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
+ def mask2(self, SelectorObject selector, np.int64_t num_octs = -1):
cdef int i, status
cdef double dpos[3]
cdef np.float64_t pos[3]
+ cdef np.int64_t sfc
+ if self._last_selector_id == hash(selector):
+ return self._last_mask
if num_octs == -1:
# We need to count, but this process will only occur one time,
# since num_octs will later be cached.
num_octs = self.sfc_end - self.sfc_start + 1
- assert(num_octs == (self.sfc_end - self.sfc_start + 1))
+ #assert(num_octs == (self.sfc_end - self.sfc_start + 1))
cdef np.ndarray[np.uint8_t, ndim=1] mask
cdef int num_oct_levels
cdef int max_level = self.artio_handle.max_level
cdef int *num_octs_per_level = <int *>malloc(
(max_level + 1)*sizeof(int))
mask = np.zeros((num_octs), dtype="uint8")
- status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
- self.sfc_end)
+ #status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
+ # self.sfc_end)
+ status = artio_grid_cache_sfc_range(self.handle,0,self.artio_handle.num_root_cells-1)
check_artio_status(status)
for sfc in range(self.sfc_start, self.sfc_end + 1):
# We check if the SFC is in our selector, and if so, we copy
# Note that because we initialize to zeros, we can just continue if
# it's not included.
- self.sfc_to_pos(sfc, pos)
- if selector.select_cell(pos, self.dds) == 0: continue
+ #self.sfc_to_pos(sfc, pos)
+ #if selector.select_cell(pos, self.dds) == 0: continue
# Now we just need to check if the cells are refined.
status = artio_grid_read_root_cell_begin( self.handle,
sfc, dpos, NULL, &num_oct_levels, num_octs_per_level)
@@ -1182,11 +1199,17 @@
check_artio_status(status)
# If refined, we skip
if num_oct_levels > 0: continue
+ # check selector
+ for i in range(3):
+ pos[i] = dpos[i]
+ if selector.select_cell(pos, self.dds) == 0: continue
mask[sfc - self.sfc_start] = 1
#status = artio_grid_clear_sfc_cache(self.handle)
#check_artio_status(status)
free(num_octs_per_level)
- return mask.astype("bool")
+ self._last_mask = mask.astype("bool")
+ self._last_selector_id = hash(selector)
+ return self._last_mask
def fill_sfc_particles(self, fields):
rv = read_sfc_particles(self.artio_handle,
@@ -1228,8 +1251,9 @@
# First we need to walk the mesh in the file. Then we fill in the dest
# location based on the file index.
cdef int filled = 0
- status = artio_grid_cache_sfc_range(handle,
- self.sfc_start, self.sfc_end )
+ #status = artio_grid_cache_sfc_range(handle,
+ # self.sfc_start, self.sfc_end )
+ status = artio_grid_cache_sfc_range(handle,0,self.artio_handle.num_root_cells-1)
check_artio_status(status)
for sfc in range(self.sfc_start, self.sfc_end + 1):
if mask[sfc - self.sfc_start] == 0: continue
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -374,7 +374,7 @@
def _chunk_all(self, dobj):
oobjs = getattr(dobj._current_chunk, "objs", dobj._chunk_info)
- yield YTDataChunk(dobj, "all", oobjs, None)
+ yield YTDataChunk(dobj, "all", oobjs, None, cache = True)
def _chunk_spatial(self, dobj, ngz):
if ngz > 0:
@@ -386,7 +386,7 @@
g = og.retrieve_ghost_zones(ngz, [], smoothed=True)
else:
g = og
- yield YTDataChunk(dobj, "spatial", [g], None)
+ yield YTDataChunk(dobj, "spatial", [g], None, cache = True)
def _chunk_io(self, dobj, cache = True):
# _current_chunk is made from identify_base_chunk
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/frontends/athena/io.py
--- a/yt/frontends/athena/io.py
+++ b/yt/frontends/athena/io.py
@@ -68,9 +68,9 @@
data = data[2::3].reshape(grid_dims,order='F').copy()
f.close()
if grid.pf.field_ordering == 1:
- return data.T
+ return data.T.astype("float64")
else:
- return data
+ return data.astype("float64")
def _read_data_slice(self, grid, field, axis, coord):
sl = [slice(None), slice(None), slice(None)]
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/frontends/flash/data_structures.py
--- a/yt/frontends/flash/data_structures.py
+++ b/yt/frontends/flash/data_structures.py
@@ -444,6 +444,12 @@
mylog.warning('Identical domain left edge and right edges '
'along dummy dimension (%i), attempting to read anyway' % d)
self.domain_right_edge[d] = self.domain_left_edge[d]+1.0
+ if self.dimensionality < 3 and self.geometry == "cylindrical":
+ mylog.warning("Extending theta dimension to 2PI + left edge.")
+ self.domain_right_edge[2] = self.domain_left_edge[2] + 2*np.pi
+ elif self.dimensionality < 3 and self.geometry == "polar":
+ mylog.warning("Extending theta dimension to 2PI + left edge.")
+ self.domain_right_edge[1] = self.domain_left_edge[1] + 2*np.pi
self.domain_dimensions = \
np.array([nblockx*nxb,nblocky*nyb,nblockz*nzb])
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/frontends/flash/io.py
--- a/yt/frontends/flash/io.py
+++ b/yt/frontends/flash/io.py
@@ -82,7 +82,9 @@
rv = {}
for field in fields:
ftype, fname = field
- rv[field] = np.empty(size, dtype=f["/%s" % fname].dtype)
+ dt = f["/%s" % fname].dtype
+ if dt == "float32": dt = "float64"
+ rv[field] = np.empty(size, dtype=dt)
ng = sum(len(c.objs) for c in chunks)
mylog.debug("Reading %s cells of %s fields in %s blocks",
size, [f2 for f1, f2 in fields], ng)
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/frontends/gdf/data_structures.py
--- a/yt/frontends/gdf/data_structures.py
+++ b/yt/frontends/gdf/data_structures.py
@@ -224,7 +224,10 @@
else:
self.units[field_name] = 1.0
if 'field_units' in current_field.attrs:
- current_fields_unit = just_one(current_field.attrs['field_units'])
+ if type(current_field.attrs['field_units']) == str:
+ current_fields_unit = current_field.attrs['field_units']
+ else:
+ current_fields_unit = just_one(current_field.attrs['field_units'])
else:
current_fields_unit = ""
self._fieldinfo_known.add_field(field_name, function=NullFunc, take_log=False,
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/frontends/gdf/fields.py
--- a/yt/frontends/gdf/fields.py
+++ b/yt/frontends/gdf/fields.py
@@ -84,8 +84,11 @@
units=r"\rm{cm}/\rm{s}")
for f,v in log_translation_dict.items():
- add_field(f, TranslationFunc(v), take_log=True)
+ add_field(f, TranslationFunc(v), take_log=True,
+ units=KnownGDFFields[v].get_units(),
+ projected_units=KnownGDFFields[v].get_projected_units())
for f,v in translation_dict.items():
- add_field(f, TranslationFunc(v), take_log=False)
-
+ add_field(f, TranslationFunc(v), take_log=False,
+ units=KnownGDFFields[v].get_units(),
+ projected_units=KnownGDFFields[v].get_projected_units())
diff -r 4c2653d013ab9a47ea280c51fa13d16d4c77145f -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 yt/frontends/sph/data_structures.py
--- a/yt/frontends/sph/data_structures.py
+++ b/yt/frontends/sph/data_structures.py
@@ -112,9 +112,9 @@
if self.cosmological_simulation:
for unit in mpc_conversion:
mpch['%sh' % unit] = mpch[unit] * self.hubble_constant
- mpch['%shcm' % unit] = (mpch["%sh" % unit] /
+ mpch['%shcm' % unit] = (mpch["%sh" % unit] *
(1 + self.current_redshift))
- mpch['%scm' % unit] = mpch[unit] / (1 + self.current_redshift)
+ mpch['%scm' % unit] = mpch[unit] * (1 + self.current_redshift)
# ud == unit destination
# ur == unit registry
for ud, ur in [(self.units, mpch), (self.time_units, sec_conversion)]:
This diff is so big that we needed to truncate the remainder.
https://bitbucket.org/yt_analysis/yt-3.0/commits/829c7ab5fcfa/
Changeset: 829c7ab5fcfa
Branch: yt-3.0
User: drudd
Date: 2013-08-30 21:13:03
Summary: Updated with Matt's selector_fill refactoring
Affected #: 19 files
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/data_objects/octree_subset.py
--- a/yt/data_objects/octree_subset.py
+++ b/yt/data_objects/octree_subset.py
@@ -36,20 +36,31 @@
NeedsProperty, \
NeedsParameter
import yt.geometry.particle_deposit as particle_deposit
+import yt.geometry.particle_smooth as particle_smooth
from yt.funcs import *
+def cell_count_cache(func):
+ def cc_cache_func(self, dobj):
+ if hash(dobj.selector) != self._last_selector_id:
+ self._cell_count = -1
+ rv = func(self, dobj)
+ self._cell_count = rv.shape[0]
+ self._last_selector_id = hash(dobj.selector)
+ return rv
+ return cc_cache_func
+
class OctreeSubset(YTSelectionContainer):
_spatial = True
_num_ghost_zones = 0
- _num_zones = 2
_type_name = 'octree_subset'
_skip_add = True
_con_args = ('base_region', 'domain', 'pf')
_container_fields = ("dx", "dy", "dz")
_domain_offset = 0
- _num_octs = -1
+ _cell_count = -1
- def __init__(self, base_region, domain, pf):
+ def __init__(self, base_region, domain, pf, over_refine_factor = 1):
+ self._num_zones = 1 << (over_refine_factor)
self.field_data = YTFieldData()
self.field_parameters = {}
self.domain = domain
@@ -145,37 +156,47 @@
if vals is None: return
return np.asfortranarray(vals)
+ def smooth(self, positions, fields = None, method = None):
+ # Here we perform our particle deposition.
+ cls = getattr(particle_smooth, "%s_smooth" % method, None)
+ if cls is None:
+ raise YTParticleDepositionNotImplemented(method)
+ nz = self.nz
+ nvals = (nz, nz, nz, (self.domain_ind >= 0).sum())
+ if fields is None: fields = []
+ op = cls(nvals, len(fields), 64)
+ op.initialize()
+ mylog.debug("Smoothing %s particles into %s Octs",
+ positions.shape[0], nvals[-1])
+ op.process_octree(self.oct_handler, self.domain_ind, positions, fields,
+ self.domain_id, self._domain_offset)
+ vals = op.finalize()
+ if vals is None: return
+ if isinstance(vals, list):
+ vals = [np.asfortranarray(v) for v in vals]
+ else:
+ vals = np.asfortranarray(vals)
+ return vals
+
+ @cell_count_cache
def select_icoords(self, dobj):
- d = self.oct_handler.icoords(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 3,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.icoords(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
+ @cell_count_cache
def select_fcoords(self, dobj):
- d = self.oct_handler.fcoords(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 3,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.fcoords(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
+ @cell_count_cache
def select_fwidth(self, dobj):
- d = self.oct_handler.fwidth(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 3,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.fwidth(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
+ @cell_count_cache
def select_ires(self, dobj):
- d = self.oct_handler.ires(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 1,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.ires(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
def select(self, selector, source, dest, offset):
n = self.oct_handler.selector_fill(selector, source, dest, offset,
@@ -183,11 +204,7 @@
return n
def count(self, selector):
- if hash(selector) == self._last_selector_id:
- if self._last_mask is None: return 0
- return self._last_mask.sum()
- self.select(selector)
- return self.count(selector)
+ return -1
def count_particles(self, selector, x, y, z):
# We don't cache the selector results
@@ -206,8 +223,10 @@
_type_name = 'indexed_octree_subset'
_con_args = ('data_files', 'pf', 'min_ind', 'max_ind')
domain_id = -1
- def __init__(self, base_region, data_files, pf, min_ind = 0, max_ind = 0):
+ def __init__(self, base_region, data_files, pf, min_ind = 0, max_ind = 0,
+ over_refine_factor = 1):
# The first attempt at this will not work in parallel.
+ self._num_zones = 1 << (over_refine_factor)
self.data_files = data_files
self.field_data = YTFieldData()
self.field_parameters = {}
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -135,7 +135,7 @@
# common attributes
cdef public int num_grid
- cdef public int64_t num_root_cells
+ cdef int64_t num_root_cells
cdef int64_t sfc_min, sfc_max
# grid attributes
@@ -575,7 +575,7 @@
np.float64_t *pvars[16]
np.float64_t *svars[16]
-cdef class ARTIOOctreeContainer(SparseOctreeContainer):
+ cdef class ARTIOOctreeContainer(SparseOctreeContainer):
# This is a transitory, created-on-demand OctreeContainer. It should not
# be considered to be long-lasting, and during its creation it will read
# the index file. This means that when created it will then be able to
@@ -626,11 +626,9 @@
for i in range(3):
dds[i] = (self.DRE[i] - self.DLE[i])/self.nn[i]
- status = artio_grid_cache_sfc_range(handle, 0, self.artio_handle.num_root_cells-1)
+ status = artio_grid_cache_sfc_range(handle,
+ self.sfc_start, self.sfc_end )
check_artio_status(status)
- #status = artio_grid_cache_sfc_range(handle,
- # self.sfc_start, self.sfc_end )
- #check_artio_status(status)
# compute total octs in sfc range (not including root level)
status = artio_grid_count_octs_in_sfc_range(handle,self.sfc_start,self.sfc_end,&tot_octs)
@@ -763,9 +761,8 @@
field_vals[i] = <np.float32_t*> source.data
# First we need to walk the mesh in the file. Then we fill in the dest
# location based on the file index.
- #status = artio_grid_cache_sfc_range(handle,
- # self.sfc_start, self.sfc_end )
- status = artio_grid_cache_sfc_range(handle,0,self.artio_handle.num_root_cells-1)
+ status = artio_grid_cache_sfc_range(handle,
+ self.sfc_start, self.sfc_end )
check_artio_status(status)
for sfc in range(self.sfc_start, self.sfc_end + 1):
status = artio_grid_read_root_cell_begin( handle, sfc,
@@ -1036,17 +1033,16 @@
cdef int i
return self.mask(selector).sum()
- def icoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def icoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
# Note that num_octs does not have to equal sfc_end - sfc_start + 1.
cdef np.int64_t sfc
cdef int acoords[3], i
- # We call it num_octs, but it's really num_cells.
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.int64_t, ndim=2] coords
- coords = np.empty((num_octs, 3), dtype="int64")
+ coords = np.empty((num_cells, 3), dtype="int64")
cdef int filled = 0
for sfc in range(self.sfc_start, self.sfc_end + 1):
if mask[sfc - self.sfc_start] == 0: continue
@@ -1059,18 +1055,17 @@
filled += 1
return coords
- def fcoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fcoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- # Note that num_octs does not have to equal sfc_end - sfc_start + 1.
+ # Note that num_cells does not have to equal sfc_end - sfc_start + 1.
cdef np.int64_t sfc
cdef np.float64_t pos[3]
cdef int acoords[3], i
- # We call it num_octs, but it's really num_cells.
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.float64_t, ndim=2] coords
- coords = np.empty((num_octs, 3), dtype="float64")
+ coords = np.empty((num_cells, 3), dtype="float64")
cdef int filled = 0
for sfc in range(self.sfc_start, self.sfc_end + 1):
if mask[sfc - self.sfc_start] == 0: continue
@@ -1083,25 +1078,25 @@
filled += 1
return coords
- def fwidth(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fwidth(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
cdef int i
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.float64_t, ndim=2] width
- width = np.zeros((num_octs, 3), dtype="float64")
+ width = np.zeros((num_cells, 3), dtype="float64")
for i in range(3):
width[:,i] = self.dds[i]
return width
- def ires(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def ires(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.int64_t, ndim=1] res
- res = np.zeros(num_octs, dtype="int64")
+ res = np.zeros(num_cells, dtype="int64")
return res
@cython.boundscheck(False)
@@ -1163,27 +1158,25 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def mask2(self, SelectorObject selector, np.int64_t num_octs = -1):
+ def mask2(self, SelectorObject selector, np.int64_t num_cells = -1):
cdef int i, status
cdef double dpos[3]
cdef np.float64_t pos[3]
cdef np.int64_t sfc
if self._last_selector_id == hash(selector):
return self._last_mask
- if num_octs == -1:
+ if num_cells == -1:
# We need to count, but this process will only occur one time,
- # since num_octs will later be cached.
- num_octs = self.sfc_end - self.sfc_start + 1
- #assert(num_octs == (self.sfc_end - self.sfc_start + 1))
+ # since num_cells will later be cached.
+ num_cells = self.sfc_end - self.sfc_start + 1
cdef np.ndarray[np.uint8_t, ndim=1] mask
cdef int num_oct_levels
cdef int max_level = self.artio_handle.max_level
cdef int *num_octs_per_level = <int *>malloc(
(max_level + 1)*sizeof(int))
- mask = np.zeros((num_octs), dtype="uint8")
- #status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
- # self.sfc_end)
- status = artio_grid_cache_sfc_range(self.handle,0,self.artio_handle.num_root_cells-1)
+ mask = np.zeros((num_cells), dtype="uint8")
+ status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
+ self.sfc_end)
check_artio_status(status)
for sfc in range(self.sfc_start, self.sfc_end + 1):
# We check if the SFC is in our selector, and if so, we copy
@@ -1251,9 +1244,8 @@
# First we need to walk the mesh in the file. Then we fill in the dest
# location based on the file index.
cdef int filled = 0
- #status = artio_grid_cache_sfc_range(handle,
- # self.sfc_start, self.sfc_end )
- status = artio_grid_cache_sfc_range(handle,0,self.artio_handle.num_root_cells-1)
+ status = artio_grid_cache_sfc_range(handle,
+ self.sfc_start, self.sfc_end )
check_artio_status(status)
for sfc in range(self.sfc_start, self.sfc_end + 1):
if mask[sfc - self.sfc_start] == 0: continue
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -55,6 +55,7 @@
domain_id = 2
_con_args = ("base_region", "sfc_start", "sfc_end", "pf")
_type_name = 'octree_subset'
+ _num_zones = 2
def __init__(self, base_region, sfc_start, sfc_end, pf):
self.field_data = YTFieldData()
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/frontends/ramses/data_structures.py
--- a/yt/frontends/ramses/data_structures.py
+++ b/yt/frontends/ramses/data_structures.py
@@ -215,6 +215,7 @@
self.amr_header['nboundary']*l]
return ng
min_level = self.pf.min_level
+ max_level = min_level
nx, ny, nz = (((i-1.0)/2.0) for i in self.amr_header['nx'])
for level in range(self.amr_header['nlevelmax']):
# Easier if do this 1-indexed
@@ -248,6 +249,8 @@
assert(pos.shape[0] == ng)
n = self.oct_handler.add(cpu + 1, level - min_level, pos)
assert(n == ng)
+ if n > 0: max_level = max(level - min_level, max_level)
+ self.max_level = max_level
self.oct_handler.finalize()
def included(self, selector):
@@ -297,7 +300,7 @@
# for now, the hierarchy file is the parameter file!
self.hierarchy_filename = self.parameter_file.parameter_filename
self.directory = os.path.dirname(self.hierarchy_filename)
- self.max_level = pf.max_level
+ self.max_level = None
self.float_type = np.float64
super(RAMSESGeometryHandler, self).__init__(pf, data_style)
@@ -308,6 +311,7 @@
for i in range(self.parameter_file['ncpu'])]
total_octs = sum(dom.local_oct_count #+ dom.ngridbound.sum()
for dom in self.domains)
+ self.max_level = max(dom.max_level for dom in self.domains)
self.num_grids = total_octs
def _detect_fields(self):
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/frontends/sph/data_structures.py
--- a/yt/frontends/sph/data_structures.py
+++ b/yt/frontends/sph/data_structures.py
@@ -96,6 +96,7 @@
class ParticleStaticOutput(StaticOutput):
_unit_base = None
+ over_refine_factor = 1
def _set_units(self):
self.units = {}
@@ -154,8 +155,10 @@
def __init__(self, filename, data_style="gadget_binary",
additional_fields = (),
- unit_base = None, n_ref = 64):
+ unit_base = None, n_ref = 64,
+ over_refine_factor = 1):
self.n_ref = n_ref
+ self.over_refine_factor = over_refine_factor
self.storage_filename = None
if unit_base is not None and "UnitLength_in_cm" in unit_base:
# We assume this is comoving, because in the absence of comoving
@@ -188,7 +191,8 @@
self.domain_left_edge = np.zeros(3, "float64")
self.domain_right_edge = np.ones(3, "float64") * hvals["BoxSize"]
- self.domain_dimensions = np.ones(3, "int32") * 2
+ nz = 1 << self.over_refine_factor
+ self.domain_dimensions = np.ones(3, "int32") * nz
self.periodicity = (True, True, True)
self.cosmological_simulation = 1
@@ -268,11 +272,13 @@
_particle_coordinates_name = "Coordinates"
_header_spec = None # Override so that there's no confusion
- def __init__(self, filename, data_style="OWLS", n_ref = 64):
+ def __init__(self, filename, data_style="OWLS", n_ref = 64,
+ over_refine_factor = 1):
self.storage_filename = None
- super(OWLSStaticOutput, self).__init__(filename, data_style,
- unit_base = None,
- n_ref = n_ref)
+ super(OWLSStaticOutput, self).__init__(
+ filename, data_style,
+ unit_base = None, n_ref = n_ref,
+ over_refine_factor = over_refine_factor)
def __repr__(self):
return os.path.basename(self.parameter_filename).split(".")[0]
@@ -292,7 +298,8 @@
self.current_time = hvals["Time_GYR"] * sec_conversion["Gyr"]
self.domain_left_edge = np.zeros(3, "float64")
self.domain_right_edge = np.ones(3, "float64") * hvals["BoxSize"]
- self.domain_dimensions = np.ones(3, "int32") * 2
+ nz = 1 << self.over_refine_factor
+ self.domain_dimensions = np.ones(3, "int32") * nz
self.cosmological_simulation = 1
self.periodicity = (True, True, True)
self.current_redshift = hvals["Redshift"]
@@ -438,7 +445,8 @@
self.parameters[param] = val
self.current_time = hvals["time"]
- self.domain_dimensions = np.ones(3, "int32") * 2
+ nz = 1 << self.over_refine_factor
+ self.domain_dimensions = np.ones(3, "int32") * nz
if self.parameters.get('bPeriodic', True):
self.periodicity = (True, True, True)
else:
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/frontends/stream/data_structures.py
--- a/yt/frontends/stream/data_structures.py
+++ b/yt/frontends/stream/data_structures.py
@@ -738,10 +738,11 @@
file_count = 1
filename_template = "stream_file"
n_ref = 64
+ over_refine_factor = 1
def load_particles(data, sim_unit_to_cm, bbox=None,
sim_time=0.0, periodicity=(True, True, True),
- n_ref = 64):
+ n_ref = 64, over_refine_factor = 1):
r"""Load a set of particles into yt as a
:class:`~yt.frontends.stream.data_structures.StreamParticleHandler`.
@@ -828,6 +829,7 @@
spf = StreamParticlesStaticOutput(handler)
spf.n_ref = n_ref
+ spf.over_refine_factor = over_refine_factor
spf.units["cm"] = sim_unit_to_cm
spf.units['1'] = 1.0
spf.units["unitary"] = 1.0
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/oct_container.pxd
--- a/yt/geometry/oct_container.pxd
+++ b/yt/geometry/oct_container.pxd
@@ -40,6 +40,8 @@
cdef struct OctInfo:
np.float64_t left_edge[3]
np.float64_t dds[3]
+ np.int64_t ipos[3]
+ np.int32_t level
cdef struct OctAllocationContainer
cdef struct OctAllocationContainer:
@@ -49,6 +51,16 @@
OctAllocationContainer *next
Oct *my_octs
+cdef struct OctList
+
+cdef struct OctList:
+ OctList *next
+ Oct *o
+
+cdef OctList *OctList_append(OctList *list, Oct *o)
+cdef int OctList_count(OctList *list)
+cdef void OctList_delete(OctList *list)
+
cdef class OctreeContainer:
cdef OctAllocationContainer *cont
cdef OctAllocationContainer **domains
@@ -56,12 +68,13 @@
cdef oct_visitor_function *fill_func
cdef int partial_coverage
cdef int nn[3]
+ cdef np.uint8_t oref
cdef np.float64_t DLE[3], DRE[3]
cdef public np.int64_t nocts
cdef public int max_domain
cdef Oct *get(self, np.float64_t ppos[3], OctInfo *oinfo = ?)
cdef int get_root(self, int ind[3], Oct **o)
- cdef void neighbors(self, Oct *, Oct **)
+ cdef Oct **neighbors(self, OctInfo *oinfo, np.int64_t *nneighbors)
cdef void oct_bounds(self, Oct *, np.float64_t *, np.float64_t *)
# This function must return the offset from global-to-local domains; i.e.,
# OctAllocationContainer.offset if such a thing exists.
@@ -71,6 +84,7 @@
OctVisitorData *data)
cdef Oct *next_root(self, int domain_id, int ind[3])
cdef Oct *next_child(self, int domain_id, int ind[3], Oct *parent)
+ cdef void setup_data(self, OctVisitorData *data, int domain_id = ?)
cdef class SparseOctreeContainer(OctreeContainer):
cdef OctKey *root_nodes
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -96,8 +96,10 @@
cdef class OctreeContainer:
def __init__(self, oct_domain_dimensions, domain_left_edge,
- domain_right_edge, partial_coverage = 0):
+ domain_right_edge, partial_coverage = 0,
+ over_refine = 1):
# This will just initialize the root mesh octs
+ self.oref = over_refine
self.partial_coverage = partial_coverage
cdef int i, j, k, p
for i in range(3):
@@ -120,6 +122,21 @@
for k in range(self.nn[2]):
self.root_mesh[i][j][k] = NULL
+ cdef void setup_data(self, OctVisitorData *data, int domain_id = -1):
+ cdef int i
+ data.index = 0
+ data.last = -1
+ data.global_index = -1
+ for i in range(3):
+ data.pos[i] = -1
+ data.ind[i] = -1
+ data.array = NULL
+ data.dims = 0
+ data.domain = domain_id
+ data.level = -1
+ data.oref = self.oref
+ data.nz = (1 << (data.oref*3))
+
def __dealloc__(self):
free_octs(self.cont)
if self.root_mesh == NULL: return
@@ -185,27 +202,39 @@
return 0
cdef int get_root(self, int ind[3], Oct **o):
+ cdef int i
+ for i in range(3):
+ if ind[i] < 0 or ind[i] >= self.nn[i]:
+ o[0] = NULL
+ return 1
o[0] = self.root_mesh[ind[0]][ind[1]][ind[2]]
- return 1
+ return 0
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- cdef Oct *get(self, np.float64_t ppos[3], OctInfo *oinfo = NULL):
+ cdef Oct *get(self, np.float64_t ppos[3], OctInfo *oinfo = NULL,
+ ):
#Given a floating point position, retrieve the most
#refined oct at that time
- cdef int ind[3]
+ cdef int ind[3], level
+ cdef np.int64_t ipos[3]
cdef np.float64_t dds[3], cp[3], pp[3]
cdef Oct *cur, *next
+ cdef int i
cur = next = NULL
- cdef int i
+ level = -1
for i in range(3):
dds[i] = (self.DRE[i] - self.DLE[i])/self.nn[i]
ind[i] = <np.int64_t> ((ppos[i] - self.DLE[i])/dds[i])
cp[i] = (ind[i] + 0.5) * dds[i] + self.DLE[i]
+ ipos[i] = 0
self.get_root(ind, &next)
# We want to stop recursing when there's nowhere else to go
while next != NULL:
+ level += 1
+ for i in range(3):
+ ipos[i] = (ipos[i] << 1) + ind[i]
cur = next
for i in range(3):
dds[i] = dds[i] / 2.0
@@ -227,18 +256,22 @@
cp[i] -= dds[i]/2.0 # Now centered
else:
cp[i] += dds[i]/2.0
- # We don't need to change dds[i] as it has been halved from the
- # oct width, thus making it already the cell width
- oinfo.dds[i] = dds[i] # Cell width
+ # We don't normally need to change dds[i] as it has been halved
+ # from the oct width, thus making it already the cell width.
+ # But, for some cases where the oref != 1, this needs to be
+ # changed.
+ oinfo.dds[i] = dds[i] / (1 << (self.oref-1)) # Cell width
oinfo.left_edge[i] = cp[i] - dds[i] # Center minus dds
+ oinfo.ipos[i] = ipos[i]
+ oinfo.level = level
return cur
def domain_identify(self, SelectorObject selector):
cdef np.ndarray[np.uint8_t, ndim=1] domain_mask
domain_mask = np.zeros(self.max_domain, dtype="uint8")
cdef OctVisitorData data
+ self.setup_data(&data)
data.array = domain_mask.data
- data.domain = -1
self.visit_all_octs(selector, oct_visitors.identify_octs, &data)
cdef int i
domain_ids = []
@@ -250,162 +283,128 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- cdef void neighbors(self, Oct* o, Oct* neighbors[27]):
- #Get 3x3x3 neighbors, although the 1,1,1 oct is the
- #central one.
- #Return an array of Octs
- cdef np.int64_t curopos[3]
- cdef np.int64_t curnpos[3]
- cdef np.int64_t npos[3]
- cdef int i, j, k, ni, nj, nk, ind[3], nn, dl, skip
- cdef np.float64_t dds[3], cp[3], pp[3]
+ cdef Oct** neighbors(self, OctInfo *oi, np.int64_t *nneighbors):
cdef Oct* candidate
- for i in range(27): neighbors[i] = NULL
nn = 0
- raise RuntimeError
- #for ni in range(3):
- # for nj in range(3):
- # for nk in range(3):
- # if ni == nj == nk == 1:
- # neighbors[nn] = o
- # nn += 1
- # continue
- # npos[0] = o.pos[0] + (ni - 1)
- # npos[1] = o.pos[1] + (nj - 1)
- # npos[2] = o.pos[2] + (nk - 1)
- # for i in range(3):
- # # Periodicity
- # if npos[i] == -1:
- # npos[i] = (self.nn[i] << o.level) - 1
- # elif npos[i] == (self.nn[i] << o.level):
- # npos[i] = 0
- # curopos[i] = o.pos[i]
- # curnpos[i] = npos[i]
- # # Now we have our neighbor position and a safe place to
- # # keep it. curnpos will be the root index of the neighbor
- # # at a given level, and npos will be constant. curopos is
- # # the candidate root at a level.
- # candidate = o
- # while candidate != NULL:
- # if ((curopos[0] == curnpos[0]) and
- # (curopos[1] == curnpos[1]) and
- # (curopos[2] == curnpos[2])):
- # break
- # # This one doesn't meet it, so we pop up a level.
- # # First we update our positions, then we update our
- # # candidate.
- # for i in range(3):
- # # We strip a digit off the right
- # curopos[i] = (curopos[i] >> 1)
- # curnpos[i] = (curnpos[i] >> 1)
- # # Now we update to the candidate's parent, which should
- # # have a matching position to curopos[]
- # # TODO: This has not survived the transition to
- # # mostly-stateless Octs!
- # raise RuntimeError
- # candidate = candidate.parent
- # if candidate == NULL:
- # # Worst case scenario
- # for i in range(3):
- # ind[i] = (npos[i] >> (o.level))
- # candidate = self.root_mesh[ind[0]][ind[1]][ind[2]]
- # # Now we have the common root, which may be NULL
- # while candidate.level < o.level:
- # dl = o.level - (candidate.level + 1)
- # for i in range(3):
- # ind[i] = (npos[i] >> dl) & 1
- # if candidate.children[cind(ind[0],ind[1],ind[2])] \
- # == NULL:
- # break
- # candidate = candidate.children[cind(ind[0],ind[1],ind[2])]
- # neighbors[nn] = candidate
- # nn += 1
+ # We are going to do a brute-force search here.
+ # This is not the most efficient -- in fact, it's relatively bad. But
+ # we will attempt to improve it in a future iteration, where we will
+ # grow a stack of parent Octs.
+ # Note that in the first iteration, we will just find the up-to-27
+ # neighbors, including the main oct.
+ cdef int i, j, k, n, level, ind[3], ii, nfound = 0
+ cdef OctList *olist, *my_list
+ my_list = olist = NULL
+ cdef Oct *cand
+ cdef np.int64_t npos[3], ndim[3]
+ # Now we get our boundaries for this level, so that we can wrap around
+ # if need be.
+ # ndim is the oct dimensions of the level, not the cell dimensions.
+ for i in range(3):
+ ndim[i] = <np.int64_t> ((self.DRE[i] - self.DLE[i]) / oi.dds[i])
+ ndim[i] = (ndim[i] >> self.oref)
+ for i in range(3):
+ npos[0] = (oi.ipos[0] + (1 - i))
+ if npos[0] < 0: npos[0] += ndim[0]
+ if npos[0] >= ndim[0]: npos[0] -= ndim[0]
+ for j in range(3):
+ npos[1] = (oi.ipos[1] + (1 - j))
+ if npos[1] < 0: npos[1] += ndim[1]
+ if npos[1] >= ndim[1]: npos[1] -= ndim[1]
+ for k in range(3):
+ npos[2] = (oi.ipos[2] + (1 - k))
+ if npos[2] < 0: npos[2] += ndim[2]
+ if npos[2] >= ndim[2]: npos[2] -= ndim[2]
+ # Now we have our npos, which we just need to find.
+ # Level 0 gets bootstrapped
+ for n in range(3):
+ ind[n] = ((npos[n] >> (oi.level)) & 1)
+ cand = NULL
+ self.get_root(ind, &cand)
+ # We should not get a NULL if we handle periodicity
+ # correctly, but we might.
+ if cand == NULL: continue
+ for level in range(1, oi.level+1):
+ if cand.children == NULL: break
+ for n in range(3):
+ ind[n] = (npos[n] >> (oi.level - (level))) & 1
+ ii = cind(ind[0],ind[1],ind[2])
+ if cand.children[ii] == NULL: break
+ cand = cand.children[ii]
+ if cand != NULL:
+ nfound += 1
+ olist = OctList_append(olist, cand)
+ if my_list == NULL: my_list = olist
+
+ olist = my_list
+ cdef int noct = OctList_count(olist)
+ cdef Oct **neighbors
+ neighbors = <Oct **> malloc(sizeof(Oct*)*noct)
+ for i in range(noct):
+ neighbors[i] = olist.o
+ olist = olist.next
+ OctList_delete(my_list)
+ nneighbors[0] = noct
+ return neighbors
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def get_neighbor_boundaries(self, oppos):
- cdef int i, ii
- cdef np.float64_t ppos[3]
- for i in range(3):
- ppos[i] = oppos[i]
- cdef Oct *main = self.get(ppos)
- cdef Oct* neighbors[27]
- self.neighbors(main, neighbors)
- cdef np.ndarray[np.float64_t, ndim=2] bounds
- cdef np.float64_t corner[3], size[3]
- bounds = np.zeros((27,6), dtype="float64")
- tnp = 0
- raise RuntimeError
- for i in range(27):
- self.oct_bounds(neighbors[i], corner, size)
- for ii in range(3):
- bounds[i, ii] = corner[ii]
- bounds[i, 3+ii] = size[ii]
- return bounds
-
- @cython.boundscheck(False)
- @cython.wraparound(False)
- @cython.cdivision(True)
- def mask(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def mask(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
cdef np.ndarray[np.uint8_t, ndim=1] coords
- coords = np.zeros((num_octs * 8), dtype="uint8")
cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
+ coords = np.zeros((num_cells), dtype="uint8")
data.array = <void *> coords.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.mask_octs, &data)
return coords.astype("bool")
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def icoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def icoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
+ cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
cdef np.ndarray[np.int64_t, ndim=2] coords
- coords = np.empty((num_octs * 8, 3), dtype="int64")
- cdef OctVisitorData data
+ coords = np.empty((num_cells, 3), dtype="int64")
data.array = <void *> coords.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.icoords_octs, &data)
return coords
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def ires(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def ires(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
+ cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
#Return the 'resolution' of each cell; ie the level
cdef np.ndarray[np.int64_t, ndim=1] res
- res = np.empty(num_octs * 8, dtype="int64")
- cdef OctVisitorData data
+ res = np.empty(num_cells, dtype="int64")
data.array = <void *> res.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.ires_octs, &data)
return res
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def fwidth(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fwidth(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
+ cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
cdef np.ndarray[np.float64_t, ndim=2] fwidth
- fwidth = np.empty((num_octs * 8, 3), dtype="float64")
- cdef OctVisitorData data
+ fwidth = np.empty((num_cells, 3), dtype="float64")
data.array = <void *> fwidth.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.fwidth_octs, &data)
cdef np.float64_t base_dx
for i in range(3):
@@ -416,17 +415,16 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def fcoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fcoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- if num_octs == -1:
- num_octs = selector.count_octs(self, domain_id)
+ if num_cells == -1:
+ num_cells = selector.count_oct_cells(self, domain_id)
+ cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
#Return the floating point unitary position of every cell
cdef np.ndarray[np.float64_t, ndim=2] coords
- coords = np.empty((num_octs * 8, 3), dtype="float64")
- cdef OctVisitorData data
+ coords = np.empty((num_cells, 3), dtype="float64")
data.array = <void *> coords.data
- data.index = 0
- data.domain = domain_id
self.visit_all_octs(selector, oct_visitors.fcoords_octs, &data)
cdef int i
cdef np.float64_t base_dx
@@ -456,8 +454,8 @@
else:
dest = np.zeros(num_cells, dtype=source.dtype, order='C')
cdef OctVisitorData data
+ self.setup_data(&data, domain_id)
data.index = offset
- data.domain = domain_id
# We only need this so we can continue calculating the offset
data.dims = dims
cdef void *p[2]
@@ -474,14 +472,16 @@
else:
raise NotImplementedError
self.visit_all_octs(selector, func, &data)
- if (data.global_index + 1) * 8 * data.dims > source.size:
+ if (data.global_index + 1) * data.nz * data.dims > source.size:
print "GLOBAL INDEX RAN AHEAD.",
- print (data.global_index + 1) * 8 * data.dims - source.size
+ print (data.global_index + 1) * data.nz * data.dims - source.size
print dest.size, source.size, num_cells
raise RuntimeError
if data.index > dest.size:
print "DEST INDEX RAN AHEAD.",
print data.index - dest.size
+ print (data.global_index + 1) * data.nz * data.dims, source.size
+ print num_cells
raise RuntimeError
if num_cells >= 0:
return dest
@@ -492,10 +492,8 @@
# Here's where we grab the masked items.
ind = np.zeros(self.nocts, 'int64') - 1
cdef OctVisitorData data
- data.domain = domain_id
+ self.setup_data(&data, domain_id)
data.array = ind.data
- data.index = 0
- data.last = -1
self.visit_all_octs(selector, oct_visitors.index_octs, &data)
return ind
@@ -578,6 +576,7 @@
if parent.children != NULL:
next = parent.children[cind(ind[0],ind[1],ind[2])]
else:
+ # This *8 does NOT need to be made generic.
parent.children = <Oct **> malloc(sizeof(Oct *) * 8)
for i in range(8):
parent.children[i] = NULL
@@ -607,13 +606,12 @@
file_inds[i] = -1
cell_inds[i] = 9
cdef OctVisitorData data
- data.index = 0
+ self.setup_data(&data, domain_id)
cdef void *p[3]
p[0] = levels.data
p[1] = file_inds.data
p[2] = cell_inds.data
data.array = p
- data.domain = domain_id
self.visit_all_octs(selector, self.fill_func, &data)
return levels, cell_inds, file_inds
@@ -641,10 +639,9 @@
def finalize(self):
cdef SelectorObject selector = selection_routines.AlwaysSelector(None)
cdef OctVisitorData data
- data.index = 0
- data.domain = 1
+ self.setup_data(&data, 1)
self.visit_all_octs(selector, oct_visitors.assign_domain_ind, &data)
- assert ((data.global_index+1)*8 == data.index)
+ assert ((data.global_index+1)*data.nz == data.index)
cdef int root_node_compare(void *a, void *b) nogil:
cdef OctKey *ao, *bo
@@ -659,9 +656,11 @@
cdef class SparseOctreeContainer(OctreeContainer):
- def __init__(self, domain_dimensions, domain_left_edge, domain_right_edge):
+ def __init__(self, domain_dimensions, domain_left_edge, domain_right_edge,
+ over_refine = 1):
cdef int i, j, k, p
self.partial_coverage = 1
+ self.oref = over_refine
for i in range(3):
self.nn[i] = domain_dimensions[i]
self.max_domain = -1
@@ -807,3 +806,33 @@
dest[local_filled + offset] = source[ox,oy,oz]
local_filled += 1
return local_filled
+
+cdef OctList *OctList_append(OctList *olist, Oct *o):
+ cdef OctList *this = olist
+ if this == NULL:
+ this = <OctList *> malloc(sizeof(OctList))
+ this.next = NULL
+ this.o = o
+ return this
+ while this.next != NULL:
+ this = this.next
+ this.next = <OctList*> malloc(sizeof(OctList))
+ this = this.next
+ this.o = o
+ this.next = NULL
+ return this
+
+cdef int OctList_count(OctList *olist):
+ cdef OctList *this = olist
+ cdef int i = 0 # Count the list
+ while this != NULL:
+ i += 1
+ this = this.next
+ return i
+
+cdef void OctList_delete(OctList *olist):
+ cdef OctList *next, *this = olist
+ while this != NULL:
+ next = this.next
+ free(this)
+ this = next
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/oct_visitors.pxd
--- a/yt/geometry/oct_visitors.pxd
+++ b/yt/geometry/oct_visitors.pxd
@@ -3,7 +3,7 @@
Author: Matthew Turk <matthewturk at gmail.com>
Affiliation: Columbia University
-Homepage: http://yt.enzotools.org/
+Homepage: http://yt-project.org/
License:
Copyright (C) 2013 Matthew Turk. All Rights Reserved.
@@ -43,6 +43,10 @@
int dims
np.int32_t domain
np.int8_t level
+ np.int8_t oref # This is the level of overref. 1 => 8 zones, 2 => 64, etc.
+ # To calculate nzones, 1 << (oref * 3)
+ np.int32_t nz
+
ctypedef void oct_visitor_function(Oct *, OctVisitorData *visitor,
np.uint8_t selected)
@@ -64,10 +68,13 @@
cdef oct_visitor_function fill_file_indices_rind
cdef inline int cind(int i, int j, int k):
+ # THIS ONLY WORKS FOR CHILDREN. It is not general for zones.
return (((i*2)+j)*2+k)
cdef inline int oind(OctVisitorData *data):
- return (((data.ind[0]*2)+data.ind[1])*2+data.ind[2])
+ cdef int d = (1 << data.oref)
+ return (((data.ind[0]*d)+data.ind[1])*d+data.ind[2])
cdef inline int rind(OctVisitorData *data):
- return (((data.ind[2]*2)+data.ind[1])*2+data.ind[0])
+ cdef int d = (1 << data.oref)
+ return (((data.ind[2]*d)+data.ind[1])*d+data.ind[0])
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/oct_visitors.pyx
--- a/yt/geometry/oct_visitors.pyx
+++ b/yt/geometry/oct_visitors.pyx
@@ -38,7 +38,7 @@
if selected == 0: return
cdef int i
# There are this many records between "octs"
- cdef np.int64_t index = (data.global_index * 8)*data.dims
+ cdef np.int64_t index = (data.global_index * data.nz)*data.dims
cdef np.float64_t **p = <np.float64_t**> data.array
index += oind(data)*data.dims
for i in range(data.dims):
@@ -50,7 +50,7 @@
# "last" here tells us the dimensionality of the array.
if selected == 0: return
cdef int i
- cdef np.int64_t index = (data.global_index * 8)*data.dims
+ cdef np.int64_t index = (data.global_index * data.nz)*data.dims
cdef np.int64_t **p = <np.int64_t**> data.array
index += oind(data)*data.dims
for i in range(data.dims):
@@ -75,7 +75,7 @@
if data.last != o.domain_ind:
data.last = o.domain_ind
data.index += 1
- cdef np.int64_t index = data.index * 8
+ cdef np.int64_t index = data.index * data.nz
index += oind(data)
arr[index] = 1
@@ -83,7 +83,7 @@
if selected == 0: return
cdef int i
cdef np.uint8_t *arr = <np.uint8_t *> data.array
- cdef np.int64_t index = data.global_index * 8
+ cdef np.int64_t index = data.global_index * data.nz
index += oind(data)
arr[index] = 1
@@ -102,7 +102,7 @@
cdef np.int64_t *coords = <np.int64_t*> data.array
cdef int i
for i in range(3):
- coords[data.index * 3 + i] = (data.pos[i] << 1) + data.ind[i]
+ coords[data.index * 3 + i] = (data.pos[i] << data.oref) + data.ind[i]
data.index += 1
cdef void ires_octs(Oct *o, OctVisitorData *data, np.uint8_t selected):
@@ -120,9 +120,9 @@
cdef np.float64_t *fcoords = <np.float64_t*> data.array
cdef int i
cdef np.float64_t c, dx
- dx = 1.0 / (2 << data.level)
+ dx = 1.0 / ((1 << data.oref) << data.level)
for i in range(3):
- c = <np.float64_t> ((data.pos[i] << 1 ) + data.ind[i])
+ c = <np.float64_t> ((data.pos[i] << data.oref ) + data.ind[i])
fcoords[data.index * 3 + i] = (c + 0.5) * dx
data.index += 1
@@ -135,7 +135,7 @@
cdef np.float64_t *fwidth = <np.float64_t*> data.array
cdef int i
cdef np.float64_t dx
- dx = 1.0 / (2 << data.level)
+ dx = 1.0 / ((1 << data.oref) << data.level)
for i in range(3):
fwidth[data.index * 3 + i] = dx
data.index += 1
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/particle_deposit.pxd
--- a/yt/geometry/particle_deposit.pxd
+++ b/yt/geometry/particle_deposit.pxd
@@ -5,7 +5,7 @@
Affiliation: UC Santa Cruz
Author: Matthew Turk <matthewturk at gmail.com>
Affiliation: Columbia University
-Homepage: http://yt.enzotools.org/
+Homepage: http://yt-project.org/
License:
Copyright (C) 2013 Matthew Turk. All Rights Reserved.
@@ -32,7 +32,7 @@
from libc.math cimport sqrt
from fp_utils cimport *
-from oct_container cimport Oct, OctAllocationContainer, OctreeContainer
+from .oct_container cimport Oct, OctAllocationContainer, OctreeContainer
cdef extern from "alloca.h":
void *alloca(int)
@@ -62,7 +62,6 @@
cdef class ParticleDepositOperation:
# We assume each will allocate and define their own temporary storage
cdef public object nvals
- cdef public int bad_indices
cdef public int update_values
cdef void process(self, int dim[3], np.float64_t left_edge[3],
np.float64_t dds[3], np.int64_t offset,
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/particle_deposit.pyx
--- a/yt/geometry/particle_deposit.pyx
+++ b/yt/geometry/particle_deposit.pyx
@@ -54,7 +54,6 @@
fields = None, int domain_id = -1,
int domain_offset = 0):
cdef int nf, i, j
- self.bad_indices = 0
if fields is None:
fields = []
nf = len(fields)
@@ -66,7 +65,8 @@
tarr = fields[i]
field_pointers[i] = <np.float64_t *> tarr.data
cdef int dims[3]
- dims[0] = dims[1] = dims[2] = 2
+ dims[0] = dims[1] = dims[2] = (1 << octree.oref)
+ cdef int nz = dims[0] * dims[1] * dims[2]
cdef OctInfo oi
cdef np.int64_t offset, moff
cdef Oct *oct
@@ -98,7 +98,7 @@
if oct == NULL or (domain_id > 0 and oct.domain != domain_id):
continue
# Note that this has to be our local index, not our in-file index.
- offset = dom_ind[oct.domain_ind - moff] * 8
+ offset = dom_ind[oct.domain_ind - moff] * nz
if offset < 0: continue
# Check that we found the oct ...
self.process(dims, oi.left_edge, oi.dds,
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/particle_geometry_handler.py
--- a/yt/geometry/particle_geometry_handler.py
+++ b/yt/geometry/particle_geometry_handler.py
@@ -86,7 +86,8 @@
sum(d.total_particles.values()) for d in self.data_files)
pf = self.parameter_file
self.oct_handler = ParticleOctreeContainer(
- [1, 1, 1], pf.domain_left_edge, pf.domain_right_edge)
+ [1, 1, 1], pf.domain_left_edge, pf.domain_right_edge,
+ over_refine = pf.over_refine_factor)
self.oct_handler.n_ref = pf.n_ref
mylog.info("Allocating for %0.3e particles", self.total_particles)
# No more than 256^3 in the region finder.
@@ -147,8 +148,9 @@
data_files = [self.data_files[i] for i in
self.regions.identify_data_files(dobj.selector)]
base_region = getattr(dobj, "base_region", dobj)
+ oref = self.parameter_file.over_refine_factor
subset = [ParticleOctreeSubset(base_region, data_files,
- self.parameter_file)]
+ self.parameter_file, over_refine_factor = oref)]
dobj._chunk_info = subset
dobj._current_chunk = list(self._chunk_all(dobj))[0]
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/particle_oct_container.pyx
--- a/yt/geometry/particle_oct_container.pyx
+++ b/yt/geometry/particle_oct_container.pyx
@@ -205,6 +205,7 @@
cdef int i, j, k, m, n, ind[3]
cdef Oct *noct
cdef np.uint64_t prefix1, prefix2
+ # TODO: This does not need to be changed.
o.children = <Oct **> malloc(sizeof(Oct *)*8)
for i in range(2):
for j in range(2):
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/particle_smooth.pxd
--- /dev/null
+++ b/yt/geometry/particle_smooth.pxd
@@ -0,0 +1,92 @@
+"""
+Particle Deposition onto Octs
+
+Author: Christopher Moody <chris.e.moody at gmail.com>
+Affiliation: UC Santa Cruz
+Author: Matthew Turk <matthewturk at gmail.com>
+Affiliation: Columbia University
+Homepage: http://yt.enzotools.org/
+License:
+ Copyright (C) 2013 Matthew Turk. All Rights Reserved.
+
+ This file is part of yt.
+
+ yt is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+cimport numpy as np
+import numpy as np
+from libc.stdlib cimport malloc, free, qsort
+cimport cython
+from libc.math cimport sqrt
+
+from fp_utils cimport *
+from oct_container cimport Oct, OctAllocationContainer, OctreeContainer
+from .particle_deposit cimport sph_kernel, gind
+
+cdef extern from "alloca.h":
+ void *alloca(int)
+
+cdef struct NeighborList
+cdef struct NeighborList:
+ np.int64_t pn # Particle number
+ np.float64_t r2 # radius**2
+
+cdef inline np.float64_t r2dist(np.float64_t ppos[3],
+ np.float64_t cpos[3],
+ np.float64_t DW[3]):
+ cdef int i
+ cdef np.float64_t r2, DR
+ r2 = 0.0
+ for i in range(3):
+ DR = (ppos[i] - cpos[i])
+ if (DR > DW[i]/2.0):
+ DR -= DW[i]/2.0
+ elif (DR < -DW[i]/2.0):
+ DR += DW[i]/2.0
+ r2 += DR * DR
+ return r2
+
+cdef class ParticleSmoothOperation:
+ # We assume each will allocate and define their own temporary storage
+ cdef public object nvals
+ cdef np.float64_t DW[3]
+ cdef int nfields
+ cdef int maxn
+ cdef int curn
+ cdef np.int64_t *doffs
+ cdef np.int64_t *pinds
+ cdef np.int64_t *pcounts
+ cdef np.float64_t *ppos
+ # Note that we are preallocating here, so this is *not* threadsafe.
+ cdef NeighborList *neighbors
+ cdef void neighbor_process(self, int dim[3], np.float64_t left_edge[3],
+ np.float64_t dds[3], np.float64_t *ppos,
+ np.float64_t **fields, np.int64_t nneighbors,
+ np.int64_t *nind, np.int64_t *doffs,
+ np.int64_t *pinds, np.int64_t *pcounts,
+ np.int64_t offset)
+ cdef void neighbor_eval(self, np.int64_t pn, np.float64_t ppos[3],
+ np.float64_t cpos[3])
+ cdef void neighbor_reset(self)
+ cdef void neighbor_find(self,
+ np.int64_t nneighbors,
+ np.int64_t *nind,
+ np.int64_t *doffs,
+ np.int64_t *pcounts,
+ np.int64_t *pinds,
+ np.float64_t *ppos,
+ np.float64_t cpos[3])
+ cdef void process(self, np.int64_t offset, int i, int j, int k,
+ int dim[3], np.float64_t cpos[3], np.float64_t **fields)
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/particle_smooth.pyx
--- /dev/null
+++ b/yt/geometry/particle_smooth.pyx
@@ -0,0 +1,359 @@
+"""
+Particle smoothing in cells
+
+Author: Matthew Turk <matthewturk at gmail.com>
+Affiliation: Columbia University
+Homepage: http://yt-project.org/
+License:
+ Copyright (C) 2013 Matthew Turk. All Rights Reserved.
+
+ This file is part of yt.
+
+ yt is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+cimport numpy as np
+import numpy as np
+from libc.stdlib cimport malloc, free, realloc
+cimport cython
+from libc.math cimport sqrt
+
+from fp_utils cimport *
+from oct_container cimport Oct, OctAllocationContainer, \
+ OctreeContainer, OctInfo
+
+cdef int Neighbor_compare(void *on1, void *on2) nogil:
+ cdef NeighborList *n1, *n2
+ n1 = <NeighborList *> on1
+ n2 = <NeighborList *> on2
+ # Note that we set this up so that "greatest" evaluates to the *end* of the
+ # list, so we can do standard radius comparisons.
+ if n1.r2 < n2.r2:
+ return -1
+ elif n1.r2 == n2.r2:
+ return 0
+ else:
+ return 1
+
+cdef class ParticleSmoothOperation:
+ def __init__(self, nvals, nfields, max_neighbors):
+ # This is the set of cells, in grids, blocks or octs, we are handling.
+ cdef int i
+ self.nvals = nvals
+ self.nfields = nfields
+ self.maxn = max_neighbors
+ self.neighbors = <NeighborList *> malloc(
+ sizeof(NeighborList) * self.maxn)
+ self.neighbor_reset()
+
+ def initialize(self, *args):
+ raise NotImplementedError
+
+ def finalize(self, *args):
+ raise NotImplementedError
+
+ @cython.cdivision(True)
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ def process_octree(self, OctreeContainer octree,
+ np.ndarray[np.int64_t, ndim=1] dom_ind,
+ np.ndarray[np.float64_t, ndim=2] positions,
+ fields = None, int domain_id = -1,
+ int domain_offset = 0,
+ int test_neighbors = 0):
+ # This will be a several-step operation.
+ #
+ # We first take all of our particles and assign them to Octs. If they
+ # are not in an Oct, we will assume they are out of bounds. Note that
+ # this means that if we have loaded neighbor particles for which an Oct
+ # does not exist, we are going to be discarding them -- so sparse
+ # octrees will need to ensure that neighbor octs *exist*. Particles
+ # will be assigned in a new NumPy array. Note that this incurs
+ # overhead, but reduces complexity as we will now be able to use
+ # argsort.
+ #
+ # After the particles have been assigned to Octs, we process each Oct
+ # individually. We will do this by calling "get" for the *first*
+ # particle in each set of Octs in the sorted list. After this, we get
+ # neighbors for each Oct.
+ #
+ # Now, with the set of neighbors (and thus their indices) we allocate
+ # an array of particles and their fields, fill these in, and call our
+ # process function.
+ #
+ # This is not terribly efficient -- for starters, the neighbor function
+ # is not the most efficient yet. We will also need to handle some
+ # mechanism of an expandable array for holding pointers to Octs, so
+ # that we can deal with >27 neighbors. As I write this comment,
+ # neighbors() only returns 27 neighbors.
+ cdef int nf, i, j, dims[3], n
+ cdef np.float64_t **field_pointers, *field_vals, pos[3], *ppos, dds[3]
+ cdef int nsize = 0
+ cdef np.int64_t *nind = NULL
+ cdef OctInfo oi
+ cdef Oct *oct, **neighbors = NULL
+ cdef np.int64_t nneighbors, numpart, offset, moff, local_ind
+ cdef np.int64_t *doffs, *pinds, *pcounts, poff
+ cdef np.ndarray[np.int64_t, ndim=1] pind, doff, pdoms, pcount
+ cdef np.ndarray[np.float64_t, ndim=1] tarr
+ dims[0] = dims[1] = dims[2] = (1 << octree.oref)
+ cdef int nz = dims[0] * dims[1] * dims[2]
+ numpart = positions.shape[0]
+ # pcount is the number of particles per oct.
+ pcount = np.zeros_like(dom_ind)
+ # doff is the offset to a given oct in the sorted particles.
+ doff = np.zeros_like(dom_ind) - 1
+ moff = octree.get_domain_offset(domain_id + domain_offset)
+ # pdoms points particles at their octs. So the value in this array, for
+ # a given index, is the local oct index.
+ pdoms = np.zeros(positions.shape[0], dtype="int64") - 1
+ nf = len(fields)
+ if fields is None:
+ fields = []
+ field_pointers = <np.float64_t**> alloca(sizeof(np.float64_t *) * nf)
+ for i in range(nf):
+ tarr = fields[i]
+ field_pointers[i] = <np.float64_t *> tarr.data
+ for i in range(3):
+ self.DW[i] = (octree.DRE[i] - octree.DLE[i])
+ for i in range(positions.shape[0]):
+ for j in range(3):
+ pos[j] = positions[i, j]
+ oct = octree.get(pos)
+ if oct == NULL or (domain_id > 0 and oct.domain != domain_id):
+ continue
+ # Note that this has to be our local index, not our in-file index.
+ # This is the particle count, which we'll use once we have sorted
+ # the particles to calculate the offsets into each oct's particles.
+ offset = oct.domain_ind - moff
+ pcount[offset] += 1
+ pdoms[i] = offset # We store the *actual* offset.
+ # Now we have oct assignments. Let's sort them.
+ # Note that what we will be providing to our processing functions will
+ # actually be indirectly-sorted fields. This preserves memory at the
+ # expense of additional pointer lookups.
+ pind = np.argsort(pdoms)
+ pind = np.asarray(pind, dtype='int64', order='C')
+ # So what this means is that we now have all the oct-0 particle indices
+ # in order, then the oct-1, etc etc.
+ # This now gives us the indices to the particles for each domain.
+ for i in range(positions.shape[0]):
+ # This value, poff, is the index of the particle in the *unsorted*
+ # arrays.
+ poff = pind[i]
+ offset = pdoms[poff]
+ # If we have yet to assign the starting index to this oct, we do so
+ # now.
+ if doff[offset] < 0: doff[offset] = i
+ # Now doff is full of offsets to the first entry in the pind that
+ # refers to that oct's particles.
+ ppos = <np.float64_t *> positions.data
+ doffs = <np.int64_t*> doff.data
+ pinds = <np.int64_t*> pind.data
+ pcounts = <np.int64_t*> pcount.data
+ nsize = 27
+ nind = <np.int64_t *> malloc(sizeof(np.int64_t)*nsize)
+ for i in range(doff.shape[0]):
+ # Nothing assigned.
+ if doff[i] < 0: continue
+ # The first particle assigned to this oct should be the one we
+ # want.
+ poff = pind[doff[i]]
+ for j in range(3):
+ pos[j] = positions[poff, j]
+ oct = octree.get(pos, &oi)
+ if oct == NULL or (domain_id > 0 and oct.domain != domain_id):
+ continue
+ offset = dom_ind[oct.domain_ind - moff] * nz
+ neighbors = octree.neighbors(&oi, &nneighbors)
+ # Now we have all our neighbors. And, we should be set for what
+ # else we need to do.
+ if nneighbors > nsize:
+ nind = <np.int64_t *> realloc(
+ nind, sizeof(np.int64_t)*nneighbors)
+ nsize = nneighbors
+ for j in range(nneighbors):
+ nind[j] = neighbors[j].domain_ind - moff
+ for n in range(j):
+ if nind[j] == nind[n]:
+ nind[j] = -1
+ break
+ # This is allocated by the neighbors function, so we deallocate it.
+ free(neighbors)
+ self.neighbor_process(dims, oi.left_edge, oi.dds,
+ ppos, field_pointers, nneighbors, nind, doffs,
+ pinds, pcounts, offset)
+ if nind != NULL:
+ free(nind)
+
+ @cython.cdivision(True)
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ def process_grid(self, gobj,
+ np.ndarray[np.float64_t, ndim=2] positions,
+ fields = None):
+ raise NotImplementedError
+
+ cdef void process(self, np.int64_t offset, int i, int j, int k,
+ int dim[3], np.float64_t cpos[3], np.float64_t **fields):
+ raise NotImplementedError
+
+ cdef void neighbor_reset(self):
+ self.curn = 0
+ for i in range(self.maxn):
+ self.neighbors[i].pn = -1
+ self.neighbors[i].r2 = 1e300
+
+ cdef void neighbor_eval(self, np.int64_t pn, np.float64_t ppos[3],
+ np.float64_t cpos[3]):
+ cdef NeighborList *cur
+ cdef int i
+ # _c means candidate (what we're evaluating)
+ # _o means other (the item in the list)
+ cdef np.float64_t r2_c, r2_o
+ cdef np.int64_t pn_c, pn_o
+ # If we're less than the maximum number of neighbors, we simply append.
+ # After that, we will sort, and then only compare against the rightmost
+ # entries.
+ if self.curn < self.maxn:
+ cur = &self.neighbors[self.curn]
+ cur.pn = pn
+ cur.r2 = r2dist(ppos, cpos, self.DW)
+ self.curn += 1
+ if self.curn == self.maxn:
+ # This time we sort it, so that future insertions will be able
+ # to be done in order.
+ qsort(self.neighbors, self.curn, sizeof(NeighborList),
+ Neighbor_compare)
+ return
+ # This will go (curn - 1) through 0.
+ r2_c = r2dist(ppos, cpos, self.DW)
+ pn_c = pn
+ for i in range((self.curn - 1), -1, -1):
+ # First we evaluate against i. If our candidate radius is greater
+ # than the one we're inspecting, we quit.
+ cur = &self.neighbors[i]
+ r2_o = cur.r2
+ pn_o = cur.pn
+ if r2_c >= r2_o:
+ break
+ # Now we know we need to swap them. First we assign our candidate
+ # values to cur.
+ cur.r2 = r2_c
+ cur.pn = pn_c
+ if i + 1 >= self.maxn:
+ continue # No swapping
+ cur = &self.neighbors[i + 1]
+ cur.r2 = r2_o
+ cur.pn = pn_o
+ # At this point, we've evaluated all the particles and we should have a
+ # sorted set of values. So, we're done.
+
+ cdef void neighbor_find(self,
+ np.int64_t nneighbors,
+ np.int64_t *nind,
+ np.int64_t *doffs,
+ np.int64_t *pcounts,
+ np.int64_t *pinds,
+ np.float64_t *ppos,
+ np.float64_t cpos[3]
+ ):
+ # We are now given the number of neighbors, the indices into the
+ # domains for them, and the number of particles for each.
+ cdef int ni, i, j
+ cdef np.int64_t offset, pn, pc
+ cdef np.float64_t pos[3]
+ self.neighbor_reset()
+ for ni in range(nneighbors):
+ if nind[ni] == -1: continue
+ offset = doffs[nind[ni]]
+ pc = pcounts[nind[ni]]
+ for i in range(pc):
+ pn = pinds[offset + i]
+ for j in range(3):
+ pos[j] = ppos[pn * 3 + j]
+ self.neighbor_eval(pn, pos, cpos)
+
+ cdef void neighbor_process(self, int dim[3], np.float64_t left_edge[3],
+ np.float64_t dds[3], np.float64_t *ppos,
+ np.float64_t **fields, np.int64_t nneighbors,
+ np.int64_t *nind, np.int64_t *doffs,
+ np.int64_t *pinds, np.int64_t *pcounts,
+ np.int64_t offset):
+ # Note that we assume that fields[0] == smoothing length in the native
+ # units supplied. We can now iterate over every cell in the block and
+ # every particle to find the nearest. We will use a priority heap.
+ cdef int i, j, k
+ cdef np.float64_t cpos[3]
+ cpos[0] = left_edge[0] + 0.5*dds[0]
+ for i in range(dim[0]):
+ cpos[1] = left_edge[1] + 0.5*dds[1]
+ for j in range(dim[1]):
+ cpos[2] = left_edge[2] + 0.5*dds[2]
+ for k in range(dim[2]):
+ self.neighbor_find(nneighbors, nind, doffs, pcounts,
+ pinds, ppos, cpos)
+ # Now we have all our neighbors in our neighbor list.
+ self.process(offset, i, j, k, dim, cpos, fields)
+ cpos[2] += dds[2]
+ cpos[1] += dds[1]
+ cpos[0] += dds[0]
+
+
+cdef class SimpleNeighborSmooth(ParticleSmoothOperation):
+ cdef np.float64_t **fp
+ cdef public object vals
+ def initialize(self):
+ cdef int i
+ if self.nfields < 4:
+ # We need at least two fields, the smoothing length and the
+ # field to smooth, to operate.
+ raise RuntimeError
+ cdef np.ndarray tarr
+ self.fp = <np.float64_t **> malloc(
+ sizeof(np.float64_t *) * self.nfields)
+ self.vals = []
+ for i in range(self.nfields):
+ tarr = np.zeros(self.nvals, dtype="float64", order="F")
+ self.vals.append(tarr)
+ self.fp[i] = <np.float64_t *> tarr.data
+
+ def finalize(self):
+ free(self.fp)
+ return self.vals
+
+ @cython.cdivision(True)
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ cdef void process(self, np.int64_t offset, int i, int j, int k,
+ int dim[3], np.float64_t cpos[3], np.float64_t **fields):
+ # We have our i, j, k for our cell, as well as the cell position.
+ # We also have a list of neighboring particles with particle numbers.
+ cdef int n, fi
+ cdef np.float64_t weight, r2, val
+ cdef np.int64_t pn
+ for n in range(self.curn):
+ # No normalization for the moment.
+ # fields[0] is the smoothing length.
+ r2 = self.neighbors[n].r2
+ pn = self.neighbors[n].pn
+ # Smoothing kernel weight function
+ weight = sph_kernel(sqrt(r2) / fields[0][pn])
+ # Mass of the particle times the value divided by the Density
+ for fi in range(self.nfields - 3):
+ val = fields[1][pn] * fields[fi + 3][pn]/fields[2][pn]
+ self.fp[fi + 3][gind(i,j,k,dim) + offset] = val * weight
+ return
+
+simple_neighbor_smooth = SimpleNeighborSmooth
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/selection_routines.pxd
--- a/yt/geometry/selection_routines.pxd
+++ b/yt/geometry/selection_routines.pxd
@@ -40,6 +40,9 @@
oct_visitor_function *func,
OctVisitorData *data,
int visit_covered = ?)
+ cdef void visit_oct_cells(self, OctVisitorData *data, Oct *root, Oct *ch,
+ np.float64_t spos[3], np.float64_t sdds[3],
+ oct_visitor_function *func, int i, int j, int k)
cdef int select_grid(self, np.float64_t left_edge[3],
np.float64_t right_edge[3],
np.int32_t level, Oct *o = ?) nogil
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/selection_routines.pyx
--- a/yt/geometry/selection_routines.pyx
+++ b/yt/geometry/selection_routines.pyx
@@ -157,16 +157,13 @@
def count_octs(self, OctreeContainer octree, int domain_id = -1):
cdef OctVisitorData data
- data.index = 0
- data.last = -1
- data.domain = domain_id
+ octree.setup_data(&data, domain_id)
octree.visit_all_octs(self, oct_visitors.count_total_octs, &data)
return data.index
def count_oct_cells(self, OctreeContainer octree, int domain_id = -1):
cdef OctVisitorData data
- data.index = 0
- data.domain = domain_id
+ octree.setup_data(&data, domain_id)
octree.visit_all_octs(self, oct_visitors.count_total_cells, &data)
return data.index
@@ -230,6 +227,10 @@
if root.children != NULL:
ch = root.children[cind(i, j, k)]
if iter == 1 and next_level == 1 and ch != NULL:
+ # Note that data.pos is always going to be the
+ # position of the Oct -- it is *not* always going
+ # to be the same as the position of the cell under
+ # investigation.
data.pos[0] = (data.pos[0] << 1) + i
data.pos[1] = (data.pos[1] << 1) + j
data.pos[2] = (data.pos[2] << 1) + k
@@ -242,21 +243,60 @@
data.pos[2] = (data.pos[2] >> 1)
data.level -= 1
elif this_level == 1:
- selected = self.select_cell(spos, sdds)
- if ch != NULL:
- selected *= self.overlap_cells
data.global_index += increment
increment = 0
- data.ind[0] = i
- data.ind[1] = j
- data.ind[2] = k
- func(root, data, selected)
+ self.visit_oct_cells(data, root, ch, spos, sdds,
+ func, i, j, k)
spos[2] += sdds[2]
spos[1] += sdds[1]
spos[0] += sdds[0]
this_level = 0 # We turn this off for the second pass.
iter += 1
+ cdef void visit_oct_cells(self, OctVisitorData *data, Oct *root, Oct *ch,
+ np.float64_t spos[3], np.float64_t sdds[3],
+ oct_visitor_function *func, int i, int j, int k):
+ # We can short-circuit the whole process if data.oref == 1.
+ # This saves us some funny-business.
+ cdef int selected
+ if data.oref == 1:
+ selected = self.select_cell(spos, sdds)
+ if ch != NULL:
+ selected *= self.overlap_cells
+ # data.ind refers to the cell, not to the oct.
+ data.ind[0] = i
+ data.ind[1] = j
+ data.ind[2] = k
+ func(root, data, selected)
+ return
+ # Okay, now that we've got that out of the way, we have to do some
+ # other checks here. In this case, spos[] is the position of the
+ # center of a *possible* oct child, which means it is the center of a
+ # cluster of cells. That cluster might have 1, 8, 64, ... cells in it.
+ # But, we can figure it out by calculating the cell dds.
+ cdef np.float64_t dds[3], pos[3]
+ cdef int ci, cj, ck
+ cdef int nr = (1 << (data.oref - 1))
+ for ci in range(3):
+ dds[ci] = sdds[ci] / nr
+ # Boot strap at the first index.
+ pos[0] = (spos[0] - sdds[0]/2.0) + dds[0] * 0.5
+ for ci in range(nr):
+ pos[1] = (spos[1] - sdds[1]/2.0) + dds[1] * 0.5
+ for cj in range(nr):
+ pos[2] = (spos[2] - sdds[2]/2.0) + dds[2] * 0.5
+ for ck in range(nr):
+ selected = self.select_cell(pos, dds)
+ if ch != NULL:
+ selected *= self.overlap_cells
+ data.ind[0] = ci + i * nr
+ data.ind[1] = cj + j * nr
+ data.ind[2] = ck + k * nr
+ func(root, data, selected)
+ pos[2] += dds[2]
+ pos[1] += dds[1]
+ pos[0] += dds[0]
+
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
diff -r 59edd14640f7b4ebffb36bd3a1bd9804e63e7b51 -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 yt/geometry/setup.py
--- a/yt/geometry/setup.py
+++ b/yt/geometry/setup.py
@@ -43,6 +43,15 @@
"yt/geometry/oct_container.pxd",
"yt/geometry/selection_routines.pxd",
"yt/geometry/particle_deposit.pxd"])
+ config.add_extension("particle_smooth",
+ ["yt/geometry/particle_smooth.pyx"],
+ include_dirs=["yt/utilities/lib/"],
+ libraries=["m"],
+ depends=["yt/utilities/lib/fp_utils.pxd",
+ "yt/geometry/oct_container.pxd",
+ "yt/geometry/selection_routines.pxd",
+ "yt/geometry/particle_deposit.pxd",
+ "yt/geometry/particle_smooth.pxd"])
config.add_extension("fake_octree",
["yt/geometry/fake_octree.pyx"],
include_dirs=["yt/utilities/lib/"],
https://bitbucket.org/yt_analysis/yt-3.0/commits/ec8858ae1d54/
Changeset: ec8858ae1d54
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-03 23:21:16
Summary: Attempting to simplify SFC range construction, phase 1.
Affected #: 1 file
diff -r 829c7ab5fcfa65ae4eb017060074c6131c7f8b51 -r ec8858ae1d545e27ca5269728c69794781d4f6aa yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -8,6 +8,7 @@
import sys
from yt.geometry.selection_routines cimport SelectorObject, AlwaysSelector
+from yt.utilities.lib.fp_utils cimport imax
from yt.geometry.oct_container cimport \
SparseOctreeContainer
from yt.geometry.oct_visitors cimport \
@@ -550,6 +551,75 @@
artio_fileset_close(handle)
return True
+cdef class ARTIOSFCRangeHandler:
+ cdef public np.int64_t sfc_start
+ cdef public np.int64_t sfc_end
+ cdef public artio_fileset artio_handle
+ cdef public object root_mesh_handler
+ cdef public object octree_handlers
+ cdef public object oct_count
+ cdef artio_fileset_handle *handle
+ cdef np.float64_t DLE[3]
+ cdef np.float64_t DRE[3]
+ cdef np.float64_t dds[3]
+ cdef np.int64_t dims[3]
+
+ def __init__(self, domain_dimensions, # cells
+ domain_left_edge,
+ domain_right_edge,
+ artio_fileset artio_handle,
+ sfc_start, sfc_end):
+ cdef int i
+ self.sfc_start = sfc_start
+ self.sfc_end = sfc_end
+ self.artio_handle = artio_handle
+ self.root_mesh_handler = None
+ self.octree_handlers = {}
+ self.handle = artio_handle.handle
+ self.oct_count = None
+ for i in range(3):
+ self.dims[i] = domain_dimensions[i]
+ self.DLE[i] = domain_left_edge[i]
+ self.DRE[i] = domain_right_edge[i]
+ self.dds[i] = (self.DRE[i] - self.DLE[i])/self.dims[i]
+
+ def construct_mesh(self):
+ cdef int status, level
+ cdef np.int64_t sfc, oc
+ cdef double dpos[3]
+ cdef int num_oct_levels
+ cdef int max_level = self.artio_handle.max_level
+ cdef int *num_octs_per_level = <int *>malloc(
+ (max_level + 1)*sizeof(int))
+ cdef ARTIOOctreeContainer octree
+ cdef np.ndarray[np.int64_t, ndim=1] oct_count
+ oct_count = np.zeros(self.sfc_end - self.sfc_start + 1, dtype="int64")
+ status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
+ self.sfc_end)
+ check_artio_status(status)
+ for sfc in range(self.sfc_start, self.sfc_end + 1):
+ status = artio_grid_read_root_cell_begin( self.handle,
+ sfc, dpos, NULL, &num_oct_levels, num_octs_per_level)
+ check_artio_status(status)
+ if num_oct_levels > 0:
+ oc = 0
+ for level in range(num_oct_levels):
+ oc += num_octs_per_level[level]
+ oct_count[sfc - self.sfc_start] = oc
+ octree = ARTIOOctreeContainer(self.artio_handle, sfc, oc)
+ octree.initialize_mesh(oc, num_oct_levels, num_octs_per_level)
+ self.octree_handlers[sfc] = octree
+ status = artio_grid_read_root_cell_end( self.handle )
+ check_artio_status(status)
+ free(num_octs_per_level)
+ self.root_mesh_handler = ARTIORootMeshContainer(self)
+ self.oct_count = oct_count
+
+ def free_mesh(self):
+ self.octree_handlers.clear()
+ self.root_mesh_handler = None
+ self.oct_count = None
+
def get_coords(artio_fileset handle, np.int64_t s):
cdef int coords[3]
artio_sfc_coords(handle.handle, s, coords)
@@ -575,7 +645,7 @@
np.float64_t *pvars[16]
np.float64_t *svars[16]
- cdef class ARTIOOctreeContainer(SparseOctreeContainer):
+cdef class ARTIOOctreeContainer(SparseOctreeContainer):
# This is a transitory, created-on-demand OctreeContainer. It should not
# be considered to be long-lasting, and during its creation it will read
# the index file. This means that when created it will then be able to
@@ -583,141 +653,80 @@
# the file again, despite knowing the indexing system already. Because of
# this, we will avoid creating it as long as possible.
- cdef public np.int64_t sfc_start
- cdef public np.int64_t sfc_end
+ cdef public np.int64_t sfc
+ cdef public np.int64_t sfc_offset
cdef public artio_fileset artio_handle
cdef Oct **root_octs
cdef np.int64_t *level_indices
- def __init__(self, oct_dimensions, domain_left_edge, domain_right_edge,
- int64_t sfc_start, int64_t sfc_end, artio_fileset artio_handle):
- self.artio_handle = artio_handle
- self.sfc_start = sfc_start
- self.sfc_end = sfc_end
+ def __init__(self, ARTIOSFCRangeHandler range_handler, np.int64_t sfc):
+ self.artio_handle = range_handler.artio_handle
+ self.sfc = sfc
# Note the final argument is partial_coverage, which indicates whether
# or not an Oct can be partially refined.
- super(ARTIOOctreeContainer, self).__init__(oct_dimensions,
- domain_left_edge, domain_right_edge)
+ dims, DLE, DRE = [], [], []
+ for i in range(3):
+ dims.append(range_handler.dims[i])
+ DLE.append(range_handler.DLE[i])
+ DRE.append(range_handler.DRE[i])
+ super(ARTIOOctreeContainer, self).__init__(dims, DLE, DRE)
+ self.artio_handle = range_handler.artio_handle
+ self.sfc_offset = range_handler.sfc_start
self.level_indices = NULL
- self._initialize_root_mesh()
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def _initialize_root_mesh(self):
+ cdef void initialize_mesh(self, np.int64_t oct_count,
+ int num_oct_levels, int *num_octs_per_level):
# We actually will not be initializing the root mesh here, we will be
# initializing the entire mesh between sfc_start and sfc_end.
cdef np.int64_t oct_ind, sfc, tot_octs, ipos
- cdef int i, status, level, num_oct_levels, num_root, num_octs
+ cdef int i, status, level, num_root, num_octs
cdef int num_level_octs
cdef artio_fileset_handle *handle = self.artio_handle.handle
cdef int coords[3]
cdef int max_level = self.artio_handle.max_level
- cdef double *dpos
- cdef double rpos[3]
- cdef int *olevel
- cdef int *num_octs_per_level = <int *>malloc(
- (max_level + 1)*sizeof(int))
+ cdef double dpos[3]
+ cdef np.float64_t f64pos[3]
self.level_indices = <np.int64_t *>malloc(
- (max_level + 1)*sizeof(np.int64_t))
- for i in range(max_level+1):
- self.level_indices[i] = 0
- cdef np.float64_t dds[3]
+ num_oct_levels*sizeof(np.int64_t))
+ # NOTE: We do not cache any SFC ranges here, as we should only ever be
+ # called from within a pre-cached operation in the SFC handler.
+
+ # We only allow one root oct.
+ self.allocate_domains([1, oct_count], 1)
+ pos = np.empty((1, 3), dtype="float64")
+ self.range_handler.sfc
+ artio_sfc_coords(self.artio_handle.handle, self.sfc, coords)
for i in range(3):
- dds[i] = (self.DRE[i] - self.DLE[i])/self.nn[i]
+ pos[0, i] = self.DLE[i] + (coords[i] + 0.5) * self.dds[i]
+ self.add(1, 0, pos)
- status = artio_grid_cache_sfc_range(handle,
- self.sfc_start, self.sfc_end )
- check_artio_status(status)
+ # Now we set up our position array and our level_indices.
+ ipos = 0
+ oct_ind = -1
+ for level in range(num_oct_levels):
+ self.level_indices[level] = ipos
+ ipos += num_octs_per_level[level]
+ oct_ind = imax(oct_ind, num_octs_per_level[level])
+ pos = np.empty((oct_ind, 3), dtype="float64")
- # compute total octs in sfc range (not including root level)
- status = artio_grid_count_octs_in_sfc_range(handle,self.sfc_start,self.sfc_end,&tot_octs)
- check_artio_status(status)
-
- # now determine the number of root octs we touch
- root_octs = {}
- for sfc in range(self.sfc_start, self.sfc_end + 1):
- artio_sfc_coords(handle, sfc, coords)
- for i in range(3):
- coords[i] = <int> (coords[i]/2)
- ipos = (coords[0]*self.nn[1]+coords[1])*self.nn[2]+coords[2]
- root_octs[ipos] = 1
- num_root = len(root_octs)
-
- self.allocate_domains([num_root, tot_octs], num_root)
- pos = np.empty((num_root, 3), dtype="float64")
-
- for sfc in range(self.sfc_start, self.sfc_end + 1):
- artio_sfc_coords(handle, sfc, coords)
- for i in range(3):
- coords[i] = <int> (coords[i]/2)
- ipos = (coords[0]*self.nn[1]+coords[1])*self.nn[2]+coords[2]
- if root_octs[ipos] == 1:
+ # Now we initialize
+ num_octs = 0
+ # Note that we also assume we have already started reading the level.
+ for level in range(1, num_oct_levels+1):
+ status = artio_grid_read_level_begin(handle, level)
+ check_artio_status(status)
+ for oct_ind in range(num_octs_per_level[level - 1]):
+ status = artio_grid_read_oct(handle, dpos, NULL, NULL)
for i in range(3):
- pos[self.level_indices[0], i] = \
- self.DLE[i] + (coords[i]+0.5)*dds[i]
- self.level_indices[0] += 1
- root_octs[ipos] = 0
- del root_octs
-
- # add all root octs
- self.add(1, 0, pos)
- del pos
-
- # now scan through grid file to load oct positions
- if tot_octs > 0:
- dpos = <double *>malloc(3*tot_octs*sizeof(double))
- olevel = <int *>malloc(tot_octs*sizeof(int))
-
- num_octs = 0
- for sfc in range(self.sfc_start, self.sfc_end + 1):
- status = artio_grid_read_root_cell_begin( handle, sfc,
- rpos, NULL, &num_oct_levels, num_octs_per_level)
+ pos[oct_ind, i] = dpos[i]
check_artio_status(status)
- for level in range(1, num_oct_levels+1):
- self.level_indices[level] += num_octs_per_level[level - 1]
- status = artio_grid_read_level_begin(handle, level)
- check_artio_status(status)
- for oct_ind in range(num_octs_per_level[level - 1]):
- status = artio_grid_read_oct(handle, &dpos[3*num_octs], NULL, NULL)
- check_artio_status(status)
- olevel[num_octs] = level
- num_octs += 1
- status = artio_grid_read_level_end(handle)
- check_artio_status(status)
- status = artio_grid_read_root_cell_end(handle)
- check_artio_status(status)
-
- num_level_octs = 0
- for level in range(1, max_level+1):
- if self.level_indices[level] > num_level_octs:
- num_level_octs = self.level_indices[level]
- pos = np.empty((num_level_octs, 3), dtype="float64")
- for level in range(1, max_level+1):
- if self.level_indices[level] == 0: continue
- num_level_octs = 0
- for oct_ind in range(num_octs):
- if olevel[oct_ind] == level:
- for i in range(3):
- pos[num_level_octs,i] = dpos[3*oct_ind+i]
- num_level_octs += 1
- assert(num_level_octs == self.level_indices[level])
- num_level_octs = self.add( 2, level, pos[:num_level_octs, :])
- if num_level_octs != self.level_indices[level]:
- print self.sfc_start, self.sfc_end
- print level, self.level_indices[level], num_level_octs
- raise RuntimeError
-
- free(olevel)
- free(dpos)
- free(num_octs_per_level)
+ status = artio_grid_read_level_end(handle)
+ check_artio_status(status)
+ self.add(2, level, pos[:num_octs_per_level[level - 1]])
- num_octs = 0
- for level in range(max_level + 1):
- num_level_octs = self.level_indices[level]
- self.level_indices[level] = num_octs
- num_octs += num_level_octs
-
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
@@ -988,24 +997,21 @@
cdef np.uint64_t sfc_end
cdef public object _last_mask
cdef public object _last_selector_id
+ cdef ARTIOSFCRangeHandler range_handler
- def __init__(self, domain_dimensions, # cells
- domain_left_edge,
- domain_right_edge,
- artio_fileset artio_handle,
- sfc_start, sfc_end):
- self._last_selector_id = None
- self._last_mask = None
- self.artio_handle = artio_handle
- self.handle = artio_handle.handle
+ def __init__(self, ARTIOSFCRangeHandler range_handler):
cdef int i
for i in range(3):
- self.dims[i] = domain_dimensions[i]
- self.DLE[i] = domain_left_edge[i]
- self.DRE[i] = domain_right_edge[i]
- self.dds[i] = (self.DRE[i] - self.DLE[i])/self.dims[i]
- self.sfc_start = sfc_start
- self.sfc_end = sfc_end
+ self.DLE[i] = range_handler.DLE[i]
+ self.DRE[i] = range_handler.DRE[i]
+ self.dims[i] = range_handler.dims[i]
+ self.dds[i] = range_handler.dds[i]
+ self.handle = range_handler.handle
+ self.artio_handle = range_handler.artio_handle
+ self._last_mask = self._last_selector_id = None
+ self.sfc_start = range_handler.sfc_start
+ self.sfc_end = range_handler.sfc_end
+ self.range_handler = range_handler
@cython.cdivision(True)
cdef np.int64_t pos_to_sfc(self, np.float64_t pos[3]) nogil:
@@ -1149,18 +1155,8 @@
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def mask(self, SelectorObject selector, np.int64_t num_octs = -1):
- if self._last_selector_id == hash(selector):
- return self._last_mask
- else:
- return self.mask2(selector,num_octs)
-
- @cython.boundscheck(False)
- @cython.wraparound(False)
- @cython.cdivision(True)
- def mask2(self, SelectorObject selector, np.int64_t num_cells = -1):
- cdef int i, status
- cdef double dpos[3]
+ def mask(self, SelectorObject selector, np.int64_t num_cells = -1):
+ cdef int i
cdef np.float64_t pos[3]
cdef np.int64_t sfc
if self._last_selector_id == hash(selector):
@@ -1169,37 +1165,12 @@
# We need to count, but this process will only occur one time,
# since num_cells will later be cached.
num_cells = self.sfc_end - self.sfc_start + 1
- cdef np.ndarray[np.uint8_t, ndim=1] mask
- cdef int num_oct_levels
- cdef int max_level = self.artio_handle.max_level
- cdef int *num_octs_per_level = <int *>malloc(
- (max_level + 1)*sizeof(int))
mask = np.zeros((num_cells), dtype="uint8")
- status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
- self.sfc_end)
- check_artio_status(status)
for sfc in range(self.sfc_start, self.sfc_end + 1):
- # We check if the SFC is in our selector, and if so, we copy
- # Note that because we initialize to zeros, we can just continue if
- # it's not included.
- #self.sfc_to_pos(sfc, pos)
- #if selector.select_cell(pos, self.dds) == 0: continue
- # Now we just need to check if the cells are refined.
- status = artio_grid_read_root_cell_begin( self.handle,
- sfc, dpos, NULL, &num_oct_levels, num_octs_per_level)
- check_artio_status(status)
- status = artio_grid_read_root_cell_end( self.handle )
- check_artio_status(status)
- # If refined, we skip
- if num_oct_levels > 0: continue
- # check selector
- for i in range(3):
- pos[i] = dpos[i]
+ if self.range_handler.oct_count[sfc - self.sfc_start] > 0: continue
+ self.sfc_to_pos(sfc, pos)
if selector.select_cell(pos, self.dds) == 0: continue
mask[sfc - self.sfc_start] = 1
- #status = artio_grid_clear_sfc_cache(self.handle)
- #check_artio_status(status)
- free(num_octs_per_level)
self._last_mask = mask.astype("bool")
self._last_selector_id = hash(selector)
return self._last_mask
https://bitbucket.org/yt_analysis/yt-3.0/commits/5a8ce45e8827/
Changeset: 5a8ce45e8827
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-04 16:05:39
Summary: Continuing refactor. Moving toward fill_sfc working.
Affected #: 2 files
diff -r ec8858ae1d545e27ca5269728c69794781d4f6aa -r 5a8ce45e8827967b3b6e63bb33bdec3d7ed9cc75 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -606,7 +606,7 @@
for level in range(num_oct_levels):
oc += num_octs_per_level[level]
oct_count[sfc - self.sfc_start] = oc
- octree = ARTIOOctreeContainer(self.artio_handle, sfc, oc)
+ octree = ARTIOOctreeContainer(self, sfc)
octree.initialize_mesh(oc, num_oct_levels, num_octs_per_level)
self.octree_handlers[sfc] = octree
status = artio_grid_read_root_cell_end( self.handle )
@@ -657,7 +657,6 @@
cdef public np.int64_t sfc_offset
cdef public artio_fileset artio_handle
cdef Oct **root_octs
- cdef np.int64_t *level_indices
def __init__(self, ARTIOSFCRangeHandler range_handler, np.int64_t sfc):
self.artio_handle = range_handler.artio_handle
@@ -666,17 +665,16 @@
# or not an Oct can be partially refined.
dims, DLE, DRE = [], [], []
for i in range(3):
- dims.append(range_handler.dims[i])
+ dims.append(range_handler.dims[i]/2)
DLE.append(range_handler.DLE[i])
DRE.append(range_handler.DRE[i])
super(ARTIOOctreeContainer, self).__init__(dims, DLE, DRE)
self.artio_handle = range_handler.artio_handle
self.sfc_offset = range_handler.sfc_start
- self.level_indices = NULL
- @cython.boundscheck(False)
- @cython.wraparound(False)
- @cython.cdivision(True)
+ #@cython.boundscheck(False)
+ #@cython.wraparound(False)
+ #@cython.cdivision(True)
cdef void initialize_mesh(self, np.int64_t oct_count,
int num_oct_levels, int *num_octs_per_level):
# We actually will not be initializing the root mesh here, we will be
@@ -688,28 +686,22 @@
cdef int coords[3]
cdef int max_level = self.artio_handle.max_level
cdef double dpos[3]
- cdef np.float64_t f64pos[3]
- self.level_indices = <np.int64_t *>malloc(
- num_oct_levels*sizeof(np.int64_t))
+ cdef np.float64_t f64pos[3], dds[3]
# NOTE: We do not cache any SFC ranges here, as we should only ever be
# called from within a pre-cached operation in the SFC handler.
# We only allow one root oct.
self.allocate_domains([1, oct_count], 1)
pos = np.empty((1, 3), dtype="float64")
- self.range_handler.sfc
artio_sfc_coords(self.artio_handle.handle, self.sfc, coords)
for i in range(3):
- pos[0, i] = self.DLE[i] + (coords[i] + 0.5) * self.dds[i]
+ dds[i] = (self.DRE[i] - self.DLE[i]) / (self.nn[i]*2)
+ pos[0, i] = self.DLE[i] + (coords[i] + 0.5) * dds[i]
self.add(1, 0, pos)
- # Now we set up our position array and our level_indices.
- ipos = 0
oct_ind = -1
- for level in range(num_oct_levels):
- self.level_indices[level] = ipos
- ipos += num_octs_per_level[level]
- oct_ind = imax(oct_ind, num_octs_per_level[level])
+ for level in range(1, num_oct_levels+1):
+ oct_ind = imax(oct_ind, num_octs_per_level[level - 1])
pos = np.empty((oct_ind, 3), dtype="float64")
# Now we initialize
@@ -725,7 +717,7 @@
check_artio_status(status)
status = artio_grid_read_level_end(handle)
check_artio_status(status)
- self.add(2, level, pos[:num_octs_per_level[level - 1]])
+ self.add(2, level, pos[:num_octs_per_level[level - 1],:])
@cython.boundscheck(False)
@cython.wraparound(False)
@@ -755,45 +747,32 @@
nf * sizeof(int))
cdef np.float32_t **field_vals = <np.float32_t**> malloc(
nf * sizeof(np.float32_t*))
- cdef np.int64_t *local_ind = <np.int64_t *> malloc(
- (max_level + 1) * sizeof(np.int64_t))
- for i in range(max_level + 1):
- # This will help us keep track of where we are in the flattened
- # array, which will be indexed by file_ind.
- local_ind[i] = self.level_indices[i]
source_arrays = []
for i in range(nf):
field_ind[i] = field_indices[i]
- # This zeros should be an empty once we handle the root grid
- source = np.zeros((self.nocts, 8), dtype="float32")
+ # Note that we subtract one, because we're not using the root mesh.
+ source = np.zeros((self.nocts - 1, 8), dtype="float32")
source_arrays.append(source)
field_vals[i] = <np.float32_t*> source.data
# First we need to walk the mesh in the file. Then we fill in the dest
# location based on the file index.
- status = artio_grid_cache_sfc_range(handle,
- self.sfc_start, self.sfc_end )
+ status = artio_grid_read_root_cell_begin( handle, self.sfc,
+ dpos, NULL, &num_oct_levels, num_octs_per_level)
check_artio_status(status)
- for sfc in range(self.sfc_start, self.sfc_end + 1):
- status = artio_grid_read_root_cell_begin( handle, sfc,
- dpos, NULL, &num_oct_levels, num_octs_per_level)
+ for level in range(1, num_oct_levels+1):
+ status = artio_grid_read_level_begin(handle, level)
check_artio_status(status)
- for level in range(1, num_oct_levels+1):
- status = artio_grid_read_level_begin(handle, level)
- check_artio_status(status)
- for oct_ind in range(num_octs_per_level[level - 1]):
- status = artio_grid_read_oct(handle, dpos, grid_variables, NULL)
- check_artio_status(status)
- for j in range(8):
- for i in range(nf):
- field_vals[i][local_ind[level] * 8 + j] = \
- grid_variables[ngv * j + i]
- local_ind[level] += 1
- status = artio_grid_read_level_end(handle)
+ for oct_ind in range(num_octs_per_level[level - 1]):
+ status = artio_grid_read_oct(handle, dpos, grid_variables, NULL)
check_artio_status(status)
- status = artio_grid_read_root_cell_end( handle )
+ for j in range(8):
+ for i in range(nf):
+ field_vals[i][oct_ind*8+j] = grid_variables[ngv*j+i]
+ status = artio_grid_read_level_end(handle)
check_artio_status(status)
+ status = artio_grid_read_root_cell_end( handle )
+ check_artio_status(status)
# Now we have all our sources.
- artio_grid_clear_sfc_cache(handle)
for j in range(nf):
dest = dest_fields[j]
source = source_arrays[j]
@@ -803,7 +782,6 @@
dest[i] = source[file_inds[i] + oct_ind, cell_inds[i]]
free(field_ind)
free(field_vals)
- free(local_ind)
free(grid_variables)
free(num_octs_per_level)
diff -r ec8858ae1d545e27ca5269728c69794781d4f6aa -r 5a8ce45e8827967b3b6e63bb33bdec3d7ed9cc75 yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -30,7 +30,7 @@
from .definitions import yt_to_art, art_to_yt, ARTIOconstants
from _artio_caller import \
artio_is_valid, artio_fileset, ARTIOOctreeContainer, \
- ARTIORootMeshContainer
+ ARTIORootMeshContainer, ARTIOSFCRangeHandler
import _artio_caller
from yt.utilities.definitions import \
mpc_conversion, sec_conversion
@@ -50,6 +50,8 @@
from yt.data_objects.field_info_container import \
FieldInfoContainer, NullFunc
+
+
class ARTIOOctreeSubset(OctreeSubset):
_domain_offset = 0
domain_id = 2
@@ -57,11 +59,11 @@
_type_name = 'octree_subset'
_num_zones = 2
- def __init__(self, base_region, sfc_start, sfc_end, pf):
+ def __init__(self, base_region, sfc, root_mesh, pf):
self.field_data = YTFieldData()
self.field_parameters = {}
- self.sfc_start = sfc_start
- self.sfc_end = sfc_end
+ self.sfc = sfc
+ self.root_mesh = root_mesh
self.pf = pf
self.hierarchy = self.pf.hierarchy
self._last_mask = None
@@ -70,17 +72,7 @@
self._current_fluid_type = self.pf.default_fluid_type
self.base_region = base_region
self.base_selector = base_region.selector
-
- _oct_handler = None
-
- @property
- def oct_handler(self):
- if self._oct_handler is None:
- self._oct_handler = ARTIOOctreeContainer(
- self.pf.domain_dimensions/2, # Octs, not cells
- self.pf.domain_left_edge, self.pf.domain_right_edge,
- self.sfc_start, self.sfc_end, self.pf._handle)
- return self._oct_handler
+ self.oct_handler = root_mesh.octree_handlers[sfc]
@property
def min_ind(self):
@@ -142,15 +134,20 @@
_selector_module = _artio_caller
domain_id = 1
- @property
- def oct_handler(self):
- if self._oct_handler is None:
- self._oct_handler = ARTIORootMeshContainer(
- self.pf.domain_dimensions, # Cells, not octs
- self.pf.domain_left_edge, self.pf.domain_right_edge,
- self.pf._handle,
- self.sfc_start, self.sfc_end)
- return self._oct_handler
+ def __init__(self, base_region, sfc_start, sfc_end, oct_handler, pf):
+ self.field_data = YTFieldData()
+ self.field_parameters = {}
+ self.sfc_start = sfc_start
+ self.sfc_end = sfc_end
+ self.oct_handler = oct_handler
+ self.pf = pf
+ self.hierarchy = self.pf.hierarchy
+ self._last_mask = None
+ self._last_selector_id = None
+ self._current_particle_type = 'all'
+ self._current_fluid_type = self.pf.default_fluid_type
+ self.base_region = base_region
+ self.base_selector = base_region.selector
def fill(self, fields, selector):
# We know how big these will be.
@@ -356,12 +353,17 @@
list_sfc_ranges = self.pf._handle.root_sfc_ranges(
dobj.selector)
ci = []
- if domain != 2:
- ci += [ARTIORootMeshSubset(base_region, start, end, self.pf)
- for (start, end) in list_sfc_ranges]
- if domain != 1:
- ci += [ARTIOOctreeSubset(base_region, start, end, self.pf)
- for (start, end) in list_sfc_ranges]
+ for (start, end) in list_sfc_ranges:
+ range_handler = ARTIOSFCRangeHandler(
+ self.pf.domain_dimensions,
+ self.pf.domain_left_edge, self.pf.domain_right_edge,
+ self.pf._handle, start, end)
+ range_handler.construct_mesh()
+ ci.append(ARTIORootMeshSubset(base_region, start, end,
+ range_handler.root_mesh_handler, self.pf))
+ for sfc in sorted(range_handler.octree_handlers):
+ ci.append(ARTIOOctreeSubset(base_region, sfc,
+ range_handler, self.pf))
dobj._chunk_info = ci
if len(list_sfc_ranges) > 1:
mylog.info("Created %d chunks for ARTIO" % len(list_sfc_ranges))
https://bitbucket.org/yt_analysis/yt-3.0/commits/cbb3151ddfa6/
Changeset: cbb3151ddfa6
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-04 19:54:12
Summary: Removing some Cython items and fixing the forest of octs info.
Affected #: 2 files
diff -r 5a8ce45e8827967b3b6e63bb33bdec3d7ed9cc75 -r cbb3151ddfa636f0e8c1c199cef9c566b01b64ba yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -657,6 +657,8 @@
cdef public np.int64_t sfc_offset
cdef public artio_fileset artio_handle
cdef Oct **root_octs
+ cdef np.int64_t level_indices[32]
+ cdef np.int64_t oct_count[32]
def __init__(self, ARTIOSFCRangeHandler range_handler, np.int64_t sfc):
self.artio_handle = range_handler.artio_handle
@@ -664,8 +666,13 @@
# Note the final argument is partial_coverage, which indicates whether
# or not an Oct can be partially refined.
dims, DLE, DRE = [], [], []
+ for i in range(32):
+ self.level_indices[i] = 0
+ self.oct_count[i] = 0
for i in range(3):
- dims.append(range_handler.dims[i]/2)
+ # range_handler has dims in cells, which is the same as the number
+ # of possible octs. This is because we have a forest of octrees.
+ dims.append(range_handler.dims[i])
DLE.append(range_handler.DLE[i])
DRE.append(range_handler.DRE[i])
super(ARTIOOctreeContainer, self).__init__(dims, DLE, DRE)
@@ -691,37 +698,34 @@
# called from within a pre-cached operation in the SFC handler.
# We only allow one root oct.
- self.allocate_domains([1, oct_count], 1)
+ self.allocate_domains([oct_count], 1)
pos = np.empty((1, 3), dtype="float64")
- artio_sfc_coords(self.artio_handle.handle, self.sfc, coords)
- for i in range(3):
- dds[i] = (self.DRE[i] - self.DLE[i]) / (self.nn[i]*2)
- pos[0, i] = self.DLE[i] + (coords[i] + 0.5) * dds[i]
- self.add(1, 0, pos)
oct_ind = -1
+ ipos = 0
for level in range(1, num_oct_levels+1):
oct_ind = imax(oct_ind, num_octs_per_level[level - 1])
+ self.level_indices[level] = ipos
+ ipos += num_octs_per_level[level - 1]
pos = np.empty((oct_ind, 3), dtype="float64")
# Now we initialize
- num_octs = 0
# Note that we also assume we have already started reading the level.
- for level in range(1, num_oct_levels+1):
- status = artio_grid_read_level_begin(handle, level)
+ for level in range(num_oct_levels):
+ status = artio_grid_read_level_begin(handle, level + 1)
check_artio_status(status)
- for oct_ind in range(num_octs_per_level[level - 1]):
+ for oct_ind in range(num_octs_per_level[level]):
status = artio_grid_read_oct(handle, dpos, NULL, NULL)
for i in range(3):
pos[oct_ind, i] = dpos[i]
check_artio_status(status)
status = artio_grid_read_level_end(handle)
check_artio_status(status)
- self.add(2, level, pos[:num_octs_per_level[level - 1],:])
+ nadded = self.add(1, level, pos[:num_octs_per_level[level],:])
- @cython.boundscheck(False)
- @cython.wraparound(False)
- @cython.cdivision(True)
+ #@cython.boundscheck(False)
+ #@cython.wraparound(False)
+ #@cython.cdivision(True)
def fill_sfc(self,
np.ndarray[np.uint8_t, ndim=1] levels,
np.ndarray[np.uint8_t, ndim=1] cell_inds,
@@ -730,7 +734,7 @@
cdef np.ndarray[np.float32_t, ndim=2] source
cdef np.ndarray[np.float64_t, ndim=1] dest
cdef int n, status, i, di, num_oct_levels, nf, ngv, max_level
- cdef np.int64_t sfc
+ cdef np.int64_t sfc, ipos
cdef np.float64_t val
cdef artio_fileset_handle *handle = self.artio_handle.handle
cdef double dpos[3]
@@ -751,7 +755,7 @@
for i in range(nf):
field_ind[i] = field_indices[i]
# Note that we subtract one, because we're not using the root mesh.
- source = np.zeros((self.nocts - 1, 8), dtype="float32")
+ source = np.zeros((self.nocts, 8), dtype="float32")
source_arrays.append(source)
field_vals[i] = <np.float32_t*> source.data
# First we need to walk the mesh in the file. Then we fill in the dest
@@ -759,6 +763,7 @@
status = artio_grid_read_root_cell_begin( handle, self.sfc,
dpos, NULL, &num_oct_levels, num_octs_per_level)
check_artio_status(status)
+ ipos = 0
for level in range(1, num_oct_levels+1):
status = artio_grid_read_level_begin(handle, level)
check_artio_status(status)
@@ -767,7 +772,8 @@
check_artio_status(status)
for j in range(8):
for i in range(nf):
- field_vals[i][oct_ind*8+j] = grid_variables[ngv*j+i]
+ field_vals[i][ipos*8+j] = grid_variables[ngv*j+i]
+ ipos += 1
status = artio_grid_read_level_end(handle)
check_artio_status(status)
status = artio_grid_read_root_cell_end( handle )
@@ -778,8 +784,8 @@
source = source_arrays[j]
for i in range(levels.shape[0]):
if levels[i] == 0: continue
- oct_ind = self.level_indices[levels[i]]
- dest[i] = source[file_inds[i] + oct_ind, cell_inds[i]]
+ oct_ind = self.level_indices[levels[i] - 1]
+ dest[i] = source[file_inds[i], cell_inds[i]]
free(field_ind)
free(field_vals)
free(grid_variables)
diff -r 5a8ce45e8827967b3b6e63bb33bdec3d7ed9cc75 -r cbb3151ddfa636f0e8c1c199cef9c566b01b64ba yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -363,7 +363,7 @@
range_handler.root_mesh_handler, self.pf))
for sfc in sorted(range_handler.octree_handlers):
ci.append(ARTIOOctreeSubset(base_region, sfc,
- range_handler, self.pf))
+ range_handler, self.pf))
dobj._chunk_info = ci
if len(list_sfc_ranges) > 1:
mylog.info("Created %d chunks for ARTIO" % len(list_sfc_ranges))
https://bitbucket.org/yt_analysis/yt-3.0/commits/51c59380d126/
Changeset: 51c59380d126
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-04 20:00:22
Summary: Volume metrics are now correct.
Affected #: 1 file
diff -r cbb3151ddfa636f0e8c1c199cef9c566b01b64ba -r 51c59380d1261fb59ca69069eb08421791f57ea9 yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -54,7 +54,7 @@
class ARTIOOctreeSubset(OctreeSubset):
_domain_offset = 0
- domain_id = 2
+ domain_id = 1
_con_args = ("base_region", "sfc_start", "sfc_end", "pf")
_type_name = 'octree_subset'
_num_zones = 2
https://bitbucket.org/yt_analysis/yt-3.0/commits/f8d1c6dedbc4/
Changeset: f8d1c6dedbc4
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-04 21:12:45
Summary: A few more ordering fixes; not quite there yet.
Affected #: 1 file
diff -r 51c59380d1261fb59ca69069eb08421791f57ea9 -r f8d1c6dedbc46aba22077086878d7aeb4681112c yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -763,17 +763,17 @@
status = artio_grid_read_root_cell_begin( handle, self.sfc,
dpos, NULL, &num_oct_levels, num_octs_per_level)
check_artio_status(status)
- ipos = 0
- for level in range(1, num_oct_levels+1):
- status = artio_grid_read_level_begin(handle, level)
+ for level in range(num_oct_levels):
+ status = artio_grid_read_level_begin(handle, level + 1)
check_artio_status(status)
- for oct_ind in range(num_octs_per_level[level - 1]):
+ ipos = self.level_indices[level]
+ for oct_ind in range(num_octs_per_level[level]):
status = artio_grid_read_oct(handle, dpos, grid_variables, NULL)
check_artio_status(status)
for j in range(8):
for i in range(nf):
- field_vals[i][ipos*8+j] = grid_variables[ngv*j+i]
- ipos += 1
+ field_vals[i][(ipos+oct_ind)*8+j] = \
+ grid_variables[ngv*j+field_ind[i]]
status = artio_grid_read_level_end(handle)
check_artio_status(status)
status = artio_grid_read_root_cell_end( handle )
@@ -783,9 +783,9 @@
dest = dest_fields[j]
source = source_arrays[j]
for i in range(levels.shape[0]):
- if levels[i] == 0: continue
- oct_ind = self.level_indices[levels[i] - 1]
- dest[i] = source[file_inds[i], cell_inds[i]]
+ level = levels[i]
+ oct_ind = self.level_indices[level]
+ dest[i] = source[file_inds[i] + oct_ind, cell_inds[i]]
free(field_ind)
free(field_vals)
free(grid_variables)
https://bitbucket.org/yt_analysis/yt-3.0/commits/a1539bc332ac/
Changeset: a1539bc332ac
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-04 21:22:15
Summary: Fix off-by-one, and correcting ires.
Note that the change to ires may need to be reverted, once the ForestOfOctrees
system has been created and unified.
Affected #: 3 files
diff -r f8d1c6dedbc46aba22077086878d7aeb4681112c -r a1539bc332acd405f038e43b2af124495001c0ca yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -678,6 +678,7 @@
super(ARTIOOctreeContainer, self).__init__(dims, DLE, DRE)
self.artio_handle = range_handler.artio_handle
self.sfc_offset = range_handler.sfc_start
+ self.level_offset = 1
#@cython.boundscheck(False)
#@cython.wraparound(False)
@@ -703,10 +704,10 @@
oct_ind = -1
ipos = 0
- for level in range(1, num_oct_levels+1):
- oct_ind = imax(oct_ind, num_octs_per_level[level - 1])
+ for level in range(num_oct_levels):
+ oct_ind = imax(oct_ind, num_octs_per_level[level])
self.level_indices[level] = ipos
- ipos += num_octs_per_level[level - 1]
+ ipos += num_octs_per_level[level]
pos = np.empty((oct_ind, 3), dtype="float64")
# Now we initialize
diff -r f8d1c6dedbc46aba22077086878d7aeb4681112c -r a1539bc332acd405f038e43b2af124495001c0ca yt/geometry/oct_container.pxd
--- a/yt/geometry/oct_container.pxd
+++ b/yt/geometry/oct_container.pxd
@@ -67,6 +67,7 @@
cdef Oct ****root_mesh
cdef oct_visitor_function *fill_func
cdef int partial_coverage
+ cdef int level_offset
cdef int nn[3]
cdef np.uint8_t oref
cdef np.float64_t DLE[3], DRE[3]
diff -r f8d1c6dedbc46aba22077086878d7aeb4681112c -r a1539bc332acd405f038e43b2af124495001c0ca yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -105,6 +105,7 @@
for i in range(3):
self.nn[i] = oct_domain_dimensions[i]
self.max_domain = -1
+ self.level_offset = 0
p = 0
self.nocts = 0 # Increment when initialized
for i in range(3):
@@ -382,6 +383,7 @@
@cython.cdivision(True)
def ires(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
+ cdef int i
if num_cells == -1:
num_cells = selector.count_oct_cells(self, domain_id)
cdef OctVisitorData data
@@ -391,6 +393,9 @@
res = np.empty(num_cells, dtype="int64")
data.array = <void *> res.data
self.visit_all_octs(selector, oct_visitors.ires_octs, &data)
+ if self.level_offset > 0:
+ for i in range(num_cells):
+ res[i] += self.level_offset
return res
@cython.boundscheck(False)
@@ -664,6 +669,7 @@
for i in range(3):
self.nn[i] = domain_dimensions[i]
self.max_domain = -1
+ self.level_offset = 0
self.nocts = 0 # Increment when initialized
self.root_mesh = NULL
self.root_nodes = NULL
https://bitbucket.org/yt_analysis/yt-3.0/commits/8b5cb33c1e3e/
Changeset: 8b5cb33c1e3e
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-04 22:57:33
Summary: Fixing _con_args and fixing spatial data selection.
Affected #: 1 file
diff -r a1539bc332acd405f038e43b2af124495001c0ca -r 8b5cb33c1e3e0303dc816e305f48aa02308afca5 yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -55,14 +55,14 @@
class ARTIOOctreeSubset(OctreeSubset):
_domain_offset = 0
domain_id = 1
- _con_args = ("base_region", "sfc_start", "sfc_end", "pf")
+ _con_args = ("base_region", "sfc", "root_mesh", "pf")
_type_name = 'octree_subset'
_num_zones = 2
def __init__(self, base_region, sfc, root_mesh, pf):
self.field_data = YTFieldData()
self.field_parameters = {}
- self.sfc = sfc
+ self.sfc = self.sfc_start = self.sfc_end = sfc
self.root_mesh = root_mesh
self.pf = pf
self.hierarchy = self.pf.hierarchy
@@ -130,6 +130,7 @@
# only manage the root mesh.
class ARTIORootMeshSubset(ARTIOOctreeSubset):
_num_zones = 1
+ _con_args = ("base_region", "sfc_start", "sfc_end", "oct_handler", "pf")
_type_name = 'sfc_subset'
_selector_module = _artio_caller
domain_id = 1
@@ -341,7 +342,7 @@
base_region = getattr(dobj, "base_region", dobj)
sfc_start = getattr(dobj, "sfc_start", None)
sfc_end = getattr(dobj, "sfc_end", None)
- domain = getattr(dobj, "domain_id", 0)
+ nz = getattr(dobj, "_num_zones", 0)
if all_data:
mylog.debug("Selecting entire artio domain")
list_sfc_ranges = self.pf._handle.root_sfc_ranges_all()
@@ -359,11 +360,13 @@
self.pf.domain_left_edge, self.pf.domain_right_edge,
self.pf._handle, start, end)
range_handler.construct_mesh()
- ci.append(ARTIORootMeshSubset(base_region, start, end,
- range_handler.root_mesh_handler, self.pf))
- for sfc in sorted(range_handler.octree_handlers):
- ci.append(ARTIOOctreeSubset(base_region, sfc,
- range_handler, self.pf))
+ if nz != 2:
+ ci.append(ARTIORootMeshSubset(base_region, start, end,
+ range_handler.root_mesh_handler, self.pf))
+ if nz != 1:
+ for sfc in sorted(range_handler.octree_handlers):
+ ci.append(ARTIOOctreeSubset(base_region, sfc,
+ range_handler, self.pf))
dobj._chunk_info = ci
if len(list_sfc_ranges) > 1:
mylog.info("Created %d chunks for ARTIO" % len(list_sfc_ranges))
https://bitbucket.org/yt_analysis/yt-3.0/commits/916e871601ba/
Changeset: 916e871601ba
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-04 23:10:02
Summary: Enabling some Cython optimizations.
Affected #: 1 file
diff -r 8b5cb33c1e3e0303dc816e305f48aa02308afca5 -r 916e871601ba2ce1db6bb52df20faec0859b6075 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -1,7 +1,3 @@
-#cython: profile=True
-"""
-
-"""
cimport cython
import numpy as np
cimport numpy as np
@@ -680,9 +676,9 @@
self.sfc_offset = range_handler.sfc_start
self.level_offset = 1
- #@cython.boundscheck(False)
- #@cython.wraparound(False)
- #@cython.cdivision(True)
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
cdef void initialize_mesh(self, np.int64_t oct_count,
int num_oct_levels, int *num_octs_per_level):
# We actually will not be initializing the root mesh here, we will be
@@ -724,9 +720,9 @@
check_artio_status(status)
nadded = self.add(1, level, pos[:num_octs_per_level[level],:])
- #@cython.boundscheck(False)
- #@cython.wraparound(False)
- #@cython.cdivision(True)
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
def fill_sfc(self,
np.ndarray[np.uint8_t, ndim=1] levels,
np.ndarray[np.uint8_t, ndim=1] cell_inds,
https://bitbucket.org/yt_analysis/yt-3.0/commits/9a886dfddffb/
Changeset: 9a886dfddffb
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-04 23:19:14
Summary: A few optimizations for speed of the mask() function.
Affected #: 1 file
diff -r 916e871601ba2ce1db6bb52df20faec0859b6075 -r 9a886dfddffbd92bfbdf427d22922172cb56f809 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -1140,6 +1140,7 @@
cdef int i
cdef np.float64_t pos[3]
cdef np.int64_t sfc
+ cdef np.ndarray[np.int64_t, ndim=1] oct_count
if self._last_selector_id == hash(selector):
return self._last_mask
if num_cells == -1:
@@ -1147,8 +1148,9 @@
# since num_cells will later be cached.
num_cells = self.sfc_end - self.sfc_start + 1
mask = np.zeros((num_cells), dtype="uint8")
+ oct_count = self.range_handler.oct_count
for sfc in range(self.sfc_start, self.sfc_end + 1):
- if self.range_handler.oct_count[sfc - self.sfc_start] > 0: continue
+ if oct_count[sfc - self.sfc_start] > 0: continue
self.sfc_to_pos(sfc, pos)
if selector.select_cell(pos, self.dds) == 0: continue
mask[sfc - self.sfc_start] = 1
https://bitbucket.org/yt_analysis/yt-3.0/commits/550cad9d01b9/
Changeset: 550cad9d01b9
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-05 02:50:59
Summary: Declare these variables in Cython for speedup.
Affected #: 1 file
diff -r 9a886dfddffbd92bfbdf427d22922172cb56f809 -r 550cad9d01b9f2b9fb344b186207cd0fefd01257 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -731,6 +731,7 @@
cdef np.ndarray[np.float32_t, ndim=2] source
cdef np.ndarray[np.float64_t, ndim=1] dest
cdef int n, status, i, di, num_oct_levels, nf, ngv, max_level
+ cdef int level, j, oct_ind
cdef np.int64_t sfc, ipos
cdef np.float64_t val
cdef artio_fileset_handle *handle = self.artio_handle.handle
https://bitbucket.org/yt_analysis/yt-3.0/commits/0d9bfae7d95f/
Changeset: 0d9bfae7d95f
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-05 14:53:32
Summary: Initial refactor of key methods for SparseOctreeContainer.
Affected #: 2 files
diff -r 550cad9d01b9f2b9fb344b186207cd0fefd01257 -r 0d9bfae7d95f050ae4f799cad06fc1140bb93635 yt/geometry/oct_container.pxd
--- a/yt/geometry/oct_container.pxd
+++ b/yt/geometry/oct_container.pxd
@@ -92,6 +92,8 @@
cdef void *tree_root
cdef int num_root
cdef int max_root
+ cdef void key_to_ipos(self, np.int64_t key, np.int64_t pos[3])
+ cdef np.int64_t ipos_to_key(self, int pos[3])
cdef class RAMSESOctreeContainer(SparseOctreeContainer):
pass
diff -r 550cad9d01b9f2b9fb344b186207cd0fefd01257 -r 0d9bfae7d95f050ae4f799cad06fc1140bb93635 yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -684,9 +684,7 @@
cdef int get_root(self, int ind[3], Oct **o):
o[0] = NULL
cdef int i
- cdef np.int64_t key = 0
- for i in range(3):
- key |= ((<np.int64_t>ind[i]) << 20 * (2 - i))
+ cdef np.int64_t key = self.ipos_to_key(ind)
cdef OctKey okey, **oresult
okey.key = key
okey.node = NULL
@@ -695,6 +693,25 @@
if oresult != NULL:
o[0] = oresult[0].node
+ cdef void key_to_ipos(self, np.int64_t key, np.int64_t pos[3]):
+ # Note: this is the result of doing
+ # ukey = 0
+ # for i in range(20):
+ # ukey |= (1 << i)
+ cdef np.int64_t ukey = 1048575
+ cdef int j
+ for j in range(3):
+ pos[2 - j] = (key & ukey)
+ key = key >> 20
+
+ cdef np.int64_t ipos_to_key(self, int pos[3]):
+ # We (hope) that 20 bits is enough for each index.
+ cdef int i
+ cdef np.int64_t key = 0
+ for i in range(3):
+ key |= (pos[i] << 20 * (2 - i))
+ return key
+
@cython.cdivision(True)
cdef void visit_all_octs(self, SelectorObject selector,
oct_visitor_function *func,
@@ -710,15 +727,10 @@
dds[i] = (self.DRE[i] - self.DLE[i]) / self.nn[i]
# Pos is the center of the octs
cdef Oct *o
- ukey = 0
- for i in range(20):
- ukey |= (1 << i)
for i in range(self.num_root):
o = self.root_nodes[i].node
key = self.root_nodes[i].key
- for j in range(3):
- data.pos[2 - j] = (key & ukey)
- key = key >> 20
+ self.key_to_ipos(key, data.pos)
for j in range(3):
pos[j] = self.DLE[j] + (data.pos[j] + 0.5) * dds[j]
selector.recursively_visit_octs(
@@ -728,7 +740,6 @@
return 0 # We no longer have a domain offset.
cdef Oct* next_root(self, int domain_id, int ind[3]):
- # We assume that 20 bits is enough for each index.
cdef int i
cdef Oct *next
self.get_root(ind, &next)
@@ -744,8 +755,7 @@
cont.n_assigned += 1
cdef np.int64_t key = 0
cdef OctKey *ikey = &self.root_nodes[self.num_root]
- for i in range(3):
- key |= ((<np.int64_t>ind[i]) << 20 * (2 - i))
+ key = self.ipos_to_key(ind)
self.root_nodes[self.num_root].key = key
self.root_nodes[self.num_root].node = next
tsearch(<void*>ikey, &self.tree_root, root_node_compare)
https://bitbucket.org/yt_analysis/yt-3.0/commits/aa497112dd6f/
Changeset: aa497112dd6f
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-05 15:42:16
Summary: First refactor step for appending domains and oct allocations.
Affected #: 2 files
diff -r 0d9bfae7d95f050ae4f799cad06fc1140bb93635 -r aa497112dd6fdb882fe500f89de833d54c7243bc yt/geometry/oct_container.pxd
--- a/yt/geometry/oct_container.pxd
+++ b/yt/geometry/oct_container.pxd
@@ -72,7 +72,7 @@
cdef np.uint8_t oref
cdef np.float64_t DLE[3], DRE[3]
cdef public np.int64_t nocts
- cdef public int max_domain
+ cdef public int num_domains
cdef Oct *get(self, np.float64_t ppos[3], OctInfo *oinfo = ?)
cdef int get_root(self, int ind[3], Oct **o)
cdef Oct **neighbors(self, OctInfo *oinfo, np.int64_t *nneighbors)
diff -r 0d9bfae7d95f050ae4f799cad06fc1140bb93635 -r aa497112dd6fdb882fe500f89de833d54c7243bc yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -25,7 +25,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
-from libc.stdlib cimport malloc, free, qsort
+from libc.stdlib cimport malloc, free, qsort, realloc
from libc.math cimport floor
cimport numpy as np
import numpy as np
@@ -104,8 +104,9 @@
cdef int i, j, k, p
for i in range(3):
self.nn[i] = oct_domain_dimensions[i]
- self.max_domain = -1
+ self.num_domains = 0
self.level_offset = 0
+ self.domains = NULL
p = 0
self.nocts = 0 # Increment when initialized
for i in range(3):
@@ -269,14 +270,14 @@
def domain_identify(self, SelectorObject selector):
cdef np.ndarray[np.uint8_t, ndim=1] domain_mask
- domain_mask = np.zeros(self.max_domain, dtype="uint8")
+ domain_mask = np.zeros(self.num_domains, dtype="uint8")
cdef OctVisitorData data
self.setup_data(&data)
data.array = domain_mask.data
self.visit_all_octs(selector, oct_visitors.identify_octs, &data)
cdef int i
domain_ids = []
- for i in range(self.max_domain):
+ for i in range(self.num_domains):
if domain_mask[i] == 1:
domain_ids.append(i+1)
return domain_ids
@@ -512,7 +513,7 @@
cdef Oct *cur, *next = NULL
cdef np.float64_t pp[3], cp[3], dds[3]
no = pos.shape[0] #number of octs
- if curdom > self.max_domain: return 0
+ if curdom > self.num_domains: return 0
cdef OctAllocationContainer *cont = self.domains[curdom - 1]
cdef int initial = cont.n_assigned
cdef int in_boundary = 0
@@ -556,7 +557,7 @@
cdef int count, i
cdef OctAllocationContainer *cur = self.cont
assert(cur == NULL)
- self.max_domain = len(domain_counts) # 1-indexed
+ self.num_domains = len(domain_counts) # 1-indexed
self.domains = <OctAllocationContainer **> malloc(
sizeof(OctAllocationContainer *) * len(domain_counts))
for i, count in enumerate(domain_counts):
@@ -564,6 +565,20 @@
if self.cont == NULL: self.cont = cur
self.domains[i] = cur
+ def append_domain(self, domain_count):
+ self.num_domains += 1
+ self.domains = <OctAllocationContainer **> realloc(self.domains,
+ sizeof(OctAllocationContainer *) * self.num_domains)
+ self.domains[self.num_domains - 1] = NULL
+ cdef OctAllocationContainer *cur
+ if self.num_domains == 1:
+ cur = NULL
+ else:
+ cur = self.domains[self.num_domains - 2]
+ cur = allocate_octs(domain_count, cur)
+ if self.cont == NULL: self.cont = cur
+ self.domains[self.num_domainss - 1] = cur
+
cdef Oct* next_root(self, int domain_id, int ind[3]):
cdef Oct *next = self.root_mesh[ind[0]][ind[1]][ind[2]]
if next != NULL: return next
@@ -668,7 +683,7 @@
self.oref = over_refine
for i in range(3):
self.nn[i] = domain_dimensions[i]
- self.max_domain = -1
+ self.num_domains = 0
self.level_offset = 0
self.nocts = 0 # Increment when initialized
self.root_mesh = NULL
@@ -771,6 +786,15 @@
self.root_nodes[i].key = -1
self.root_nodes[i].node = NULL
+ def append_domain(self, domain_count, bint new_root = False):
+ OctreeContainer.append_domain(self, domain_count)
+ if not new_root: return
+ self.max_root += 1
+ self.root_nodes = <OctKey *> realloc(self.root_nodes,
+ sizeof(OctKey) * self.max_root)
+ self.root_nodes[self.max_root - 1].key = -1
+ self.root_nodes[self.max_root - 1].node = NULL
+
def __dealloc__(self):
# This gets called BEFORE the superclass deallocation. But, both get
# called.
https://bitbucket.org/yt_analysis/yt-3.0/commits/65d312fded66/
Changeset: 65d312fded66
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-05 22:15:21
Summary: Remove a few reallocs and fix the key generation.
Affected #: 3 files
diff -r aa497112dd6fdb882fe500f89de833d54c7243bc -r 65d312fded66e42d28ab454b3d6b4a66e1c93529 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -588,6 +588,12 @@
cdef int *num_octs_per_level = <int *>malloc(
(max_level + 1)*sizeof(int))
cdef ARTIOOctreeContainer octree
+ octree = ARTIOOctreeContainer(self)
+ # We want to pre-allocate an array of root pointers. In the future,
+ # this will be pre-determined by the ARTIO library. However, because
+ # realloc plays havoc with our tree searching, we can't utilize an
+ # expanding array at the present time.
+ octree.allocate_domains([], self.sfc_end - self.sfc_start + 1)
cdef np.ndarray[np.int64_t, ndim=1] oct_count
oct_count = np.zeros(self.sfc_end - self.sfc_start + 1, dtype="int64")
status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
@@ -602,9 +608,7 @@
for level in range(num_oct_levels):
oc += num_octs_per_level[level]
oct_count[sfc - self.sfc_start] = oc
- octree = ARTIOOctreeContainer(self, sfc)
- octree.initialize_mesh(oc, num_oct_levels, num_octs_per_level)
- self.octree_handlers[sfc] = octree
+ octree.initialize_local_mesh(oc, num_oct_levels, num_octs_per_level)
status = artio_grid_read_root_cell_end( self.handle )
check_artio_status(status)
free(num_octs_per_level)
@@ -649,22 +653,16 @@
# the file again, despite knowing the indexing system already. Because of
# this, we will avoid creating it as long as possible.
- cdef public np.int64_t sfc
- cdef public np.int64_t sfc_offset
cdef public artio_fileset artio_handle
- cdef Oct **root_octs
cdef np.int64_t level_indices[32]
- cdef np.int64_t oct_count[32]
- def __init__(self, ARTIOSFCRangeHandler range_handler, np.int64_t sfc):
+ def __init__(self, ARTIOSFCRangeHandler range_handler):
self.artio_handle = range_handler.artio_handle
- self.sfc = sfc
# Note the final argument is partial_coverage, which indicates whether
# or not an Oct can be partially refined.
dims, DLE, DRE = [], [], []
for i in range(32):
self.level_indices[i] = 0
- self.oct_count[i] = 0
for i in range(3):
# range_handler has dims in cells, which is the same as the number
# of possible octs. This is because we have a forest of octrees.
@@ -673,13 +671,14 @@
DRE.append(range_handler.DRE[i])
super(ARTIOOctreeContainer, self).__init__(dims, DLE, DRE)
self.artio_handle = range_handler.artio_handle
- self.sfc_offset = range_handler.sfc_start
self.level_offset = 1
+ self.domains = NULL
+ self.root_nodes = NULL
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- cdef void initialize_mesh(self, np.int64_t oct_count,
+ cdef void initialize_local_mesh(self, np.int64_t oct_count,
int num_oct_levels, int *num_octs_per_level):
# We actually will not be initializing the root mesh here, we will be
# initializing the entire mesh between sfc_start and sfc_end.
@@ -695,8 +694,7 @@
# called from within a pre-cached operation in the SFC handler.
# We only allow one root oct.
- self.allocate_domains([oct_count], 1)
- pos = np.empty((1, 3), dtype="float64")
+ self.append_domain(oct_count)
oct_ind = -1
ipos = 0
@@ -708,6 +706,7 @@
# Now we initialize
# Note that we also assume we have already started reading the level.
+ ipos = 0
for level in range(num_oct_levels):
status = artio_grid_read_level_begin(handle, level + 1)
check_artio_status(status)
@@ -718,16 +717,17 @@
check_artio_status(status)
status = artio_grid_read_level_end(handle)
check_artio_status(status)
- nadded = self.add(1, level, pos[:num_octs_per_level[level],:])
-
+ nadded = self.add(self.num_domains, level, pos[:num_octs_per_level[level],:])
+ if nadded != num_octs_per_level[level]: raise RuntimeError
+
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
def fill_sfc(self,
- np.ndarray[np.uint8_t, ndim=1] levels,
- np.ndarray[np.uint8_t, ndim=1] cell_inds,
- np.ndarray[np.int64_t, ndim=1] file_inds,
- field_indices, dest_fields):
+ np.ndarray[np.uint8_t, ndim=1] levels,
+ np.ndarray[np.uint8_t, ndim=1] cell_inds,
+ np.ndarray[np.int64_t, ndim=1] file_inds,
+ field_indices, dest_fields):
cdef np.ndarray[np.float32_t, ndim=2] source
cdef np.ndarray[np.float64_t, ndim=1] dest
cdef int n, status, i, di, num_oct_levels, nf, ngv, max_level
diff -r aa497112dd6fdb882fe500f89de833d54c7243bc -r 65d312fded66e42d28ab454b3d6b4a66e1c93529 yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -50,11 +50,9 @@
from yt.data_objects.field_info_container import \
FieldInfoContainer, NullFunc
-
-
class ARTIOOctreeSubset(OctreeSubset):
_domain_offset = 0
- domain_id = 1
+ domain_id = -1
_con_args = ("base_region", "sfc", "root_mesh", "pf")
_type_name = 'octree_subset'
_num_zones = 2
@@ -133,7 +131,7 @@
_con_args = ("base_region", "sfc_start", "sfc_end", "oct_handler", "pf")
_type_name = 'sfc_subset'
_selector_module = _artio_caller
- domain_id = 1
+ domain_id = -1
def __init__(self, base_region, sfc_start, sfc_end, oct_handler, pf):
self.field_data = YTFieldData()
diff -r aa497112dd6fdb882fe500f89de833d54c7243bc -r 65d312fded66e42d28ab454b3d6b4a66e1c93529 yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -101,6 +101,7 @@
# This will just initialize the root mesh octs
self.oref = over_refine
self.partial_coverage = partial_coverage
+ self.cont = NULL
cdef int i, j, k, p
for i in range(3):
self.nn[i] = oct_domain_dimensions[i]
@@ -569,15 +570,14 @@
self.num_domains += 1
self.domains = <OctAllocationContainer **> realloc(self.domains,
sizeof(OctAllocationContainer *) * self.num_domains)
+ if self.domains == NULL: raise RuntimeError
self.domains[self.num_domains - 1] = NULL
- cdef OctAllocationContainer *cur
- if self.num_domains == 1:
- cur = NULL
- else:
+ cdef OctAllocationContainer *cur = NULL
+ if self.num_domains > 1:
cur = self.domains[self.num_domains - 2]
cur = allocate_octs(domain_count, cur)
if self.cont == NULL: self.cont = cur
- self.domains[self.num_domainss - 1] = cur
+ self.domains[self.num_domains - 1] = cur
cdef Oct* next_root(self, int domain_id, int ind[3]):
cdef Oct *next = self.root_mesh[ind[0]][ind[1]][ind[2]]
@@ -690,6 +690,7 @@
self.root_nodes = NULL
self.tree_root = NULL
self.num_root = 0
+ self.max_root = 0
# We don't initialize the octs yet
for i in range(3):
self.DLE[i] = domain_left_edge[i] #0
@@ -700,23 +701,24 @@
o[0] = NULL
cdef int i
cdef np.int64_t key = self.ipos_to_key(ind)
- cdef OctKey okey, **oresult
+ cdef OctKey okey, **oresult = NULL
okey.key = key
okey.node = NULL
oresult = <OctKey **> tfind(<void*>&okey,
&self.tree_root, root_node_compare)
if oresult != NULL:
o[0] = oresult[0].node
+ return 1
+ return 0
cdef void key_to_ipos(self, np.int64_t key, np.int64_t pos[3]):
# Note: this is the result of doing
- # ukey = 0
# for i in range(20):
# ukey |= (1 << i)
cdef np.int64_t ukey = 1048575
cdef int j
for j in range(3):
- pos[2 - j] = (key & ukey)
+ pos[2 - j] = (<np.int64_t>(key & ukey))
key = key >> 20
cdef np.int64_t ipos_to_key(self, int pos[3]):
@@ -724,7 +726,8 @@
cdef int i
cdef np.int64_t key = 0
for i in range(3):
- key |= (pos[i] << 20 * (2 - i))
+ # Note the casting here. Bitshifting can cause issues otherwise.
+ key |= ((<np.int64_t>pos[i]) << 20 * (2 - i))
return key
@cython.cdivision(True)
@@ -756,7 +759,7 @@
cdef Oct* next_root(self, int domain_id, int ind[3]):
cdef int i
- cdef Oct *next
+ cdef Oct *next = NULL
self.get_root(ind, &next)
if next != NULL: return next
cdef OctAllocationContainer *cont = self.domains[domain_id - 1]
@@ -770,6 +773,7 @@
cont.n_assigned += 1
cdef np.int64_t key = 0
cdef OctKey *ikey = &self.root_nodes[self.num_root]
+ cdef np.int64_t okey = ikey.key
key = self.ipos_to_key(ind)
self.root_nodes[self.num_root].key = key
self.root_nodes[self.num_root].node = next
@@ -786,15 +790,6 @@
self.root_nodes[i].key = -1
self.root_nodes[i].node = NULL
- def append_domain(self, domain_count, bint new_root = False):
- OctreeContainer.append_domain(self, domain_count)
- if not new_root: return
- self.max_root += 1
- self.root_nodes = <OctKey *> realloc(self.root_nodes,
- sizeof(OctKey) * self.max_root)
- self.root_nodes[self.max_root - 1].key = -1
- self.root_nodes[self.max_root - 1].node = NULL
-
def __dealloc__(self):
# This gets called BEFORE the superclass deallocation. But, both get
# called.
https://bitbucket.org/yt_analysis/yt-3.0/commits/1fd20d49e35a/
Changeset: 1fd20d49e35a
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-05 22:25:20
Summary: A few minor optimizations for speed. Now use the single OctreeHandler in chunks.
Affected #: 3 files
diff -r 65d312fded66e42d28ab454b3d6b4a66e1c93529 -r 1fd20d49e35a091d79e1226847cd38664cb3568c yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -552,8 +552,8 @@
cdef public np.int64_t sfc_end
cdef public artio_fileset artio_handle
cdef public object root_mesh_handler
- cdef public object octree_handlers
cdef public object oct_count
+ cdef public object octree_handler
cdef artio_fileset_handle *handle
cdef np.float64_t DLE[3]
cdef np.float64_t DRE[3]
@@ -570,7 +570,7 @@
self.sfc_end = sfc_end
self.artio_handle = artio_handle
self.root_mesh_handler = None
- self.octree_handlers = {}
+ self.octree_handler = None
self.handle = artio_handle.handle
self.oct_count = None
for i in range(3):
@@ -579,6 +579,9 @@
self.DRE[i] = domain_right_edge[i]
self.dds[i] = (self.DRE[i] - self.DLE[i])/self.dims[i]
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
def construct_mesh(self):
cdef int status, level
cdef np.int64_t sfc, oc
@@ -588,7 +591,7 @@
cdef int *num_octs_per_level = <int *>malloc(
(max_level + 1)*sizeof(int))
cdef ARTIOOctreeContainer octree
- octree = ARTIOOctreeContainer(self)
+ self.octree_handler = octree = ARTIOOctreeContainer(self)
# We want to pre-allocate an array of root pointers. In the future,
# this will be pre-determined by the ARTIO library. However, because
# realloc plays havoc with our tree searching, we can't utilize an
@@ -616,7 +619,7 @@
self.oct_count = oct_count
def free_mesh(self):
- self.octree_handlers.clear()
+ self.octree_handler = None
self.root_mesh_handler = None
self.oct_count = None
@@ -682,7 +685,7 @@
int num_oct_levels, int *num_octs_per_level):
# We actually will not be initializing the root mesh here, we will be
# initializing the entire mesh between sfc_start and sfc_end.
- cdef np.int64_t oct_ind, sfc, tot_octs, ipos
+ cdef np.int64_t oct_ind, sfc, tot_octs, ipos, nadded
cdef int i, status, level, num_root, num_octs
cdef int num_level_octs
cdef artio_fileset_handle *handle = self.artio_handle.handle
@@ -690,6 +693,7 @@
cdef int max_level = self.artio_handle.max_level
cdef double dpos[3]
cdef np.float64_t f64pos[3], dds[3]
+ cdef np.ndarray[np.float64_t, ndim=2] pos
# NOTE: We do not cache any SFC ranges here, as we should only ever be
# called from within a pre-cached operation in the SFC handler.
@@ -718,7 +722,8 @@
status = artio_grid_read_level_end(handle)
check_artio_status(status)
nadded = self.add(self.num_domains, level, pos[:num_octs_per_level[level],:])
- if nadded != num_octs_per_level[level]: raise RuntimeError
+ if nadded != num_octs_per_level[level]:
+ raise RuntimeError
@cython.boundscheck(False)
@cython.wraparound(False)
diff -r 65d312fded66e42d28ab454b3d6b4a66e1c93529 -r 1fd20d49e35a091d79e1226847cd38664cb3568c yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -53,15 +53,16 @@
class ARTIOOctreeSubset(OctreeSubset):
_domain_offset = 0
domain_id = -1
- _con_args = ("base_region", "sfc", "root_mesh", "pf")
+ _con_args = ("base_region", "sfc_start", "sfc_end", "oct_handler", "pf")
_type_name = 'octree_subset'
_num_zones = 2
- def __init__(self, base_region, sfc, root_mesh, pf):
+ def __init__(self, base_region, sfc_start, sfc_end, oct_handler, pf):
self.field_data = YTFieldData()
self.field_parameters = {}
- self.sfc = self.sfc_start = self.sfc_end = sfc
- self.root_mesh = root_mesh
+ self.sfc_start = sfc_start
+ self.sfc_end = sfc_end
+ self.oct_handler = oct_handler
self.pf = pf
self.hierarchy = self.pf.hierarchy
self._last_mask = None
@@ -70,7 +71,6 @@
self._current_fluid_type = self.pf.default_fluid_type
self.base_region = base_region
self.base_selector = base_region.selector
- self.oct_handler = root_mesh.octree_handlers[sfc]
@property
def min_ind(self):
@@ -128,26 +128,10 @@
# only manage the root mesh.
class ARTIORootMeshSubset(ARTIOOctreeSubset):
_num_zones = 1
- _con_args = ("base_region", "sfc_start", "sfc_end", "oct_handler", "pf")
_type_name = 'sfc_subset'
_selector_module = _artio_caller
domain_id = -1
- def __init__(self, base_region, sfc_start, sfc_end, oct_handler, pf):
- self.field_data = YTFieldData()
- self.field_parameters = {}
- self.sfc_start = sfc_start
- self.sfc_end = sfc_end
- self.oct_handler = oct_handler
- self.pf = pf
- self.hierarchy = self.pf.hierarchy
- self._last_mask = None
- self._last_selector_id = None
- self._current_particle_type = 'all'
- self._current_fluid_type = self.pf.default_fluid_type
- self.base_region = base_region
- self.base_selector = base_region.selector
-
def fill(self, fields, selector):
# We know how big these will be.
handle = self.pf._handle
@@ -362,9 +346,8 @@
ci.append(ARTIORootMeshSubset(base_region, start, end,
range_handler.root_mesh_handler, self.pf))
if nz != 1:
- for sfc in sorted(range_handler.octree_handlers):
- ci.append(ARTIOOctreeSubset(base_region, sfc,
- range_handler, self.pf))
+ ci.append(ARTIOOctreeSubset(base_region, start, end,
+ range_handler.octree_handler, self.pf))
dobj._chunk_info = ci
if len(list_sfc_ranges) > 1:
mylog.info("Created %d chunks for ARTIO" % len(list_sfc_ranges))
diff -r 65d312fded66e42d28ab454b3d6b4a66e1c93529 -r 1fd20d49e35a091d79e1226847cd38664cb3568c yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -566,7 +566,7 @@
if self.cont == NULL: self.cont = cur
self.domains[i] = cur
- def append_domain(self, domain_count):
+ def append_domain(self, np.int64_t domain_count):
self.num_domains += 1
self.domains = <OctAllocationContainer **> realloc(self.domains,
sizeof(OctAllocationContainer *) * self.num_domains)
https://bitbucket.org/yt_analysis/yt-3.0/commits/5db7741383a2/
Changeset: 5db7741383a2
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-05 23:00:55
Summary: Only add the Octrees if we have Octs to handle.
Affected #: 4 files
diff -r 1fd20d49e35a091d79e1226847cd38664cb3568c -r 5db7741383a257389b82edea1bc7b174ee0e90d7 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -559,6 +559,7 @@
cdef np.float64_t DRE[3]
cdef np.float64_t dds[3]
cdef np.int64_t dims[3]
+ cdef public np.int64_t total_octs
def __init__(self, domain_dimensions, # cells
domain_left_edge,
@@ -610,6 +611,7 @@
oc = 0
for level in range(num_oct_levels):
oc += num_octs_per_level[level]
+ self.total_octs += oc
oct_count[sfc - self.sfc_start] = oc
octree.initialize_local_mesh(oc, num_oct_levels, num_octs_per_level)
status = artio_grid_read_root_cell_end( self.handle )
diff -r 1fd20d49e35a091d79e1226847cd38664cb3568c -r 5db7741383a257389b82edea1bc7b174ee0e90d7 yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -345,7 +345,7 @@
if nz != 2:
ci.append(ARTIORootMeshSubset(base_region, start, end,
range_handler.root_mesh_handler, self.pf))
- if nz != 1:
+ if nz != 1 and range_handler.total_octs > 0:
ci.append(ARTIOOctreeSubset(base_region, start, end,
range_handler.octree_handler, self.pf))
dobj._chunk_info = ci
diff -r 1fd20d49e35a091d79e1226847cd38664cb3568c -r 5db7741383a257389b82edea1bc7b174ee0e90d7 yt/geometry/oct_container.pxd
--- a/yt/geometry/oct_container.pxd
+++ b/yt/geometry/oct_container.pxd
@@ -86,6 +86,7 @@
cdef Oct *next_root(self, int domain_id, int ind[3])
cdef Oct *next_child(self, int domain_id, int ind[3], Oct *parent)
cdef void setup_data(self, OctVisitorData *data, int domain_id = ?)
+ cdef void append_domain(self, np.int64_t domain_count)
cdef class SparseOctreeContainer(OctreeContainer):
cdef OctKey *root_nodes
diff -r 1fd20d49e35a091d79e1226847cd38664cb3568c -r 5db7741383a257389b82edea1bc7b174ee0e90d7 yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -566,7 +566,7 @@
if self.cont == NULL: self.cont = cur
self.domains[i] = cur
- def append_domain(self, np.int64_t domain_count):
+ cdef void append_domain(self, np.int64_t domain_count):
self.num_domains += 1
self.domains = <OctAllocationContainer **> realloc(self.domains,
sizeof(OctAllocationContainer *) * self.num_domains)
https://bitbucket.org/yt_analysis/yt-3.0/commits/6190903aa1ed/
Changeset: 6190903aa1ed
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-23 20:11:20
Summary: Beginning to link SFCs to OctAllocationContainers.
Affected #: 3 files
diff -r 5db7741383a257389b82edea1bc7b174ee0e90d7 -r 6190903aa1ed6b776b814c5f1f28408e036a7132 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -613,7 +613,8 @@
oc += num_octs_per_level[level]
self.total_octs += oc
oct_count[sfc - self.sfc_start] = oc
- octree.initialize_local_mesh(oc, num_oct_levels, num_octs_per_level)
+ octree.initialize_local_mesh(oc, num_oct_levels,
+ num_octs_per_level, sfc)
status = artio_grid_read_root_cell_end( self.handle )
check_artio_status(status)
free(num_octs_per_level)
@@ -684,10 +685,11 @@
@cython.wraparound(False)
@cython.cdivision(True)
cdef void initialize_local_mesh(self, np.int64_t oct_count,
- int num_oct_levels, int *num_octs_per_level):
+ int num_oct_levels, int *num_octs_per_level,
+ np.int64_t sfc):
# We actually will not be initializing the root mesh here, we will be
# initializing the entire mesh between sfc_start and sfc_end.
- cdef np.int64_t oct_ind, sfc, tot_octs, ipos, nadded
+ cdef np.int64_t oct_ind, tot_octs, ipos, nadded
cdef int i, status, level, num_root, num_octs
cdef int num_level_octs
cdef artio_fileset_handle *handle = self.artio_handle.handle
@@ -701,6 +703,7 @@
# We only allow one root oct.
self.append_domain(oct_count)
+ self.domains[self.num_domains - 1].con_id = sfc
oct_ind = -1
ipos = 0
diff -r 5db7741383a257389b82edea1bc7b174ee0e90d7 -r 6190903aa1ed6b776b814c5f1f28408e036a7132 yt/geometry/oct_container.pxd
--- a/yt/geometry/oct_container.pxd
+++ b/yt/geometry/oct_container.pxd
@@ -48,6 +48,7 @@
np.int64_t n
np.int64_t n_assigned
np.int64_t offset
+ np.int64_t con_id
OctAllocationContainer *next
Oct *my_octs
diff -r 5db7741383a257389b82edea1bc7b174ee0e90d7 -r 6190903aa1ed6b776b814c5f1f28408e036a7132 yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -61,6 +61,7 @@
raise MemoryError
n_cont.n = n_octs
n_cont.n_assigned = 0
+ n_cont.con_id = -1
for n in range(n_octs):
oct = &n_cont.my_octs[n]
oct.file_ind = oct.domain = -1
https://bitbucket.org/yt_analysis/yt-3.0/commits/7baba9976535/
Changeset: 7baba9976535
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-23 22:05:59
Summary: Finish first pass of ARTIO refactor for ForestOfOctrees.
Affected #: 5 files
diff -r 6190903aa1ed6b776b814c5f1f28408e036a7132 -r 7baba99765358863bce952067d4b422ad8c609e0 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -8,7 +8,8 @@
from yt.geometry.oct_container cimport \
SparseOctreeContainer
from yt.geometry.oct_visitors cimport \
- OctVisitorData, oct_visitor_function, Oct
+ OctVisitorData, oct_visitor_function, Oct, \
+ fill_file_indices_oind, fill_file_indices_rind
from yt.geometry.particle_deposit cimport \
ParticleDepositOperation
from libc.stdint cimport int32_t, int64_t
@@ -737,11 +738,12 @@
np.ndarray[np.uint8_t, ndim=1] levels,
np.ndarray[np.uint8_t, ndim=1] cell_inds,
np.ndarray[np.int64_t, ndim=1] file_inds,
+ np.ndarray[np.int64_t, ndim=1] domain_counts,
field_indices, dest_fields):
cdef np.ndarray[np.float32_t, ndim=2] source
cdef np.ndarray[np.float64_t, ndim=1] dest
cdef int n, status, i, di, num_oct_levels, nf, ngv, max_level
- cdef int level, j, oct_ind
+ cdef int level, j, oct_ind, si
cdef np.int64_t sfc, ipos
cdef np.float64_t val
cdef artio_fileset_handle *handle = self.artio_handle.handle
@@ -760,40 +762,58 @@
cdef np.float32_t **field_vals = <np.float32_t**> malloc(
nf * sizeof(np.float32_t*))
source_arrays = []
+ ipos = -1
+ for i in range(self.num_domains):
+ ipos = imax(ipos, self.domains[i].n)
for i in range(nf):
field_ind[i] = field_indices[i]
# Note that we subtract one, because we're not using the root mesh.
- source = np.zeros((self.nocts, 8), dtype="float32")
+ source = np.zeros((ipos, 8), dtype="float32")
source_arrays.append(source)
field_vals[i] = <np.float32_t*> source.data
+ cdef np.int64_t level_position[32], lp
# First we need to walk the mesh in the file. Then we fill in the dest
# location based on the file index.
- status = artio_grid_read_root_cell_begin( handle, self.sfc,
- dpos, NULL, &num_oct_levels, num_octs_per_level)
- check_artio_status(status)
- for level in range(num_oct_levels):
- status = artio_grid_read_level_begin(handle, level + 1)
+ # A few ways this could be improved:
+ # * Create a new visitor function that actually queried the data,
+ # rather than our somewhat hokey double-loop over SFC arrays.
+ # * Go to pointers for the dest arrays.
+ # * Enable preloading during mesh initialization
+ # * Calculate domain indices on the fly rather than with a
+ # double-loop to calculate domain_counts
+ cdef np.int64_t offset = 0
+ for si in range(self.num_domains):
+ sfc = self.domains[si].con_id
+ status = artio_grid_read_root_cell_begin( handle, sfc,
+ dpos, NULL, &num_oct_levels, num_octs_per_level)
check_artio_status(status)
- ipos = self.level_indices[level]
- for oct_ind in range(num_octs_per_level[level]):
- status = artio_grid_read_oct(handle, dpos, grid_variables, NULL)
+ lp = 0
+ for level in range(num_oct_levels):
+ status = artio_grid_read_level_begin(handle, level + 1)
+ check_artio_status(status)
+ level_position[level] = lp
+ for oct_ind in range(num_octs_per_level[level]):
+ status = artio_grid_read_oct(handle, dpos, grid_variables, NULL)
+ check_artio_status(status)
+ for j in range(8):
+ for i in range(nf):
+ field_vals[i][(oct_ind + lp)*8+j] = \
+ grid_variables[ngv*j+field_ind[i]]
+ status = artio_grid_read_level_end(handle)
check_artio_status(status)
- for j in range(8):
- for i in range(nf):
- field_vals[i][(ipos+oct_ind)*8+j] = \
- grid_variables[ngv*j+field_ind[i]]
- status = artio_grid_read_level_end(handle)
+ lp += num_octs_per_level[level]
+ status = artio_grid_read_root_cell_end( handle )
check_artio_status(status)
- status = artio_grid_read_root_cell_end( handle )
- check_artio_status(status)
- # Now we have all our sources.
- for j in range(nf):
- dest = dest_fields[j]
- source = source_arrays[j]
- for i in range(levels.shape[0]):
- level = levels[i]
- oct_ind = self.level_indices[level]
- dest[i] = source[file_inds[i] + oct_ind, cell_inds[i]]
+ # Now we have all our sources.
+ for j in range(nf):
+ dest = dest_fields[j]
+ source = source_arrays[j]
+ for i in range(domain_counts[si]):
+ level = levels[i + offset]
+ oct_ind = file_inds[i + offset] + level_position[level]
+ dest[i + offset] = source[oct_ind, cell_inds[i + offset]]
+ # Now, we offset by the actual number filled here.
+ offset += domain_counts[si]
free(field_ind)
free(field_vals)
free(grid_variables)
diff -r 6190903aa1ed6b776b814c5f1f28408e036a7132 -r 7baba99765358863bce952067d4b422ad8c609e0 yt/frontends/artio/data_structures.py
--- a/yt/frontends/artio/data_structures.py
+++ b/yt/frontends/artio/data_structures.py
@@ -89,8 +89,10 @@
self.data_size = cell_count
levels, cell_inds, file_inds = self.oct_handler.file_index_octs(
selector, self.domain_id, cell_count)
+ domain_counts = self.oct_handler.domain_count(selector)
tr = [np.zeros(cell_count, dtype="float64") for field in fields]
- self.oct_handler.fill_sfc(levels, cell_inds, file_inds, field_indices, tr)
+ self.oct_handler.fill_sfc(levels, cell_inds, file_inds,
+ domain_counts, field_indices, tr)
tr = dict((field, v) for field, v in zip(fields, tr))
return tr
diff -r 6190903aa1ed6b776b814c5f1f28408e036a7132 -r 7baba99765358863bce952067d4b422ad8c609e0 yt/geometry/oct_container.pyx
--- a/yt/geometry/oct_container.pyx
+++ b/yt/geometry/oct_container.pyx
@@ -636,6 +636,17 @@
self.visit_all_octs(selector, self.fill_func, &data)
return levels, cell_inds, file_inds
+ def domain_count(self, SelectorObject selector):
+ # We create oct arrays of the correct size
+ cdef np.int64_t i, num_octs
+ cdef np.ndarray[np.int64_t, ndim=1] domain_counts
+ domain_counts = np.zeros(self.num_domains, dtype="int64")
+ cdef OctVisitorData data
+ self.setup_data(&data, -1)
+ data.array = <void*> domain_counts.data
+ self.visit_all_octs(selector, oct_visitors.count_by_domain, &data)
+ return domain_counts
+
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
diff -r 6190903aa1ed6b776b814c5f1f28408e036a7132 -r 7baba99765358863bce952067d4b422ad8c609e0 yt/geometry/oct_visitors.pxd
--- a/yt/geometry/oct_visitors.pxd
+++ b/yt/geometry/oct_visitors.pxd
@@ -66,6 +66,7 @@
cdef oct_visitor_function assign_domain_ind
cdef oct_visitor_function fill_file_indices_oind
cdef oct_visitor_function fill_file_indices_rind
+cdef oct_visitor_function count_by_domain
cdef inline int cind(int i, int j, int k):
# THIS ONLY WORKS FOR CHILDREN. It is not general for zones.
diff -r 6190903aa1ed6b776b814c5f1f28408e036a7132 -r 7baba99765358863bce952067d4b422ad8c609e0 yt/geometry/oct_visitors.pyx
--- a/yt/geometry/oct_visitors.pyx
+++ b/yt/geometry/oct_visitors.pyx
@@ -177,3 +177,10 @@
find_arr[data.index] = o.file_ind
cell_arr[data.index] = rind(data)
data.index +=1
+
+cdef void count_by_domain(Oct *o, OctVisitorData *data, np.uint8_t selected):
+ cdef np.int64_t *arr
+ if selected == 0: return
+ # NOTE: We do this for every *cell*.
+ arr = <np.int64_t *> data.array
+ arr[o.domain - 1] += 1
https://bitbucket.org/yt_analysis/yt-3.0/commits/c5cd582cd8e3/
Changeset: c5cd582cd8e3
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-25 00:39:53
Summary: Merging from tip, including license change.
Affected #: 495 files
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 .hgchurn
--- a/.hgchurn
+++ b/.hgchurn
@@ -17,3 +17,4 @@
tabel = tabel at slac.stanford.edu
sername=kayleanelson = kaylea.nelson at yale.edu
kayleanelson = kaylea.nelson at yale.edu
+jcforbes at ucsc.edu = jforbes at ucolick.org
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -5159,3 +5159,4 @@
a71dffe4bc813fdadc506ccad9efb632e23dc843 yt-3.0a1
954d1ffcbf04c3d1b394c2ea05324d903a9a07cf yt-3.0a2
f4853999c2b5b852006d6628719c882cddf966df yt-3.0a3
+079e456c38a87676472a458210077e2be325dc85 last_gplv3
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 COPYING.txt
--- /dev/null
+++ b/COPYING.txt
@@ -0,0 +1,81 @@
+===============================
+ The yt project licensing terms
+===============================
+
+yt is licensed under the terms of the Modified BSD License (also known as New
+or Revised BSD), as follows:
+
+Copyright (c) 2013-, yt Development Team
+Copyright (c) 2006-2013, Matthew Turk <matthewturk at gmail.com>
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this
+list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+Neither the name of the yt Development Team nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+About the yt Development Team
+-----------------------------
+
+Matthew Turk began yt in 2006 and remains the project lead. Over time yt has
+grown to include contributions from a large number of individuals from many
+diverse institutions, scientific, and technical backgrounds.
+
+Until the fall of 2013, yt was licensed under the GPLv3. However, with consent
+from all developers and on a public mailing list, yt has been relicensed under
+the BSD 3-clause under a shared copyright model. For more information, see:
+http://lists.spacepope.org/pipermail/yt-dev-spacepope.org/2013-July/003239.html
+All versions of yt prior to this licensing change are available under the
+GPLv3; all subsequent versions are available under the BSD 3-clause license.
+
+The yt Development Team is the set of all contributors to the yt project. This
+includes all of the yt subprojects.
+
+The core team that coordinates development on BitBucket can be found here:
+http://bitbucket.org/yt_analysis/
+
+
+Our Copyright Policy
+--------------------
+
+yt uses a shared copyright model. Each contributor maintains copyright
+over their contributions to yt. But, it is important to note that these
+contributions are typically only changes to the repositories. Thus, the yt
+source code, in its entirety is not the copyright of any single person or
+institution. Instead, it is the collective copyright of the entire yt
+Development Team. If individual contributors want to maintain a record of what
+changes/contributions they have specific copyright on, they should indicate
+their copyright in the commit message of the change, when they commit the
+change to one of the yt repositories.
+
+With this in mind, the following banner should be used in any source code file
+to indicate the copyright and license terms:
+
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 CREDITS
--- a/CREDITS
+++ b/CREDITS
@@ -1,51 +1,55 @@
-YT is a group effort.
+yt is a group effort.
-Contributors: Tom Abel (tabel at stanford.edu)
- David Collins (dcollins at physics.ucsd.edu)
- Brian Crosby (crosby.bd at gmail.com)
- Andrew Cunningham (ajcunn at gmail.com)
- Nathan Goldbaum (goldbaum at ucolick.org)
- Markus Haider (markus.haider at uibk.ac.at)
- Cameron Hummels (chummels at gmail.com)
- Christian Karch (chiffre at posteo.de)
- Ji-hoon Kim (me at jihoonkim.org)
- Steffen Klemer (sklemer at phys.uni-goettingen.de)
- Kacper Kowalik (xarthisius.kk at gmail.com)
- Michael Kuhlen (mqk at astro.berkeley.edu)
- Eve Lee (elee at cita.utoronto.ca)
- Yuan Li (yuan at astro.columbia.edu)
- Chris Malone (chris.m.malone at gmail.com)
- Josh Maloney (joshua.moloney at colorado.edu)
- Chris Moody (cemoody at ucsc.edu)
- Andrew Myers (atmyers at astro.berkeley.edu)
- Jeff Oishi (jsoishi at gmail.com)
- Jean-Claude Passy (jcpassy at uvic.ca)
- Mark Richardson (Mark.L.Richardson at asu.edu)
- Thomas Robitaille (thomas.robitaille at gmail.com)
- Anna Rosen (rosen at ucolick.org)
- Anthony Scopatz (scopatz at gmail.com)
- Devin Silvia (devin.silvia at colorado.edu)
- Sam Skillman (samskillman at gmail.com)
- Stephen Skory (s at skory.us)
- Britton Smith (brittonsmith at gmail.com)
- Geoffrey So (gsiisg at gmail.com)
- Casey Stark (caseywstark at gmail.com)
- Elizabeth Tasker (tasker at astro1.sci.hokudai.ac.jp)
- Stephanie Tonnesen (stonnes at gmail.com)
- Matthew Turk (matthewturk at gmail.com)
- Rich Wagner (rwagner at physics.ucsd.edu)
- John Wise (jwise at physics.gatech.edu)
- John ZuHone (jzuhone at gmail.com)
+Contributors:
+ Tom Abel (tabel at stanford.edu)
+ David Collins (dcollins at physics.ucsd.edu)
+ Brian Crosby (crosby.bd at gmail.com)
+ Andrew Cunningham (ajcunn at gmail.com)
+ Hilary Egan (hilaryye at gmail.com)
+ John Forces (jforbes at ucolick.org)
+ Nathan Goldbaum (goldbaum at ucolick.org)
+ Markus Haider (markus.haider at uibk.ac.at)
+ Cameron Hummels (chummels at gmail.com)
+ Christian Karch (chiffre at posteo.de)
+ Ji-hoon Kim (me at jihoonkim.org)
+ Steffen Klemer (sklemer at phys.uni-goettingen.de)
+ Kacper Kowalik (xarthisius.kk at gmail.com)
+ Michael Kuhlen (mqk at astro.berkeley.edu)
+ Eve Lee (elee at cita.utoronto.ca)
+ Sam Leitner (sam.leitner at gmail.com)
+ Yuan Li (yuan at astro.columbia.edu)
+ Chris Malone (chris.m.malone at gmail.com)
+ Josh Maloney (joshua.moloney at colorado.edu)
+ Chris Moody (cemoody at ucsc.edu)
+ Andrew Myers (atmyers at astro.berkeley.edu)
+ Jill Naiman (jnaiman at ucolick.org)
+ Kaylea Nelson (kaylea.nelson at yale.edu)
+ Jeff Oishi (jsoishi at gmail.com)
+ Jean-Claude Passy (jcpassy at uvic.ca)
+ Mark Richardson (Mark.L.Richardson at asu.edu)
+ Thomas Robitaille (thomas.robitaille at gmail.com)
+ Anna Rosen (rosen at ucolick.org)
+ Douglas Rudd (drudd at uchicago.edu)
+ Anthony Scopatz (scopatz at gmail.com)
+ Noel Scudder (noel.scudder at stonybrook.edu)
+ Devin Silvia (devin.silvia at colorado.edu)
+ Sam Skillman (samskillman at gmail.com)
+ Stephen Skory (s at skory.us)
+ Britton Smith (brittonsmith at gmail.com)
+ Geoffrey So (gsiisg at gmail.com)
+ Casey Stark (caseywstark at gmail.com)
+ Elizabeth Tasker (tasker at astro1.sci.hokudai.ac.jp)
+ Stephanie Tonnesen (stonnes at gmail.com)
+ Matthew Turk (matthewturk at gmail.com)
+ Rich Wagner (rwagner at physics.ucsd.edu)
+ Andrew Wetzel (andrew.wetzel at yale.edu)
+ John Wise (jwise at physics.gatech.edu)
+ John ZuHone (jzuhone at gmail.com)
-We also include the Delaunay Triangulation module written by Robert Kern of
-Enthought, the cmdln.py module by Trent Mick, and the progressbar module by
+Several items included in the yt/extern directory were written by other
+individuals and may bear their own license, including the progressbar module by
Nilton Volpato. The PasteBin interface code (as well as the PasteBin itself)
-was written by the Pocoo collective (pocoo.org). The RamsesRead++ library was
-developed by Oliver Hahn. yt also includes a slightly-modified version of
-libconfig (http://www.hyperrealm.com/libconfig/) and an unmodified version of
-several routines from HEALpix (http://healpix.jpl.nasa.gov/).
-
-Large parts of development of yt were guided by discussions with Tom Abel, Ralf
-Kaehler, Mike Norman and Greg Bryan.
+was written by the Pocoo collective (pocoo.org).
+developed by Oliver Hahn.
Thanks to everyone for all your contributions!
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 FUNDING
--- a/FUNDING
+++ /dev/null
@@ -1,40 +0,0 @@
-The development of yt has benefited from funding from many different sources
-and institutions. Here is an incomplete list of these sources:
-
- * NSF grant OCI-0904484
- * NSF grant OCI-1048505
- * NSF grant AST-0239709
- * NSF grant AST-0707474
- * NSF grant AST-0708960
- * NSF grant AST-0808184
- * NSF grant AST-0807215
- * NSF grant AST-0807312
- * NSF grant AST-0807075
- * NSF grant AST-0908199
- * NSF grant AST-0908553
- * NASA grant ATFP NNX08-AH26G
- * NASA grant ATFP NNX09-AD80G
- * NASA grant ATFP NNZ07-AG77G
- * DOE Computational Science Graduate Fellowship under grant number DE-FG02-97ER25308
-
-Additionally, development of yt has benefited from the hospitality and hosting
-of the following institutions:
-
- * Columbia University
- * Harvard-Smithsonian Center for Astrophysics
- * Institute for Advanced Study
- * Kavli Institute for Cosmological Physics
- * Kavli Institute for Particle Astrophysics and Cosmology
- * Kavli Institute for Theoretical Physics
- * Los Alamos National Lab
- * Michigan State University
- * Princeton University
- * Stanford University
- * University of California High-Performance Astro-Computing Center
- * University of California at Berkeley
- * University of California at San Diego
- * University of California at Santa Cruz
- * University of Chicago Research Computing Center
- * University of Colorado at Boulder
- * University of Maryland at College Park
- * Yale University
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 LICENSE.txt
--- a/LICENSE.txt
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year><name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year><name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 doc/how_to_develop_yt.txt
--- a/doc/how_to_develop_yt.txt
+++ b/doc/how_to_develop_yt.txt
@@ -25,7 +25,7 @@
Licenses
--------
-All code in yt should be under the GPL-3 (preferred) or a compatible license.
+All code in yt should be under the BSD 3-clause license.
How To Get The Source Code
--------------------------
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 doc/install_script.sh
--- a/doc/install_script.sh
+++ b/doc/install_script.sh
@@ -419,7 +419,7 @@
echo "be installing ZeroMQ"
printf "%-15s = %s so I " "INST_ROCKSTAR" "${INST_ROCKSTAR}"
-get_willwont ${INST_0MQ}
+get_willwont ${INST_ROCKSTAR}
echo "be installing Rockstar"
echo
@@ -877,6 +877,11 @@
mkdir -p ${DEST_DIR}/src/$MATPLOTLIB
echo "[directories]" >> ${DEST_DIR}/src/$MATPLOTLIB/setup.cfg
echo "basedirlist = ${DEST_DIR}" >> ${DEST_DIR}/src/$MATPLOTLIB/setup.cfg
+if [ `uname` = "Darwin" ]
+then
+ echo "[gui_support]" >> ${DEST_DIR}/src/$MATPLOTLIB/setup.cfg
+ echo "macosx = False" >> ${DEST_DIR}/src/$MATPLOTLIB/setup.cfg
+fi
do_setup_py $MATPLOTLIB
if [ -n "${OLD_LDFLAGS}" ]
then
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 setup.py
--- a/setup.py
+++ b/setup.py
@@ -248,7 +248,7 @@
classifiers=["Development Status :: 5 - Production/Stable",
"Environment :: Console",
"Intended Audience :: Science/Research",
- "License :: OSI Approved :: GNU General Public License (GPL)",
+ "License :: OSI Approved :: BSD License",
"Operating System :: MacOS :: MacOS X",
"Operating System :: POSIX :: AIX",
"Operating System :: POSIX :: Linux",
@@ -269,7 +269,7 @@
author="Matthew J. Turk",
author_email="matthewturk at gmail.com",
url="http://yt-project.org/",
- license="GPL-3",
+ license="BSD",
configuration=configuration,
zip_safe=False,
data_files=REASON_FILES,
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/__init__.py
--- a/yt/__init__.py
+++ b/yt/__init__.py
@@ -60,27 +60,17 @@
All broadly useful code that doesn't clearly fit in one of the other
categories goes here.
-Author: Matthew Turk <matthewturk at gmail.com>
-Affiliation: KIPAC/SLAC/Stanford
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2007-2011 Matthew Turk. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
__version__ = "3.0-dev"
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/absorption_spectrum/__init__.py
--- a/yt/analysis_modules/absorption_spectrum/__init__.py
+++ b/yt/analysis_modules/absorption_spectrum/__init__.py
@@ -1,24 +1,14 @@
"""
Import stuff for light cone generator.
-Author: Britton Smith <brittons at origins.colorado.edu>
-Affiliation: CASA/University of CO, Boulder
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/absorption_spectrum/absorption_line.py
--- a/yt/analysis_modules/absorption_spectrum/absorption_line.py
+++ b/yt/analysis_modules/absorption_spectrum/absorption_line.py
@@ -1,27 +1,17 @@
"""
Absorption line generating functions.
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: Michigan State University
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import numpy as np
from yt.utilities.physical_constants import \
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/absorption_spectrum/absorption_spectrum.py
--- a/yt/analysis_modules/absorption_spectrum/absorption_spectrum.py
+++ b/yt/analysis_modules/absorption_spectrum/absorption_spectrum.py
@@ -1,27 +1,17 @@
"""
AbsorptionSpectrum class and member functions.
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: Michigan State University
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import h5py
import numpy as np
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/absorption_spectrum/api.py
--- a/yt/analysis_modules/absorption_spectrum/api.py
+++ b/yt/analysis_modules/absorption_spectrum/api.py
@@ -1,33 +1,18 @@
"""
API for absorption_spectrum
-Author: Matthew Turk <matthewturk at gmail.com>
-Affiliation: UCSD
-Author: J.S. Oishi <jsoishi at gmail.com>
-Affiliation: KIPAC/SLAC/Stanford
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: MSU
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2010-2011 Matthew Turk. All Rights Reserved.
- This file is part of yt.
-
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
from .absorption_spectrum import \
AbsorptionSpectrum
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/api.py
--- a/yt/analysis_modules/api.py
+++ b/yt/analysis_modules/api.py
@@ -1,33 +1,18 @@
"""
API for yt.analysis_modules
-Author: Matthew Turk <matthewturk at gmail.com>
-Affiliation: UCSD
-Author: J.S. Oishi <jsoishi at gmail.com>
-Affiliation: KIPAC/SLAC/Stanford
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: MSU
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2010-2011 Matthew Turk. All Rights Reserved.
- This file is part of yt.
-
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
from .absorption_spectrum.api import \
AbsorptionSpectrum
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/coordinate_transformation/api.py
--- a/yt/analysis_modules/coordinate_transformation/api.py
+++ b/yt/analysis_modules/coordinate_transformation/api.py
@@ -1,32 +1,17 @@
"""
API for coordinate_transformation
-Author: Matthew Turk <matthewturk at gmail.com>
-Affiliation: UCSD
-Author: J.S. Oishi <jsoishi at gmail.com>
-Affiliation: KIPAC/SLAC/Stanford
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: MSU
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2010-2011 Matthew Turk. All Rights Reserved.
- This file is part of yt.
-
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
from .transforms import \
spherical_regrid
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/coordinate_transformation/transforms.py
--- a/yt/analysis_modules/coordinate_transformation/transforms.py
+++ b/yt/analysis_modules/coordinate_transformation/transforms.py
@@ -1,29 +1,17 @@
"""
Transformations between coordinate systems
-Author: Matthew Turk <matthewturk at gmail.com>
-Affiliation: KIPAC/SLAC/Stanford
-Author: JS Oishi <jsoishi at astro.berkeley.edu>
-Organization: UC Berkeley
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2007-2011 Matthew Turk, J. S. Oishi. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import numpy as np
from yt.funcs import *
@@ -65,7 +53,7 @@
new_grid['handled'] = np.zeros(new_grid['x'].shape, dtype='bool')
for field in fields:
new_grid[field] = np.zeros(new_grid['x'].shape, dtype='float64')
- grid_order = np.argsort(data_source.gridLevels)
+ grid_order = np.argsort(data_source.grid_levels[:,0])
ng = len(data_source._grids)
for i,grid in enumerate(data_source._grids[grid_order][::-1]):
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/api.py
--- a/yt/analysis_modules/cosmological_observation/api.py
+++ b/yt/analysis_modules/cosmological_observation/api.py
@@ -1,29 +1,18 @@
"""
API for cosmology analysis.
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: Michigan State University
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2010-2011 Matthew Turk. All Rights Reserved.
- This file is part of yt.
-
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
from .cosmology_splice import \
CosmologySplice
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/cosmology_splice.py
--- a/yt/analysis_modules/cosmological_observation/cosmology_splice.py
+++ b/yt/analysis_modules/cosmological_observation/cosmology_splice.py
@@ -1,27 +1,17 @@
"""
CosmologyTimeSeries class and member functions.
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: Michigan State University
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2012 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import numpy as np
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/light_cone/__init__.py
--- a/yt/analysis_modules/cosmological_observation/light_cone/__init__.py
+++ b/yt/analysis_modules/cosmological_observation/light_cone/__init__.py
@@ -1,24 +1,14 @@
"""
Import stuff for light cone generator.
-Author: Britton Smith <brittons at origins.colorado.edu>
-Affiliation: CASA/University of CO, Boulder
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/light_cone/api.py
--- a/yt/analysis_modules/cosmological_observation/light_cone/api.py
+++ b/yt/analysis_modules/cosmological_observation/light_cone/api.py
@@ -1,33 +1,18 @@
"""
API for lightcone
-Author: Matthew Turk <matthewturk at gmail.com>
-Affiliation: UCSD
-Author: J.S. Oishi <jsoishi at gmail.com>
-Affiliation: KIPAC/SLAC/Stanford
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: MSU
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2010-2011 Matthew Turk. All Rights Reserved.
- This file is part of yt.
-
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
from .light_cone import \
LightCone
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/light_cone/common_n_volume.py
--- a/yt/analysis_modules/cosmological_observation/light_cone/common_n_volume.py
+++ b/yt/analysis_modules/cosmological_observation/light_cone/common_n_volume.py
@@ -2,27 +2,17 @@
Function to calculate volume in common between two n-cubes, with optional
periodic boundary conditions.
-Author: Britton Smith <brittons at origins.colorado.edu>
-Affiliation: CASA/University of CO, Boulder
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import numpy as np
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/light_cone/halo_mask.py
--- a/yt/analysis_modules/cosmological_observation/light_cone/halo_mask.py
+++ b/yt/analysis_modules/cosmological_observation/light_cone/halo_mask.py
@@ -1,27 +1,17 @@
"""
Light cone halo mask functions.
-Author: Britton Smith <brittons at origins.colorado.edu>
-Affiliation: CASA/University of CO, Boulder
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import copy
import h5py
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/light_cone/light_cone.py
--- a/yt/analysis_modules/cosmological_observation/light_cone/light_cone.py
+++ b/yt/analysis_modules/cosmological_observation/light_cone/light_cone.py
@@ -1,27 +1,17 @@
"""
LightCone class and member functions.
-Author: Britton Smith <brittons at origins.colorado.edu>
-Affiliation: CASA/University of CO, Boulder
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2012 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import copy
import h5py
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/light_cone/light_cone_projection.py
--- a/yt/analysis_modules/cosmological_observation/light_cone/light_cone_projection.py
+++ b/yt/analysis_modules/cosmological_observation/light_cone/light_cone_projection.py
@@ -1,27 +1,17 @@
"""
Create randomly centered, tiled projections to be used in light cones.
-Author: Britton Smith <brittons at origins.colorado.edu>
-Affiliation: CASA/University of CO, Boulder
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import numpy as np
import copy
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/light_cone/unique_solution.py
--- a/yt/analysis_modules/cosmological_observation/light_cone/unique_solution.py
+++ b/yt/analysis_modules/cosmological_observation/light_cone/unique_solution.py
@@ -1,27 +1,17 @@
"""
Functions to generate unique light cone solutions.
-Author: Britton Smith <brittons at origins.colorado.edu>
-Affiliation: CASA/University of CO, Boulder
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import copy
import numpy as np
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/light_ray/api.py
--- a/yt/analysis_modules/cosmological_observation/light_ray/api.py
+++ b/yt/analysis_modules/cosmological_observation/light_ray/api.py
@@ -1,32 +1,17 @@
"""
API for light_ray
-Author: Matthew Turk <matthewturk at gmail.com>
-Affiliation: UCSD
-Author: J.S. Oishi <jsoishi at gmail.com>
-Affiliation: KIPAC/SLAC/Stanford
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: MSU
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2010-2011 Matthew Turk. All Rights Reserved.
- This file is part of yt.
-
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
from .light_ray import \
LightRay
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/cosmological_observation/light_ray/light_ray.py
--- a/yt/analysis_modules/cosmological_observation/light_ray/light_ray.py
+++ b/yt/analysis_modules/cosmological_observation/light_ray/light_ray.py
@@ -1,27 +1,17 @@
"""
LightRay class and member functions.
-Author: Britton Smith <brittons at origins.colorado.edu>
-Affiliation: CASA/University of CO, Boulder
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2012 Britton Smith. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import copy
import h5py
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/halo_finding/api.py
--- a/yt/analysis_modules/halo_finding/api.py
+++ b/yt/analysis_modules/halo_finding/api.py
@@ -1,33 +1,18 @@
"""
API for halo_finding
-Author: Matthew Turk <matthewturk at gmail.com>
-Affiliation: UCSD
-Author: J.S. Oishi <jsoishi at gmail.com>
-Affiliation: KIPAC/SLAC/Stanford
-Author: Britton Smith <brittonsmith at gmail.com>
-Affiliation: MSU
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2010-2011 Matthew Turk. All Rights Reserved.
- This file is part of yt.
-
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
from halo_objects import \
Halo, \
HOPHalo, \
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/halo_finding/fof/EnzoFOF.c
--- a/yt/analysis_modules/halo_finding/fof/EnzoFOF.c
+++ b/yt/analysis_modules/halo_finding/fof/EnzoFOF.c
@@ -1,22 +1,10 @@
-/************************************************************************
-* Copyright (C) 2008-2011 Matthew Turk. All Rights Reserved.
-*
-* This file is part of yt.
-*
-* yt is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-************************************************************************/
+/*******************************************************************************
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+*******************************************************************************/
//
// EnzoFOF
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/halo_finding/halo_objects.py
--- a/yt/analysis_modules/halo_finding/halo_objects.py
+++ b/yt/analysis_modules/halo_finding/halo_objects.py
@@ -1,31 +1,17 @@
"""
HOP-output data handling
-Author: Matthew Turk <matthewturk at gmail.com>
-Affiliation: KIPAC/SLAC/Stanford
-Author: Stephen Skory <s at skory.us>
-Affiliation: UCSD Physics/CASS
-Author: Geoffrey So <gsiisg at gmail.com> (Ellipsoidal functions)
-Affiliation: UCSD Physics/CASS
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Matthew Turk. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
import gc
import h5py
@@ -2216,11 +2202,11 @@
self.comm.mpi_bcast(self.bucket_bounds)
my_bounds = self.bucket_bounds[self.comm.rank]
LE, RE = my_bounds[0], my_bounds[1]
- self._data_source = self.hierarchy.region_strict([0.] * 3, LE, RE)
+ self._data_source = self.hierarchy.region([0.] * 3, LE, RE)
# If this isn't parallel, define the region as an AMRRegionStrict so
# particle IO works.
if self.comm.size == 1:
- self._data_source = self.hierarchy.periodic_region_strict([0.5] * 3,
+ self._data_source = self.hierarchy.region([0.5] * 3,
LE, RE)
# get the average spacing between particles for this region
# The except is for the serial case where the full box is what we want.
@@ -2306,8 +2292,7 @@
np.zeros(3, dtype='float64'))
# If we're using a subvolume, we now re-divide.
if subvolume is not None:
- self._data_source = pf.h.periodic_region_strict([0.] * 3, ds_LE,
- ds_RE)
+ self._data_source = pf.h.region([0.] * 3, ds_LE, ds_RE)
# Cut up the volume.
padded, LE, RE, self._data_source = \
self.partition_hierarchy_3d(ds=self._data_source,
@@ -2504,7 +2489,7 @@
# object representing the entire domain and sum it "lazily" with
# Derived Quantities.
if subvolume is not None:
- self._data_source = pf.h.periodic_region_strict([0.] * 3, ds_LE, ds_RE)
+ self._data_source = pf.h.region([0.] * 3, ds_LE, ds_RE)
else:
self._data_source = pf.h.all_data()
self.padding = padding # * pf["unitary"] # This should be clevererer
@@ -2600,7 +2585,7 @@
linking_length = np.abs(link)
self.padding = padding
if subvolume is not None:
- self._data_source = pf.h.periodic_region_strict([0.] * 3, ds_LE,
+ self._data_source = pf.h.region([0.] * 3, ds_LE,
ds_RE)
else:
self._data_source = pf.h.all_data()
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/halo_finding/hop/EnzoHop.c
--- a/yt/analysis_modules/halo_finding/hop/EnzoHop.c
+++ b/yt/analysis_modules/halo_finding/hop/EnzoHop.c
@@ -1,22 +1,10 @@
-/************************************************************************
-* Copyright (C) 2008-2011 Matthew Turk. All Rights Reserved.
-*
-* This file is part of yt.
-*
-* yt is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-************************************************************************/
+/*******************************************************************************
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+*******************************************************************************/
//
// EnzoHop
diff -r 7baba99765358863bce952067d4b422ad8c609e0 -r c5cd582cd8e3daa8ce59602ffb9aad51eb515169 yt/analysis_modules/halo_finding/parallel_hop/parallel_hop_interface.py
--- a/yt/analysis_modules/halo_finding/parallel_hop/parallel_hop_interface.py
+++ b/yt/analysis_modules/halo_finding/parallel_hop/parallel_hop_interface.py
@@ -1,27 +1,17 @@
"""
A implementation of the HOP algorithm that runs in parallel.
-Author: Stephen Skory <s at skory.us>
-Affiliation: UCSD/CASS
-Homepage: http://yt-project.org/
-License:
- Copyright (C) 2008-2011 Stephen Skory. All Rights Reserved.
- This file is part of yt.
- yt is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+"""
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2013, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
from collections import defaultdict
import itertools, sys
This diff is so big that we needed to truncate the remainder.
https://bitbucket.org/yt_analysis/yt-3.0/commits/18be59624926/
Changeset: 18be59624926
Branch: yt-3.0
User: MatthewTurk
Date: 2013-09-26 14:16:14
Summary: Merged in MatthewTurk/yt-3.0 (pull request #98)
Convert ARTIO into forest of octrees
Affected #: 21 files
diff -r ffe02b75db66bc53abbc73f933a7f7c223bc63b3 -r 18be596249263152c80589b31e52db9db0c39d28 yt/data_objects/octree_subset.py
--- a/yt/data_objects/octree_subset.py
+++ b/yt/data_objects/octree_subset.py
@@ -30,6 +30,16 @@
import yt.geometry.particle_smooth as particle_smooth
from yt.funcs import *
+def cell_count_cache(func):
+ def cc_cache_func(self, dobj):
+ if hash(dobj.selector) != self._last_selector_id:
+ self._cell_count = -1
+ rv = func(self, dobj)
+ self._cell_count = rv.shape[0]
+ self._last_selector_id = hash(dobj.selector)
+ return rv
+ return cc_cache_func
+
class OctreeSubset(YTSelectionContainer):
_spatial = True
_num_ghost_zones = 0
@@ -38,7 +48,7 @@
_con_args = ('base_region', 'domain', 'pf')
_container_fields = ("dx", "dy", "dz")
_domain_offset = 0
- _num_octs = -1
+ _cell_count = -1
def __init__(self, base_region, domain, pf, over_refine_factor = 1):
self._num_zones = 1 << (over_refine_factor)
@@ -161,37 +171,25 @@
vals = np.asfortranarray(vals)
return vals
+ @cell_count_cache
def select_icoords(self, dobj):
- d = self.oct_handler.icoords(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 3,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.icoords(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
+ @cell_count_cache
def select_fcoords(self, dobj):
- d = self.oct_handler.fcoords(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 3,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.fcoords(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
+ @cell_count_cache
def select_fwidth(self, dobj):
- d = self.oct_handler.fwidth(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 3,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.fwidth(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
+ @cell_count_cache
def select_ires(self, dobj):
- d = self.oct_handler.ires(self.selector, domain_id = self.domain_id,
- num_octs = self._num_octs)
- self._num_octs = d.shape[0] / (self.nz**3)
- tr = self.oct_handler.selector_fill(dobj.selector, d, None, 0, 1,
- domain_id = self.domain_id)
- return tr
+ return self.oct_handler.ires(dobj.selector, domain_id = self.domain_id,
+ num_cells = self._cell_count)
def select(self, selector, source, dest, offset):
n = self.oct_handler.selector_fill(selector, source, dest, offset,
@@ -199,11 +197,7 @@
return n
def count(self, selector):
- if hash(selector) == self._last_selector_id:
- if self._last_mask is None: return 0
- return self._last_mask.sum()
- self.select(selector)
- return self.count(selector)
+ return -1
def count_particles(self, selector, x, y, z):
# We don't cache the selector results
diff -r ffe02b75db66bc53abbc73f933a7f7c223bc63b3 -r 18be596249263152c80589b31e52db9db0c39d28 yt/frontends/artio/_artio_caller.pyx
--- a/yt/frontends/artio/_artio_caller.pyx
+++ b/yt/frontends/artio/_artio_caller.pyx
@@ -1,17 +1,15 @@
-"""
-
-"""
cimport cython
import numpy as np
cimport numpy as np
import sys
from yt.geometry.selection_routines cimport SelectorObject, AlwaysSelector
+from yt.utilities.lib.fp_utils cimport imax
from yt.geometry.oct_container cimport \
- OctreeContainer, OctAllocationContainer, \
SparseOctreeContainer
from yt.geometry.oct_visitors cimport \
- OctVisitorData, oct_visitor_function, Oct
+ OctVisitorData, oct_visitor_function, Oct, \
+ fill_file_indices_oind, fill_file_indices_rind
from yt.geometry.particle_deposit cimport \
ParticleDepositOperation
from libc.stdint cimport int32_t, int64_t
@@ -66,6 +64,9 @@
int artio_fileset_open_grid(artio_fileset_handle *handle)
int artio_fileset_close_grid(artio_fileset_handle *handle)
+ int artio_fileset_has_grid( artio_fileset_handle *handle )
+ int artio_fileset_has_particles( artio_fileset_handle *handle )
+
# selection functions
artio_selection *artio_selection_allocate( artio_fileset_handle *handle )
artio_selection *artio_select_all( artio_fileset_handle *handle )
@@ -136,12 +137,14 @@
cdef int64_t sfc_min, sfc_max
# grid attributes
+ cdef public int has_grid
cdef public int min_level, max_level
cdef public int num_grid_variables
cdef int *num_octs_per_level
cdef float *grid_variables
# particle attributes
+ cdef public int has_particles
cdef public int num_species
cdef int *particle_position_index
cdef int *num_particles_per_species
@@ -178,32 +181,48 @@
if (not self.num_octs_per_level) or (not self.grid_variables) :
raise MemoryError
- status = artio_fileset_open_grid( self.handle )
- check_artio_status(status)
+ if artio_fileset_has_grid(self.handle):
+ status = artio_fileset_open_grid(self.handle)
+ check_artio_status(status)
+ self.has_grid = 1
+ else:
+ self.has_grid = 0
# particle detection
- self.num_species = self.parameters['num_particle_species'][0]
- self.particle_position_index = <int *>malloc(3*sizeof(int)*self.num_species)
- if not self.particle_position_index :
- raise MemoryError
- for ispec in range(self.num_species) :
- labels = self.parameters["species_%02d_primary_variable_labels"% (ispec,)]
- try :
- self.particle_position_index[3*ispec+0] = labels.index('POSITION_X')
- self.particle_position_index[3*ispec+1] = labels.index('POSITION_Y')
- self.particle_position_index[3*ispec+2] = labels.index('POSITION_Z')
- except ValueError :
- raise RuntimeError("Unable to locate position information for particle species", ispec )
+ if ( artio_fileset_has_particles(self.handle) ):
+ status = artio_fileset_open_particles(self.handle)
+ check_artio_status(status)
+ self.has_particles = 1
- self.num_particles_per_species = <int *>malloc(sizeof(int)*self.num_species)
- self.primary_variables = <double *>malloc(sizeof(double)*max(self.parameters['num_primary_variables']))
- self.secondary_variables = <float *>malloc(sizeof(float)*max(self.parameters['num_secondary_variables']))
- if (not self.num_particles_per_species) or (not self.primary_variables) or (not self.secondary_variables) :
- raise MemoryError
+ for v in ["num_particle_species","num_primary_variables","num_secondary_variables"]:
+ if not self.parameters.has_key(v):
+ raise RuntimeError("Unable to locate particle header information in artio header: key=", v)
- status = artio_fileset_open_particles( self.handle )
- check_artio_status(status)
-
+ self.num_species = self.parameters['num_particle_species'][0]
+ self.particle_position_index = <int *>malloc(3*sizeof(int)*self.num_species)
+ if not self.particle_position_index :
+ raise MemoryError
+ for ispec in range(self.num_species) :
+ species_labels = "species_%02d_primary_variable_labels"% (ispec,)
+ if not self.parameters.has_key(species_labels):
+ raise RuntimeError("Unable to locate variable labels for species",ispec)
+
+ labels = self.parameters[species_labels]
+ try :
+ self.particle_position_index[3*ispec+0] = labels.index('POSITION_X')
+ self.particle_position_index[3*ispec+1] = labels.index('POSITION_Y')
+ self.particle_position_index[3*ispec+2] = labels.index('POSITION_Z')
+ except ValueError :
+ raise RuntimeError("Unable to locate position information for particle species", ispec)
+
+ self.num_particles_per_species = <int *>malloc(sizeof(int)*self.num_species)
+ self.primary_variables = <double *>malloc(sizeof(double)*max(self.parameters['num_primary_variables']))
+ self.secondary_variables = <float *>malloc(sizeof(float)*max(self.parameters['num_secondary_variables']))
+ if (not self.num_particles_per_species) or (not self.primary_variables) or (not self.secondary_variables) :
+ raise MemoryError
+ else:
+ self.has_particles = 0
+
def __dealloc__(self) :
if self.num_octs_per_level : free(self.num_octs_per_level)
if self.grid_variables : free(self.grid_variables)
@@ -390,7 +409,6 @@
raise RuntimeError("Field",f,"is not known to ARTIO")
field_order[i] = var_labels.index(f)
- # dhr - cache the entire domain (replace later)
status = artio_grid_cache_sfc_range( self.handle, self.sfc_min, self.sfc_max )
check_artio_status(status)
@@ -530,6 +548,85 @@
artio_fileset_close(handle)
return True
+cdef class ARTIOSFCRangeHandler:
+ cdef public np.int64_t sfc_start
+ cdef public np.int64_t sfc_end
+ cdef public artio_fileset artio_handle
+ cdef public object root_mesh_handler
+ cdef public object oct_count
+ cdef public object octree_handler
+ cdef artio_fileset_handle *handle
+ cdef np.float64_t DLE[3]
+ cdef np.float64_t DRE[3]
+ cdef np.float64_t dds[3]
+ cdef np.int64_t dims[3]
+ cdef public np.int64_t total_octs
+
+ def __init__(self, domain_dimensions, # cells
+ domain_left_edge,
+ domain_right_edge,
+ artio_fileset artio_handle,
+ sfc_start, sfc_end):
+ cdef int i
+ self.sfc_start = sfc_start
+ self.sfc_end = sfc_end
+ self.artio_handle = artio_handle
+ self.root_mesh_handler = None
+ self.octree_handler = None
+ self.handle = artio_handle.handle
+ self.oct_count = None
+ for i in range(3):
+ self.dims[i] = domain_dimensions[i]
+ self.DLE[i] = domain_left_edge[i]
+ self.DRE[i] = domain_right_edge[i]
+ self.dds[i] = (self.DRE[i] - self.DLE[i])/self.dims[i]
+
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
+ def construct_mesh(self):
+ cdef int status, level
+ cdef np.int64_t sfc, oc
+ cdef double dpos[3]
+ cdef int num_oct_levels
+ cdef int max_level = self.artio_handle.max_level
+ cdef int *num_octs_per_level = <int *>malloc(
+ (max_level + 1)*sizeof(int))
+ cdef ARTIOOctreeContainer octree
+ self.octree_handler = octree = ARTIOOctreeContainer(self)
+ # We want to pre-allocate an array of root pointers. In the future,
+ # this will be pre-determined by the ARTIO library. However, because
+ # realloc plays havoc with our tree searching, we can't utilize an
+ # expanding array at the present time.
+ octree.allocate_domains([], self.sfc_end - self.sfc_start + 1)
+ cdef np.ndarray[np.int64_t, ndim=1] oct_count
+ oct_count = np.zeros(self.sfc_end - self.sfc_start + 1, dtype="int64")
+ status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
+ self.sfc_end)
+ check_artio_status(status)
+ for sfc in range(self.sfc_start, self.sfc_end + 1):
+ status = artio_grid_read_root_cell_begin( self.handle,
+ sfc, dpos, NULL, &num_oct_levels, num_octs_per_level)
+ check_artio_status(status)
+ if num_oct_levels > 0:
+ oc = 0
+ for level in range(num_oct_levels):
+ oc += num_octs_per_level[level]
+ self.total_octs += oc
+ oct_count[sfc - self.sfc_start] = oc
+ octree.initialize_local_mesh(oc, num_oct_levels,
+ num_octs_per_level, sfc)
+ status = artio_grid_read_root_cell_end( self.handle )
+ check_artio_status(status)
+ free(num_octs_per_level)
+ self.root_mesh_handler = ARTIORootMeshContainer(self)
+ self.oct_count = oct_count
+
+ def free_mesh(self):
+ self.octree_handler = None
+ self.root_mesh_handler = None
+ self.oct_count = None
+
def get_coords(artio_fileset handle, np.int64_t s):
cdef int coords[3]
artio_sfc_coords(handle.handle, s, coords)
@@ -563,163 +660,91 @@
# the file again, despite knowing the indexing system already. Because of
# this, we will avoid creating it as long as possible.
- cdef public np.int64_t sfc_start
- cdef public np.int64_t sfc_end
cdef public artio_fileset artio_handle
- cdef Oct **root_octs
- cdef np.int64_t *level_indices
+ cdef np.int64_t level_indices[32]
- def __init__(self, oct_dimensions, domain_left_edge, domain_right_edge,
- int64_t sfc_start, int64_t sfc_end, artio_fileset artio_handle):
- self.artio_handle = artio_handle
- self.sfc_start = sfc_start
- self.sfc_end = sfc_end
+ def __init__(self, ARTIOSFCRangeHandler range_handler):
+ self.artio_handle = range_handler.artio_handle
# Note the final argument is partial_coverage, which indicates whether
# or not an Oct can be partially refined.
- super(ARTIOOctreeContainer, self).__init__(oct_dimensions,
- domain_left_edge, domain_right_edge)
- self.level_indices = NULL
- self._initialize_root_mesh()
+ dims, DLE, DRE = [], [], []
+ for i in range(32):
+ self.level_indices[i] = 0
+ for i in range(3):
+ # range_handler has dims in cells, which is the same as the number
+ # of possible octs. This is because we have a forest of octrees.
+ dims.append(range_handler.dims[i])
+ DLE.append(range_handler.DLE[i])
+ DRE.append(range_handler.DRE[i])
+ super(ARTIOOctreeContainer, self).__init__(dims, DLE, DRE)
+ self.artio_handle = range_handler.artio_handle
+ self.level_offset = 1
+ self.domains = NULL
+ self.root_nodes = NULL
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
- def _initialize_root_mesh(self):
+ cdef void initialize_local_mesh(self, np.int64_t oct_count,
+ int num_oct_levels, int *num_octs_per_level,
+ np.int64_t sfc):
# We actually will not be initializing the root mesh here, we will be
# initializing the entire mesh between sfc_start and sfc_end.
- cdef np.int64_t oct_ind, sfc, nadded, tot_octs, ipos
- cdef np.uint8_t bits
- cdef int status
+ cdef np.int64_t oct_ind, tot_octs, ipos, nadded
+ cdef int i, status, level, num_root, num_octs
+ cdef int num_level_octs
cdef artio_fileset_handle *handle = self.artio_handle.handle
+ cdef int coords[3]
+ cdef int max_level = self.artio_handle.max_level
cdef double dpos[3]
- cdef int coords[3]
- cdef int num_oct_levels, level, i, j
- cdef int max_level = self.artio_handle.max_level
- cdef int *num_octs_per_level = <int *>malloc(
- (max_level + 1)*sizeof(int))
- cdef np.int64_t *tot_octs_per_level = <np.int64_t *>malloc(
- (max_level + 1)*sizeof(np.int64_t))
- self.level_indices = <np.int64_t *>malloc(
- (max_level + 1)*sizeof(np.int64_t))
- for level in range(max_level + 1):
- tot_octs_per_level[level] = 0
- status = artio_grid_cache_sfc_range(handle,
- self.sfc_start, self.sfc_end )
- check_artio_status(status)
- # Now we iterate and create them, level by level.
- # Note that we are doing a bit of magic to figure out how many root
- # nodes we will need at most
- cdef int nmask = self.nn[0] * self.nn[1] * self.nn[2] / 8
- cdef np.uint8_t *mask = <np.uint8_t *> malloc(
- self.nn[0] * self.nn[1] * self.nn[2]) # one bit for each one
- for i in range(nmask): mask[i] = 0
- for sfc in range(self.sfc_start, self.sfc_end + 1):
- status = artio_grid_read_root_cell_begin( handle, sfc,
- dpos, NULL, &num_oct_levels, num_octs_per_level )
- check_artio_status(status)
- artio_sfc_coords(handle, sfc, coords)
- # Now we mask that bit
- for i in range(3):
- coords[i] = <int> (coords[i]/2)
- ipos = ((coords[0]*self.nn[1])+coords[1])*self.nn[2]+coords[2]
- bits = ipos % 8
- mask[ <int> (ipos/8) ] |= (1 << bits)
- for level in range(1, num_oct_levels+1):
- # Now we are simply counting so we can pre-allocate arrays.
- # Because the grids have all been cached this should be fine.
- tot_octs_per_level[level] += num_octs_per_level[level-1]
- status = artio_grid_read_root_cell_end( handle )
+ cdef np.float64_t f64pos[3], dds[3]
+ cdef np.ndarray[np.float64_t, ndim=2] pos
+ # NOTE: We do not cache any SFC ranges here, as we should only ever be
+ # called from within a pre-cached operation in the SFC handler.
+
+ # We only allow one root oct.
+ self.append_domain(oct_count)
+ self.domains[self.num_domains - 1].con_id = sfc
+
+ oct_ind = -1
+ ipos = 0
+ for level in range(num_oct_levels):
+ oct_ind = imax(oct_ind, num_octs_per_level[level])
+ self.level_indices[level] = ipos
+ ipos += num_octs_per_level[level]
+ pos = np.empty((oct_ind, 3), dtype="float64")
+
+ # Now we initialize
+ # Note that we also assume we have already started reading the level.
+ ipos = 0
+ for level in range(num_oct_levels):
+ status = artio_grid_read_level_begin(handle, level + 1)
check_artio_status(status)
- cdef np.int64_t num_root = 0
- for i in range(nmask):
- for j in range(8):
- num_root += ((mask[i] >> j) & 1)
- tot_octs_per_level[0] = num_root
- cdef np.int64_t tot = 0
- for i in range(max_level + 1):
- self.level_indices[i] = tot
- tot += tot_octs_per_level[i]
- self.allocate_domains([num_root, tot - num_root], num_root)
- # Now we have everything counted, and we need to create the appropriate
- # number of arrays.
- cdef np.ndarray[np.float64_t, ndim=2] pos
- pos = np.empty((tot, 3), dtype="float64")
- # We do a special case for level 0
- cdef np.float64_t dds[3]
- for i in range(3):
- dds[i] = (self.DRE[i] - self.DLE[i])/self.nn[i]
- for sfc in range(self.sfc_start, self.sfc_end + 1):
- status = artio_grid_read_root_cell_begin( handle, sfc,
- dpos, NULL, &num_oct_levels, num_octs_per_level)
- check_artio_status(status)
- artio_sfc_coords(handle, sfc, coords)
- # Now we check if we have added yet or not
- for i in range(3):
- coords[i] = <int> (coords[i]/2)
- ipos = ((coords[0]*self.nn[1])+coords[1])*self.nn[2]+coords[2]
- bits = ipos % 8
- if ((mask[<int>(ipos/8)] >> bits) & 1) == 1:
- # We add it here
+ for oct_ind in range(num_octs_per_level[level]):
+ status = artio_grid_read_oct(handle, dpos, NULL, NULL)
for i in range(3):
- dpos[i] = self.DLE[i] + (coords[i]+0.5)*dds[i]
- pos[self.level_indices[0], i] = dpos[i]
- mask[<int>(ipos/8)] -= (1 << bits)
- self.level_indices[0] += 1
- # Now we iterate over all the children
- for level in range(1, num_oct_levels+1):
- status = artio_grid_read_level_begin(handle, level)
- check_artio_status(status)
- for oct_ind in range(num_octs_per_level[level - 1]):
- status = artio_grid_read_oct(handle, dpos, NULL, NULL)
- check_artio_status(status)
- for i in range(3):
- pos[self.level_indices[level], i] = dpos[i]
- self.level_indices[level] += 1
- status = artio_grid_read_level_end(handle)
+ pos[oct_ind, i] = dpos[i]
check_artio_status(status)
- status = artio_grid_read_root_cell_end( handle )
+ status = artio_grid_read_level_end(handle)
check_artio_status(status)
- nadded = 0
- cdef np.int64_t si, ei
- si = 0
- # We initialize domain to 1 so that all root mesh octs are viewed as
- # not belonging to this domain. This way we don't get confused with
- # how the different meshes are interfaced, and the root mesh container
- # will own all the root mesh octs. Then, for all octs at higher
- # levels, we use domain == 2.
- cdef int domain = 1
- for level in range(max_level + 1):
- self.level_indices[level] = si
- ei = si + tot_octs_per_level[level]
- if tot_octs_per_level[level] == 0: break
- nadded = self.add(domain, level, pos[si:ei, :])
- if level > 0 and nadded != (ei - si):
- print domain, self.sfc_start, self.sfc_end
- print level, nadded, ei, si, self.max_root,
- print self.level_indices[level]
- print pos[si:ei,:]
- print nadded, (ei - si), tot_octs_per_level[0]
+ nadded = self.add(self.num_domains, level, pos[:num_octs_per_level[level],:])
+ if nadded != num_octs_per_level[level]:
raise RuntimeError
- si = ei
- domain = 2
- artio_grid_clear_sfc_cache(handle)
- free(mask)
- free(num_octs_per_level)
- free(tot_octs_per_level)
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
def fill_sfc(self,
- np.ndarray[np.uint8_t, ndim=1] levels,
- np.ndarray[np.uint8_t, ndim=1] cell_inds,
- np.ndarray[np.int64_t, ndim=1] file_inds,
- field_indices, dest_fields):
+ np.ndarray[np.uint8_t, ndim=1] levels,
+ np.ndarray[np.uint8_t, ndim=1] cell_inds,
+ np.ndarray[np.int64_t, ndim=1] file_inds,
+ np.ndarray[np.int64_t, ndim=1] domain_counts,
+ field_indices, dest_fields):
cdef np.ndarray[np.float32_t, ndim=2] source
cdef np.ndarray[np.float64_t, ndim=1] dest
cdef int n, status, i, di, num_oct_levels, nf, ngv, max_level
- cdef int j, oct_ind, level
- cdef np.int64_t sfc
+ cdef int level, j, oct_ind, si
+ cdef np.int64_t sfc, ipos
cdef np.float64_t val
cdef artio_fileset_handle *handle = self.artio_handle.handle
cdef double dpos[3]
@@ -736,55 +761,61 @@
nf * sizeof(int))
cdef np.float32_t **field_vals = <np.float32_t**> malloc(
nf * sizeof(np.float32_t*))
- cdef np.int64_t *local_ind = <np.int64_t *> malloc(
- (max_level + 1) * sizeof(np.int64_t))
- for i in range(max_level + 1):
- # This will help us keep track of where we are in the flattened
- # array, which will be indexed by file_ind.
- local_ind[i] = self.level_indices[i]
source_arrays = []
+ ipos = -1
+ for i in range(self.num_domains):
+ ipos = imax(ipos, self.domains[i].n)
for i in range(nf):
field_ind[i] = field_indices[i]
- # This zeros should be an empty once we handle the root grid
- source = np.zeros((self.nocts, 8), dtype="float32")
+ # Note that we subtract one, because we're not using the root mesh.
+ source = np.zeros((ipos, 8), dtype="float32")
source_arrays.append(source)
field_vals[i] = <np.float32_t*> source.data
+ cdef np.int64_t level_position[32], lp
# First we need to walk the mesh in the file. Then we fill in the dest
# location based on the file index.
- status = artio_grid_cache_sfc_range(handle,
- self.sfc_start, self.sfc_end )
- check_artio_status(status)
- for sfc in range(self.sfc_start, self.sfc_end + 1):
+ # A few ways this could be improved:
+ # * Create a new visitor function that actually queried the data,
+ # rather than our somewhat hokey double-loop over SFC arrays.
+ # * Go to pointers for the dest arrays.
+ # * Enable preloading during mesh initialization
+ # * Calculate domain indices on the fly rather than with a
+ # double-loop to calculate domain_counts
+ cdef np.int64_t offset = 0
+ for si in range(self.num_domains):
+ sfc = self.domains[si].con_id
status = artio_grid_read_root_cell_begin( handle, sfc,
dpos, NULL, &num_oct_levels, num_octs_per_level)
check_artio_status(status)
- for level in range(1, num_oct_levels+1):
- status = artio_grid_read_level_begin(handle, level)
+ lp = 0
+ for level in range(num_oct_levels):
+ status = artio_grid_read_level_begin(handle, level + 1)
check_artio_status(status)
- for oct_ind in range(num_octs_per_level[level - 1]):
+ level_position[level] = lp
+ for oct_ind in range(num_octs_per_level[level]):
status = artio_grid_read_oct(handle, dpos, grid_variables, NULL)
check_artio_status(status)
for j in range(8):
for i in range(nf):
- field_vals[i][local_ind[level] * 8 + j] = \
- grid_variables[ngv * j + field_ind[i]]
- local_ind[level] += 1
+ field_vals[i][(oct_ind + lp)*8+j] = \
+ grid_variables[ngv*j+field_ind[i]]
status = artio_grid_read_level_end(handle)
check_artio_status(status)
+ lp += num_octs_per_level[level]
status = artio_grid_read_root_cell_end( handle )
check_artio_status(status)
- # Now we have all our sources.
- artio_grid_clear_sfc_cache(handle)
- for j in range(nf):
- dest = dest_fields[j]
- source = source_arrays[j]
- for i in range(levels.shape[0]):
- if levels[i] == 0: continue
- oct_ind = self.level_indices[levels[i]]
- dest[i] = source[file_inds[i] + oct_ind, cell_inds[i]]
+ # Now we have all our sources.
+ for j in range(nf):
+ dest = dest_fields[j]
+ source = source_arrays[j]
+ for i in range(domain_counts[si]):
+ level = levels[i + offset]
+ oct_ind = file_inds[i + offset] + level_position[level]
+ dest[i + offset] = source[oct_ind, cell_inds[i + offset]]
+ # Now, we offset by the actual number filled here.
+ offset += domain_counts[si]
free(field_ind)
free(field_vals)
- free(local_ind)
free(grid_variables)
free(num_octs_per_level)
@@ -952,11 +983,11 @@
status = artio_particle_read_root_cell_end( handle )
check_artio_status(status)
- status = artio_particle_clear_sfc_cache(handle)
- check_artio_status(status)
+ #status = artio_particle_clear_sfc_cache(handle)
+ #check_artio_status(status)
- status = artio_grid_clear_sfc_cache(handle)
- check_artio_status(status)
+ #status = artio_grid_clear_sfc_cache(handle)
+ #check_artio_status(status)
free(num_octs_per_level)
free(num_particles_per_species)
@@ -976,22 +1007,23 @@
cdef artio_fileset_handle *handle
cdef np.uint64_t sfc_start
cdef np.uint64_t sfc_end
+ cdef public object _last_mask
+ cdef public object _last_selector_id
+ cdef ARTIOSFCRangeHandler range_handler
- def __init__(self, domain_dimensions, # cells
- domain_left_edge,
- domain_right_edge,
- artio_fileset artio_handle,
- sfc_start, sfc_end):
- self.artio_handle = artio_handle
- self.handle = artio_handle.handle
+ def __init__(self, ARTIOSFCRangeHandler range_handler):
cdef int i
for i in range(3):
- self.dims[i] = domain_dimensions[i]
- self.DLE[i] = domain_left_edge[i]
- self.DRE[i] = domain_right_edge[i]
- self.dds[i] = (self.DRE[i] - self.DLE[i])/self.dims[i]
- self.sfc_start = sfc_start
- self.sfc_end = sfc_end
+ self.DLE[i] = range_handler.DLE[i]
+ self.DRE[i] = range_handler.DRE[i]
+ self.dims[i] = range_handler.dims[i]
+ self.dds[i] = range_handler.dds[i]
+ self.handle = range_handler.handle
+ self.artio_handle = range_handler.artio_handle
+ self._last_mask = self._last_selector_id = None
+ self.sfc_start = range_handler.sfc_start
+ self.sfc_end = range_handler.sfc_end
+ self.range_handler = range_handler
@cython.cdivision(True)
cdef np.int64_t pos_to_sfc(self, np.float64_t pos[3]) nogil:
@@ -1019,17 +1051,16 @@
cdef int i
return self.mask(selector).sum()
- def icoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def icoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
# Note that num_octs does not have to equal sfc_end - sfc_start + 1.
cdef np.int64_t sfc
cdef int acoords[3], i
- # We call it num_octs, but it's really num_cells.
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.int64_t, ndim=2] coords
- coords = np.empty((num_octs, 3), dtype="int64")
+ coords = np.empty((num_cells, 3), dtype="int64")
cdef int filled = 0
for sfc in range(self.sfc_start, self.sfc_end + 1):
if mask[sfc - self.sfc_start] == 0: continue
@@ -1042,18 +1073,17 @@
filled += 1
return coords
- def fcoords(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fcoords(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
- # Note that num_octs does not have to equal sfc_end - sfc_start + 1.
+ # Note that num_cells does not have to equal sfc_end - sfc_start + 1.
cdef np.int64_t sfc
cdef np.float64_t pos[3]
cdef int acoords[3], i
- # We call it num_octs, but it's really num_cells.
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.float64_t, ndim=2] coords
- coords = np.empty((num_octs, 3), dtype="float64")
+ coords = np.empty((num_cells, 3), dtype="float64")
cdef int filled = 0
for sfc in range(self.sfc_start, self.sfc_end + 1):
if mask[sfc - self.sfc_start] == 0: continue
@@ -1066,27 +1096,30 @@
filled += 1
return coords
- def fwidth(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def fwidth(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
cdef int i
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.float64_t, ndim=2] width
- width = np.zeros((num_octs, 3), dtype="float64")
+ width = np.zeros((num_cells, 3), dtype="float64")
for i in range(3):
width[:,i] = self.dds[i]
return width
- def ires(self, SelectorObject selector, np.int64_t num_octs = -1,
+ def ires(self, SelectorObject selector, np.int64_t num_cells = -1,
int domain_id = -1):
cdef np.ndarray[np.uint8_t, ndim=1, cast=True] mask
mask = self.mask(selector)
- num_octs = mask.sum()
+ num_cells = mask.sum()
cdef np.ndarray[np.int64_t, ndim=1] res
- res = np.zeros(num_octs, dtype="int64")
+ res = np.zeros(num_cells, dtype="int64")
return res
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
def selector_fill(self, SelectorObject selector,
np.ndarray source,
np.ndarray dest = None,
@@ -1131,42 +1164,30 @@
return dest
return filled
- def mask(self, SelectorObject selector, np.int64_t num_octs = -1):
- cdef int i, status
- cdef double dpos[3]
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
+ @cython.cdivision(True)
+ def mask(self, SelectorObject selector, np.int64_t num_cells = -1):
+ cdef int i
cdef np.float64_t pos[3]
- if num_octs == -1:
+ cdef np.int64_t sfc
+ cdef np.ndarray[np.int64_t, ndim=1] oct_count
+ if self._last_selector_id == hash(selector):
+ return self._last_mask
+ if num_cells == -1:
# We need to count, but this process will only occur one time,
- # since num_octs will later be cached.
- num_octs = self.sfc_end - self.sfc_start + 1
- assert(num_octs == (self.sfc_end - self.sfc_start + 1))
- cdef np.ndarray[np.uint8_t, ndim=1] mask
- cdef int num_oct_levels
- cdef int max_level = self.artio_handle.max_level
- cdef int *num_octs_per_level = <int *>malloc(
- (max_level + 1)*sizeof(int))
- mask = np.zeros((num_octs), dtype="uint8")
- status = artio_grid_cache_sfc_range(self.handle, self.sfc_start,
- self.sfc_end)
- check_artio_status(status)
+ # since num_cells will later be cached.
+ num_cells = self.sfc_end - self.sfc_start + 1
+ mask = np.zeros((num_cells), dtype="uint8")
+ oct_count = self.range_handler.oct_count
for sfc in range(self.sfc_start, self.sfc_end + 1):
- # We check if the SFC is in our selector, and if so, we copy
- # Note that because we initialize to zeros, we can just continue if
- # it's not included.
+ if oct_count[sfc - self.sfc_start] > 0: continue
self.sfc_to_pos(sfc, pos)
if selector.select_cell(pos, self.dds) == 0: continue
- # Now we just need to check if the cells are refined.
- status = artio_grid_read_root_cell_begin( self.handle,
- sfc, dpos, NULL, &num_oct_levels, num_octs_per_level)
- check_artio_status(status)
- status = artio_grid_read_root_cell_end( self.handle )
- check_artio_status(status)
- # If refined, we skip
- if num_oct_levels > 0: continue
mask[sfc - self.sfc_start] = 1
- artio_grid_clear_sfc_cache(self.handle)
- free(num_octs_per_level)
- return mask.astype("bool")
+ self._last_mask = mask.astype("bool")
+ self._last_selector_id = hash(selector)
+ return self._last_mask
def fill_sfc_particles(self, fields):
rv = read_sfc_particles(self.artio_handle,
@@ -1223,8 +1244,8 @@
status = artio_grid_read_root_cell_end( handle )
check_artio_status(status)
# Now we have all our sources.
- status = artio_grid_clear_sfc_cache(handle)
- check_artio_status(status)
+ #status = artio_grid_clear_sfc_cache(handle)
+ #check_artio_status(status)
free(field_ind)
free(field_vals)
free(grid_variables)
diff -r ffe02b75db66bc53abbc73f933a7f7c223bc63b3 -r 18be596249263152c80589b31e52db9db0c39d28 yt/frontends/artio/artio_headers/LICENSE
--- /dev/null
+++ b/yt/frontends/artio/artio_headers/LICENSE
@@ -0,0 +1,850 @@
+ARTIO is licensed under the GNU Lesser General Public License (LGPL) version 3,
+which is an extension of the GNU Gneral Public License (GPL). The text of both
+licenses are included here.
+
+===============================================================================
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
+===============================================================================
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year><name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year><name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+===============================================================================
diff -r ffe02b75db66bc53abbc73f933a7f7c223bc63b3 -r 18be596249263152c80589b31e52db9db0c39d28 yt/frontends/artio/artio_headers/artio.c
--- a/yt/frontends/artio/artio_headers/artio.c
+++ b/yt/frontends/artio/artio_headers/artio.c
@@ -1,10 +1,24 @@
-/*
- * artio.c
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
*
- * Created on: Feb 21, 2010
- * Author: Yongen Yu
- */
-
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
#include "artio.h"
#include "artio_internal.h"
@@ -20,7 +34,7 @@
int artio_fh_buffer_size = ARTIO_DEFAULT_BUFFER_SIZE;
-int artio_set_buffer_size( int buffer_size ) {
+int artio_fileset_set_buffer_size( int buffer_size ) {
if ( buffer_size < 0 ) {
return ARTIO_ERR_INVALID_BUFFER_SIZE;
}
@@ -199,16 +213,18 @@
if ( handle != NULL ) {
handle->parameters = artio_parameter_list_init();
+#ifdef ARTIO_MPI
handle->context = (artio_context *)malloc(sizeof(artio_context));
if ( handle->context == NULL ) {
return NULL;
}
memcpy( handle->context, context, sizeof(artio_context) );
-#ifdef ARTIO_MPI
MPI_Comm_size(handle->context->comm, &num_procs);
MPI_Comm_rank(handle->context->comm, &my_rank);
#else
+ handle->context = NULL;
+
num_procs = 1;
my_rank = 0;
#endif /* MPI */
diff -r ffe02b75db66bc53abbc73f933a7f7c223bc63b3 -r 18be596249263152c80589b31e52db9db0c39d28 yt/frontends/artio/artio_headers/artio.h
--- a/yt/frontends/artio/artio_headers/artio.h
+++ b/yt/frontends/artio/artio_headers/artio.h
@@ -1,20 +1,30 @@
-/*
- * artio.h
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
*
- * Created on: Feb 21, 2010
- * Author: Yongen Yu
- * Modified: Jun 6, 2010 - Doug Rudd
- * Nov 18, 2010 - Doug Rudd
- * Nov 14, 2012 - Doug Rudd
- * Feb 7, 2013 - Doug Rudd - Version 1.0
- * March 3, 2013 - Doug Rudd - Version 1.1 (inc. selectors)
- */
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
#ifndef __ARTIO_H__
#define __ARTIO_H__
#define ARTIO_MAJOR_VERSION 1
-#define ARTIO_MINOR_VERSION 1
+#define ARTIO_MINOR_VERSION 2
#ifdef ARTIO_MPI
#include <mpi.h>
@@ -146,7 +156,7 @@
* Description Close the file
*/
int artio_fileset_close(artio_fileset *handle);
-
+int artio_fileset_set_buffer_size( int buffer_size );
int artio_fileset_has_grid( artio_fileset *handle );
int artio_fileset_has_particles( artio_fileset *handle );
@@ -228,8 +238,6 @@
int artio_fileset_open_grid(artio_fileset *handle);
int artio_fileset_close_grid(artio_fileset *handle);
-int artio_fileset_open_particle(artio_fileset *handle);
-int artio_fileset_close_particle(artio_fileset *handle);
/*
* Description: Output the variables of the root level cell and the hierarchy of the Oct tree correlated with this root level cell
@@ -305,7 +313,7 @@
int artio_grid_clear_sfc_cache(artio_fileset *handle );
int artio_grid_count_octs_in_sfc_range(artio_fileset *handle,
- int64_t start, int64_t end, int64_t *num_octs);
+ int64_t start, int64_t end, int64_t *num_octs_in_range );
/*
* Description: Read a segment of oct nodes
diff -r ffe02b75db66bc53abbc73f933a7f7c223bc63b3 -r 18be596249263152c80589b31e52db9db0c39d28 yt/frontends/artio/artio_headers/artio_endian.c
--- a/yt/frontends/artio/artio_headers/artio_endian.c
+++ b/yt/frontends/artio/artio_headers/artio_endian.c
@@ -1,3 +1,25 @@
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
+ *
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
+
#include "artio_endian.h"
#include <stdint.h>
diff -r ffe02b75db66bc53abbc73f933a7f7c223bc63b3 -r 18be596249263152c80589b31e52db9db0c39d28 yt/frontends/artio/artio_headers/artio_endian.h
--- a/yt/frontends/artio/artio_headers/artio_endian.h
+++ b/yt/frontends/artio/artio_headers/artio_endian.h
@@ -1,3 +1,25 @@
+/**********************************************************************
+ * Copyright (c) 2012-2013, Douglas H. Rudd
+ * All rights reserved.
+ *
+ * This file is part of the artio library.
+ *
+ * artio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * artio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * Copies of the GNU Lesser General Public License and the GNU General
+ * Public License are available in the file LICENSE, included with this
+ * distribution. If you failed to receive a copy of this file, see
+ * <http://www.gnu.org/licenses/>
+ **********************************************************************/
+
#ifndef __ARTIO_EDIAN_H__
#define __ARTIO_EDIAN_H__
This diff is so big that we needed to truncate the remainder.
Repository URL: https://bitbucket.org/yt_analysis/yt-3.0/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
More information about the yt-svn
mailing list