Package PyFoam :: Package Basics :: Module DataStructures
[hide private]
[frames] | no frames]

Source Code for Module PyFoam.Basics.DataStructures

  1  """Data structures in Foam-Files that can't be directly represented by Python-Structures""" 
  2   
  3  import FoamFileGenerator 
  4  from copy import deepcopy 
  5  import string,math 
  6   
7 -class FoamDataType(object):
8 - def __repr__(self):
9 return "'"+str(self)+"'"
10 11
12 -class Field(FoamDataType):
13 - def __init__(self,val,name=None):
14 self.val=val 15 self.name=name 16 if self.name==None: 17 self.uniform=True 18 elif type(val) in[list,UnparsedList]: 19 self.uniform=False
20
21 - def __str__(self):
22 result="" 23 if self.uniform: 24 result+="uniform " 25 else: 26 result+="nonuniform "+self.name+" " 27 result+=str(FoamFileGenerator.FoamFileGenerator(self.val)) 28 return result
29
30 - def __cmp__(self,other):
31 if other==None: 32 return 1 33 if self.uniform!=other.uniform: 34 return cmp(self.uniform,other.uniform) 35 elif self.name!=other.name: 36 return cmp(self.name,other.name) 37 else: 38 return cmp(self.val,other.val)
39
40 - def __getitem__(self,key):
41 assert(not self.uniform) 42 return self.val[key]
43
44 - def __setitem__(self,key,value):
45 assert(not self.uniform) 46 self.val[key]=value
47
48 - def isUniform(self):
49 return self.uniform
50
51 - def value(self):
52 return self.val
53
54 - def setUniform(self,data):
55 self.val=data 56 self.uniform=True 57 self.name=None
58
59 -class Dimension(FoamDataType):
60 - def __init__(self,*dims):
61 assert(len(dims)==7) 62 self.dims=list(dims)
63
64 - def __str__(self):
65 result="[ " 66 for v in self.dims: 67 result+=str(v)+" " 68 result+="]" 69 return result
70
71 - def __cmp__(self,other):
72 if other==None: 73 return 1 74 return cmp(self.dims,other.dims)
75
76 - def __getitem__(self,key):
77 return self.dims[key]
78
79 - def __setitem__(self,key,value):
80 self.dims[key]=value
81
82 -class FixedLength(FoamDataType):
83 - def __init__(self,vals):
84 self.vals=vals[:]
85
86 - def __str__(self):
87 return "("+string.join(map(lambda v:"%g"%v,self.vals))+")"
88
89 - def __cmp__(self,other):
90 if other==None: 91 return 1 92 return cmp(self.vals,other.vals)
93
94 - def __getitem__(self,key):
95 return self.vals[key]
96
97 - def __setitem__(self,key,value):
98 self.vals[key]=value
99
100 - def __len__(self):
101 return len(self.vals)
102
103 -class Vector(FixedLength):
104 - def __init__(self,x,y,z):
105 FixedLength.__init__(self,[x,y,z])
106
107 - def __add__(self,y):
108 x=self 109 if type(y)==Vector: 110 return Vector(x[0]+y[0],x[1]+y[1],x[2]+y[2]) 111 elif type(y) in [int,float,long]: 112 return Vector(x[0]+y,x[1]+y,x[2]+y) 113 else: 114 return NotImplemented
115
116 - def __radd__(self,y):
117 x=self 118 if type(y) in [int,float,long]: 119 return Vector(x[0]+y,x[1]+y,x[2]+y) 120 else: 121 return NotImplemented
122
123 - def __sub__(self,y):
124 x=self 125 if type(y)==Vector: 126 return Vector(x[0]-y[0],x[1]-y[1],x[2]-y[2]) 127 elif type(y) in [int,float,long]: 128 return Vector(x[0]-y,x[1]-y,x[2]-y) 129 else: 130 return NotImplemented
131
132 - def __rsub__(self,y):
133 x=self 134 if type(y) in [int,float,long]: 135 return Vector(y-x[0],y-x[1],y-x[2]) 136 else: 137 return NotImplemented
138
139 - def __mul__(self,y):
140 x=self 141 if type(y)==Vector: 142 return Vector(x[0]*y[0],x[1]*y[1],x[2]*y[2]) 143 elif type(y) in [int,float,long]: 144 return Vector(x[0]*y,x[1]*y,x[2]*y) 145 else: 146 return NotImplemented
147
148 - def __rmul__(self,y):
149 x=self 150 if type(y) in [int,float,long]: 151 return Vector(y*x[0],y*x[1],y*x[2]) 152 else: 153 return NotImplemented
154
155 - def __div__(self,y):
156 x=self 157 if type(y)==Vector: 158 return Vector(x[0]/y[0],x[1]/y[1],x[2]/y[2]) 159 elif type(y) in [int,float,long]: 160 return Vector(x[0]/y,x[1]/y,x[2]/y) 161 else: 162 return NotImplemented
163
164 - def __xor__(self,y):
165 x=self 166 if type(y)==Vector: 167 return Vector(x[1]*y[2]-x[2]*y[1], 168 x[2]*y[0]-x[0]*y[2], 169 x[0]*y[1]-x[1]*y[0]) 170 else: 171 return NotImplemented
172
173 - def __abs__(self):
174 x=self 175 return math.sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2])
176
177 - def __neg__(self):
178 x=self 179 return Vector(-x[0],-x[1],-x[2])
180
181 - def __pos__(self):
182 x=self 183 return Vector( x[0], x[1], x[2])
184
185 -class Tensor(FixedLength):
186 - def __init__(self,v1,v2,v3,v4,v5,v6,v7,v8,v9):
187 FixedLength.__init__(self,[v1,v2,v3,v4,v5,v6,v7,v8,v9])
188
189 -class SymmTensor(FixedLength):
190 - def __init__(self,v1,v2,v3,v4,v5,v6):
191 FixedLength.__init__(self,[v1,v2,v3,v4,v5,v6])
192
193 -class DictProxy(dict):
194 """A class that acts like a dictionary, but preserves the order 195 of the entries. Used to beautify the output""" 196
197 - def __init__(self):
198 dict.__init__(self) 199 self._order=[] 200 self._decoration={}
201
202 - def __setitem__(self,key,value):
203 dict.__setitem__(self,key,value) 204 if key not in self._order: 205 self._order.append(key)
206
207 - def __delitem__(self,key):
208 dict.__delitem__(self,key) 209 self._order.remove(key) 210 if key in self._decoration: 211 del self._decoration[key]
212
213 - def __deepcopy__(self,memo):
214 new=DictProxy() 215 for k in self._order: 216 new[k]=deepcopy(self[k],memo) 217 return new
218
219 - def addDecoration(self,key,text):
220 if key in self: 221 self._decoration[key]=text
222
223 - def getDecoration(self,key):
224 if key in self._decoration: 225 return " \t"+self._decoration[key] 226 else: 227 return ""
228
229 -class TupleProxy(list):
230 """Enables Tuples to be manipulated""" 231
232 - def __init__(self,tup=()):
233 list.__init__(self,tup)
234
235 -class Unparsed(object):
236 """A class that encapsulates an unparsed string""" 237
238 - def __init__(self,data):
239 self.data=data
240
241 - def __str__(self):
242 return self.data
243
244 -class UnparsedList(object):
245 """A class that encapsulates a list that was not parsed for 246 performance reasons""" 247
248 - def __init__(self,lngth,data):
249 self.data=data 250 self.length=lngth
251
252 - def __len__(self):
253 return self.length
254
255 - def __cmp__(self,other):
256 return cmp(self.data,other.data)
257