Package PyFoam :: Package Applications :: Module UpgradeDictionariesTo20
[hide private]
[frames] | no frames]

Source Code for Module PyFoam.Applications.UpgradeDictionariesTo20

  1  #  ICE Revision: $Id$ 
  2  """ 
  3  Application class that implements pyFoamUpgradeDictionariesTo20 
  4  """ 
  5   
  6  import sys,re 
  7  from os import path 
  8   
  9  from .UpgradeDictionariesTo17 import UpgradeDictionariesTo17,DictionaryUpgradeInfo 
 10   
 11  from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile 
 12  from PyFoam.Basics.DataStructures import DictProxy,TupleProxy 
 13  from PyFoam.Error import error,warning 
 14   
15 -class ReactionFileUpgradeInfo(DictionaryUpgradeInfo):
16 - def __init__(self):
17 DictionaryUpgradeInfo.__init__(self) 18 self.noHeader=True
19
20 - def name(self):
21 return "reactionFile20"
22
23 - def location(self):
24 return path.join("constant","reactions")
25
26 - def checkUpgrade(self,content):
27 if "reactions" not in content: 28 return False 29 else: 30 return type(content["reactions"]) in [list]
31
32 - def makeCoeffList(self,raw,default,specNames):
33 specs=set(specNames) 34 lst=[] 35 for s,v in zip(raw[0::2],raw[1::2]): 36 lst.append([s,v]) 37 specs.remove(s) 38 39 for s in specs: 40 lst.append([s,default]) 41 42 return lst
43
44 - def manipulate(self,content):
45 newReactions=DictProxy() 46 rData=zip(*[content["reactions"][i::3] for i in range(3)]) 47 cnt=1 48 for rType,scheme,parameters in rData: 49 name="reaction%d"%cnt 50 cnt+=1 51 r={} 52 r["type"]=rType 53 r["reaction"]='"'+str(scheme).strip()+'"' 54 if rType in ["irreversibleArrheniusReaction", 55 "reversibleArrheniusReaction"]: 56 r["A"]=parameters[0] 57 r["beta"]=parameters[1] 58 r["Ta"]=parameters[2] 59 elif rType in ["reversiblethirdBodyArrheniusReaction"]: 60 r["A"]=parameters[0][0] 61 r["beta"]=parameters[0][1] 62 r["Ta"]=parameters[0][2] 63 r["defaultEfficiency"]=parameters[1][0] 64 r["coeffs"]=self.makeCoeffList(parameters[1][1:], 65 parameters[1][0], 66 content["species"]) 67 elif rType in ["reversibleArrheniusLindemannFallOffReaction"]: 68 r["k0"]={} 69 r["k0"]["A"]=parameters[0][0] 70 r["k0"]["beta"]=parameters[0][1] 71 r["k0"]["Ta"]=parameters[0][2] 72 r["kInf"]={} 73 r["kInf"]["A"]=parameters[1][0] 74 r["kInf"]["beta"]=parameters[1][1] 75 r["kInf"]["Ta"]=parameters[1][2] 76 r["F"]={} 77 r["thirdBodyEfficiencies"]={} 78 r["thirdBodyEfficiencies"]["defaultEfficiency"]=parameters[2][0] 79 r["thirdBodyEfficiencies"]["coeffs"]=self.makeCoeffList(parameters[2][1:], 80 parameters[2][0], 81 content["species"]) 82 elif rType in ["reversibleArrheniusTroeFallOffReaction"]: 83 r["k0"]={} 84 r["k0"]["A"]=parameters[0][0] 85 r["k0"]["beta"]=parameters[0][1] 86 r["k0"]["Ta"]=parameters[0][2] 87 r["kInf"]={} 88 r["kInf"]["A"]=parameters[1][0] 89 r["kInf"]["beta"]=parameters[1][1] 90 r["kInf"]["Ta"]=parameters[1][2] 91 r["F"]={} 92 r["F"]["alpha"]=parameters[2][0] 93 r["F"]["Tsss"]=parameters[2][1] 94 r["F"]["Ts"]=parameters[2][2] 95 r["F"]["Tss"]=parameters[2][3] 96 r["thirdBodyEfficiencies"]={} 97 r["thirdBodyEfficiencies"]["defaultEfficiency"]=parameters[3][0] 98 r["thirdBodyEfficiencies"]["coeffs"]=self.makeCoeffList(parameters[3][1:], 99 parameters[3][0], 100 content["species"]) 101 else: 102 r["unsupported"]=parameters 103 newReactions[name]=r 104 content["reactions"]=newReactions
105
106 -class BlockMeshUpgradeInfo(DictionaryUpgradeInfo):
107 - def __init__(self):
109
110 - def name(self):
111 return "blockMesh20"
112
113 - def location(self):
114 return path.join("constant","polyMesh","blockMeshDict")
115
116 - def checkUpgrade(self,content):
117 return "boundary" not in content
118
119 - def manipulate(self,content):
120 p=content["patches"] 121 bnd=[] 122 for t,n,f in zip(p[0::3],p[1::3],p[2::3]): 123 bnd+=[ n, { "type" : t, 124 "faces" : f }] 125 content["boundary"]=bnd
126
127 -class ThermophysicalUpgradeInfo(DictionaryUpgradeInfo):
128 - def __init__(self):
130
131 - def name(self):
132 return "thermophysical20"
133
134 - def location(self):
135 return path.join("constant","thermophysicalProperties")
136
137 - def analyzeThermoType(self,content):
138 return content["thermoType"].replace('>','').split('<')
139
140 - def checkUpgrade(self,content):
141 tt=self.analyzeThermoType(content) 142 if len(tt)!=6: 143 return False 144 145 for nm in content: 146 data=content[nm] 147 if type(data) in [tuple,TupleProxy]: 148 if len(data)>4: # Maybe there is a better criterium 149 return True 150 151 return False
152
153 - def manipulate(self,content):
154 what,mix,trans,spec,therm,gas=self.analyzeThermoType(content) 155 for nm in content: 156 data=content[nm] 157 used=0 158 159 if type(data) not in [tuple,TupleProxy]: 160 continue 161 if len(data)<5: 162 continue 163 164 transDict={} 165 if trans=="constTransport": 166 transDict["Pr"]=data[-1-used] 167 transDict["mu"]=data[-2-used] 168 used+=2 169 elif trans=="sutherlandTransport": 170 transDict["Ts"]=data[-1-used] 171 transDict["As"]=data[-2-used] 172 used+=2 173 else: 174 error("Transport type",trans,"not implemented") 175 176 thermDict={} 177 if therm=="hConstThermo": 178 thermDict["Hf"]=data[-1-used] 179 thermDict["Cp"]=data[-2-used] 180 used+=2 181 elif therm=="eConstThermo": 182 thermDict["Hf"]=data[-1-used] 183 thermDict["Cv"]=data[-2-used] 184 used+=2 185 elif therm=="janafThermo": 186 thermDict["lowCpCoeffs"]=data[-7-used:-0-used] 187 thermDict["highCpCoeffs"]=data[-14-used:-7-used] 188 thermDict["Tcommon"]=data[-15-used] 189 thermDict["Thigh"]=data[-16-used] 190 thermDict["Tlow"]=data[-17-used] 191 used+=2*7+3 192 else: 193 error("Thermodynamics type",therm,"not implemented") 194 195 specDict={} 196 if spec=="specieThermo": 197 specDict["molWeight"]=data[-1-used] 198 specDict["nMoles"]=data[-2-used] 199 used+=2 200 else: 201 error("Specie type",spec,"not implemented") 202 203 if len(data)!=used+1: 204 warning("Not all data for",nm,"used") 205 206 comment=self.makeComment(data) 207 content[nm]={"specie":specDict, 208 "thermodynamics":thermDict, 209 "transport":transDict} 210 content.addDecoration(nm,comment)
211 212 ## gasDict={} 213 ## if gas=="perfectGas": 214 ## pass 215 ## else: 216 ## error("Gas type",gas,"not implemented") 217
218 -class ThermophysicalDataUpgradeInfo(DictionaryUpgradeInfo):
219 - def __init__(self):
220 DictionaryUpgradeInfo.__init__(self) 221 self.listDict=True
222
223 - def name(self):
224 return "thermophysicalData20"
225
226 - def location(self):
227 return path.join("constant","thermoData")
228
229 - def checkUpgrade(self,content):
230 if type(content) in [list]: 231 return True 232 else: 233 return False
234
235 - def manipulate(self,content):
236 lenData=2+2+(2*7+3)+2 237 rawData=zip(*[content[i::lenData] for i in range(lenData)]) 238 content=DictProxy() 239 for d in rawData: 240 name=d[0] 241 data=d[2:] 242 used=0 243 244 specDict={} 245 specDict["nMoles"]=data[used] 246 specDict["molWeight"]=data[used+1] 247 used+=2 248 249 thermDict={} 250 thermDict["Tlow"]=data[used] 251 thermDict["Thigh"]=data[used+1] 252 thermDict["Tcommon"]=data[used+2] 253 thermDict["highCpCoeffs"]=list(data[used+3:used+3+7]) 254 thermDict["lowCpCoeffs"]=list(data[used+3+7:used+3+2*7]) 255 used+=2*7+3 256 257 transDict={} 258 transDict["As"]=data[used] 259 transDict["Ts"]=data[used+1] 260 used+=2 261 262 if len(data)!=used: 263 warning("Not all data for",name,"used:",used,len(data)) 264 265 comment=self.makeComment(d) 266 content[name]={"specie":specDict, 267 "thermodynamics":thermDict, 268 "transport":transDict} 269 content.addDecoration(name,comment) 270 return content
271
272 -class UpgradeDictionariesTo20(UpgradeDictionariesTo17):
273 - def __init__(self,args=None):
274 description="""\ 275 Examines dictionaries in a case and tries to upgrade them to a form 276 that is compatible with OpenFOAM 2.0 277 """ 278 279 UpgradeDictionariesTo17.__init__(self, 280 args=args, 281 description=description)
282
283 - def addDicts(self):
290 291 ## def addOptions(self): 292 ## UpgradeDictionariesTo17.addOptions(self) 293 294 # Should work with Python3 and Python2 295