[Yt-svn] yt: Thanks to http://mercurial.selenic.com/wiki/FixingCaseCollis...
hg at spacepope.org
hg at spacepope.org
Mon Jun 7 11:52:04 PDT 2010
hg Repository: yt
details: yt/rev/2d1ee4cffb59
changeset: 1757:2d1ee4cffb59
user: Matthew Turk <matthewturk at gmail.com>
date:
Mon Jun 07 11:51:59 2010 -0700
description:
Thanks to http://mercurial.selenic.com/wiki/FixingCaseCollisions I think I have
fixed it. I missed that the copy/move didn't really finish in the SVN
revision.
diffstat:
yt/lagos/Clump.py | 290 ----------------------------------------------------------
1 files changed, 0 insertions(+), 290 deletions(-)
diffs (294 lines):
diff -r 9c0fc362e211 -r 2d1ee4cffb59 yt/lagos/Clump.py
--- a/yt/lagos/Clump.py Mon Jun 07 11:49:49 2010 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,290 +0,0 @@
-"""
-Clump finding helper classes
-
-Author: Britton Smith <Britton.Smith at colorado.edu>
-Affiliation: University of Colorado at Boulder
-License:
- Copyright (C) 2008-2009 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/>.
-"""
-
-from yt.lagos import *
-import numpy as na
-import copy
-
-class Clump(object):
- children = None
- def __init__(self, data, parent, field, cached_fields = None, function=None, clump_info=None):
- self.parent = parent
- self.data = data
- self.field = field
- self.min_val = self.data[field].min()
- self.max_val = self.data[field].max()
- self.cached_fields = cached_fields
-
- # List containing characteristics about clumps that are to be written
- # out by the write routines.
- if clump_info is None:
- self.set_default_clump_info()
- else:
- # Clump info will act the same if add_info_item is called before or after clump finding.
- self.clump_info = copy.deepcopy(clump_info)
-
- # Function determining whether a clump is valid and should be kept.
- self.default_function = 'self.data.quantities["IsBound"](truncate=True,include_thermal_energy=True) > 1.0'
- if function is None:
- self.function = self.default_function
- else:
- self.function = function
-
- # Return value of validity function, saved so it does not have to be calculated again.
- self.function_value = None
-
- def add_info_item(self,quantity,format):
- "Adds an entry to clump_info list and tells children to do the same."
-
- self.clump_info.append({'quantity':quantity, 'format':format})
- if self.children is None: return
- for child in self.children:
- child.add_info_item(quantity,format)
-
- def set_default_clump_info(self):
- "Defines default entries in the clump_info array."
-
- # add_info_item is recursive so this function does not need to be.
- self.clump_info = []
-
- # Number of cells.
- self.add_info_item('self.data["CellMassMsun"].size','"Cells: %d" % value')
- # Gas mass in solar masses.
- self.add_info_item('self.data["CellMassMsun"].sum()','"Mass: %e Msolar" % value')
- # Volume-weighted Jeans mass.
- self.add_info_item('self.data.quantities["WeightedAverageQuantity"]("JeansMassMsun","CellVolume")',
- '"Jeans Mass (vol-weighted): %.6e Msolar" % value')
- # Mass-weighted Jeans mass.
- self.add_info_item('self.data.quantities["WeightedAverageQuantity"]("JeansMassMsun","CellMassMsun")',
- '"Jeans Mass (mass-weighted): %.6e Msolar" % value')
- # Max level.
- self.add_info_item('self.data["GridLevel"].max()','"Max grid level: %d" % value')
- # Minimum number density.
- self.add_info_item('self.data["NumberDensity"].min()','"Min number density: %.6e cm^-3" % value')
- # Maximum number density.
- self.add_info_item('self.data["NumberDensity"].max()','"Max number density: %.6e cm^-3" % value')
-
- def clear_clump_info(self):
- "Clears the clump_info array and passes the instruction to its children."
-
- self.clump_info = []
- if self.children is None: return
- for child in self.children:
- child.clear_clump_info()
-
- def write_info(self,level,f_ptr):
- "Writes information for clump using the list of items in clump_info."
-
- for item in self.clump_info:
- # Call if callable, otherwise do an eval.
- if callable(item['quantity']):
- value = item['quantity']()
- else:
- value = eval(item['quantity'])
- output = eval(item['format'])
- f_ptr.write("%s%s" % ('\t'*level,output))
- f_ptr.write("\n")
-
- def find_children(self, min_val, max_val = None):
- if self.children is not None:
- print "Wiping out existing children clumps."
- self.children = []
- if max_val is None: max_val = self.max_val
- contour_info = identify_contours(self.data, self.field, min_val, max_val,
- self.cached_fields)
- for cid in contour_info:
- new_clump = self.data.extract_region(contour_info[cid])
- self.children.append(Clump(new_clump, self, self.field,
- self.cached_fields,function=self.function,
- clump_info=self.clump_info))
-
- def pass_down(self,operation):
- "Performs an operation on a clump with an exec and passes the instruction down to clump children."
-
- # Call if callable, otherwise do an exec.
- if callable(operation):
- operation()
- else:
- exec(operation)
-
- for child in self.children:
- child.pass_down(operation)
-
- def _isValid(self):
- "Perform user specified function to determine if child clumps should be kept."
-
- # Only call function if it has not been already.
- if self.function_value is None:
- self.function_value = eval(self.function)
-
- return self.function_value
-
- def __reduce__(self):
- return (_reconstruct_clump,
- (self.parent, self.field, self.min_val, self.max_val,
- self.function_value, self.children, self.data, self.clump_info, self.function))
-
- def __getitem__(self,request):
- return self.data[request]
-
-def _reconstruct_clump(parent, field, mi, ma, function_value, children, data, clump_info,
- function=None):
- obj = object.__new__(Clump)
- if iterable(parent): parent = parent[1]
- if children is None: children = []
- obj.parent, obj.field, obj.min_val, obj.max_val, obj.function_value, obj.children, obj.clump_info, obj.function = \
- parent, field, mi, ma, function_value, children, clump_info, function
- # Now we override, because the parent/child relationship seems a bit
- # unreliable in the unpickling
- for child in children: child.parent = obj
- obj.data = data[1] # Strip out the PF
- if obj.parent is None: return (data[0], obj)
- return obj
-
-def find_clumps(clump, min_val, max_val, d_clump):
- print "Finding clumps: min: %e, max: %e, step: %f" % (min_val, max_val, d_clump)
- if min_val >= max_val: return
- clump.find_children(min_val)
-
- if (len(clump.children) == 1):
- find_clumps(clump, min_val*d_clump, max_val, d_clump)
-
- elif (len(clump.children) > 0):
- these_children = []
- print "Investigating %d children." % len(clump.children)
- for child in clump.children:
- find_clumps(child, min_val*d_clump, max_val, d_clump)
- if ((child.children is not None) and (len(child.children) > 0)):
- these_children.append(child)
- elif (child._isValid()):
- these_children.append(child)
- else:
- print "Eliminating invalid, childless clump with %d cells." % len(child.data["CellMassMsun"])
- if (len(these_children) > 1):
- print "%d of %d children survived." % (len(these_children),len(clump.children))
- clump.children = these_children
- elif (len(these_children) == 1):
- print "%d of %d children survived, linking its children to parent." % (len(these_children),len(clump.children))
- clump.children = these_children[0].children
- else:
- print "%d of %d children survived, erasing children." % (len(these_children),len(clump.children))
- clump.children = []
-
-def get_lowest_clumps(clump, clump_list=None):
- "Return a list of all clumps at the bottom of the hierarchy."
-
- if clump_list is None: clump_list = []
- if clump.children is None or len(clump.children) == 0:
- clump_list.append(clump)
- if clump.children is not None and len(clump.children) > 0:
- for child in clump.children:
- get_lowest_clumps(child, clump_list=clump_list)
-
- return clump_list
-
-def write_clump_hierarchy(clump,level,f_ptr):
- for q in range(level):
- f_ptr.write("\t")
- f_ptr.write("Clump at level %d:\n" % level)
- clump.write_info(level,f_ptr)
- f_ptr.write("\n")
- f_ptr.flush()
- if ((clump.children is not None) and (len(clump.children) > 0)):
- for child in clump.children:
- write_clump_hierarchy(child,(level+1),f_ptr)
-
-def write_clumps(clump,level,f_ptr):
- if ((clump.children is None) or (len(clump.children) == 0)):
- f_ptr.write("%sClump:\n" % ("\t"*level))
- clump.write_info(level,f_ptr)
- f_ptr.write("\n")
- f_ptr.flush()
- if ((clump.children is not None) and (len(clump.children) > 0)):
- for child in clump.children:
- write_clumps(child,0,f_ptr)
-
-# Old clump info writing routines.
-def write_old_clump_hierarchy(clump,level,f_ptr):
- for q in range(level):
- f_ptr.write("\t")
- f_ptr.write("Clump at level %d:\n" % level)
- clump.write_info(level,f_ptr)
- write_old_clump_info(clump,level,f_ptr)
- f_ptr.write("\n")
- f_ptr.flush()
- if ((clump.children is not None) and (len(clump.children) > 0)):
- for child in clump.children:
- write_clump_hierarchy(child,(level+1),f_ptr)
-
-def write_old_clumps(clump,level,f_ptr):
- if ((clump.children is None) or (len(clump.children) == 0)):
- f_ptr.write("%sClump:\n" % ("\t"*level))
- write_old_clump_info(clump,level,f_ptr)
- f_ptr.write("\n")
- f_ptr.flush()
- if ((clump.children is not None) and (len(clump.children) > 0)):
- for child in clump.children:
- write_clumps(child,0,f_ptr)
-
-__clump_info_template = \
-"""
-%(tl)sCells: %(num_cells)s
-%(tl)sMass: %(total_mass).6e Msolar
-%(tl)sJeans Mass (vol-weighted): %(jeans_mass_vol).6e Msolar
-%(tl)sJeans Mass (mass-weighted): %(jeans_mass_mass).6e Msolar
-%(tl)sMax grid level: %(max_level)s
-%(tl)sMin number density: %(min_density).6e cm^-3
-%(tl)sMax number density: %(max_density).6e cm^-3
-
-"""
-
-def write_old_clump_info(clump,level,f_ptr):
- fmt_dict = {'tl': "\t" * level}
- fmt_dict['num_cells'] = clump.data["CellMassMsun"].size,
- fmt_dict['total_mass'] = clump.data["CellMassMsun"].sum()
- fmt_dict['jeans_mass_vol'] = clump.data.quantities["WeightedAverageQuantity"]("JeansMassMsun","CellVolume")
- fmt_dict['jeans_mass_mass'] = clump.data.quantities["WeightedAverageQuantity"]("JeansMassMsun","CellMassMsun")
- fmt_dict['max_level'] = clump.data["GridLevel"].max()
- fmt_dict['min_density'] = clump.data["NumberDensity"].min()
- fmt_dict['max_density'] = clump.data["NumberDensity"].max()
- f_ptr.write(__clump_info_template % fmt_dict)
-
-# Recipes for various clump calculations.
-recipes = {}
-
-# Distance from clump center of mass to center of mass of top level object.
-def _DistanceToMainClump(master,units='pc'):
- masterCOM = master.data.quantities['CenterOfMass']()
- pass_command = "self.masterCOM = [%.10f, %.10f, %.10f]" % (masterCOM[0],
- masterCOM[1],
- masterCOM[2])
- master.pass_down(pass_command)
- master.pass_down("self.com = self.data.quantities['CenterOfMass']()")
-
- quantity = "((self.com[0]-self.masterCOM[0])**2 + (self.com[1]-self.masterCOM[1])**2 + (self.com[2]-self.masterCOM[2])**2)**(0.5)*self.data.pf.units['%s']" % units
- format = "%s%s%s" % ("'Distance from center: %.6e ",units,"' % value")
-
- master.add_info_item(quantity,format)
-
-recipes['DistanceToMainClump'] = _DistanceToMainClump
More information about the yt-svn
mailing list