1
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
17
19 return "reactionFile20"
20
22 return path.join("constant","reactions")
23
25 if "reactions" not in content:
26 return False
27 else:
28 return type(content["reactions"]) in [list]
29
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
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
107
110
112 return path.join("constant","polyMesh","blockMeshDict")
113
115 return "boundary" not in content
116
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
128
130 return "thermophysical20"
131
133 return path.join("constant","thermophysicalProperties")
134
136 return content["thermoType"].replace('>','').split('<')
137
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:
147 return True
148
149 return False
150
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
211
212
213
214
215
220
222 return "thermophysicalData20"
223
225 return path.join("constant","thermoData")
226
228 if type(content) in [list]:
229 return True
230 else:
231 return False
232
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
271 - def __init__(self,
272 args=None,
273 **kwargs):
283
291
292
293
294
295
296