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