1
2 """Encapsulate a case and give convenient access to certain applications
3 """
4
5 from docutils.core import publish_parts
6 from os import path
7
8 from PyFoam.RunDictionary.SolutionDirectory import SolutionDirectory
9
10 from PyFoam.Applications.CaseReport import CaseReport
11 from PyFoam.Applications.TimelinePlot import TimelinePlot
12 from PyFoam.Applications.SamplePlot import SamplePlot
13 from PyFoam.Applications.RedoPlot import RedoPlot
14
15 from PyFoam.ThirdParty.six import string_types,StringIO,print_
16 from PyFoam.ThirdParty.six.moves import cPickle as pickle
17 from PyFoam.Error import error
18
19 from PyFoam.IPythonHelpers import create_code_cell
20 from PyFoam.IPythonHelpers.PermanentStorage import PermanentStorage
21
22 from IPython.display import HTML,display
23 from IPython.html import widgets
24 from IPython import get_ipython
25
26 -class Case(object):
27 """This class is initialized with a path and gives access to
28 reporting functions
29
30 """
31
43
44 @property
46 """The actual solution directory"""
47 return self.__sol
48
49 @property
51 """The path to the solution"""
52 return self.__sol.name
53
54 @property
56 """Regions in the case"""
57 return self.__sol.getRegions(defaultRegion=True)
58
60 """Helper function that does the actual calling of CaseReport
61 and returning of the HTML-formatted output"""
62 s=StringIO()
63
64 if region!=None:
65 level=level+1
66
67 CaseReport(args=[self.path],
68 region=region,
69 file=s,
70 headingLevel=level,
71 **kwargs)
72 return HTML(publish_parts(s.getvalue(),
73 writer_name='html',
74 settings_overrides={
75 "initial_header_level":level,
76 "doctitle_xform":False
77 })['html_body'])
78
79 - def size(self,region=None,**kwargs):
83
85 return self.__callCaseReport(region=region,
86 shortBcReport=True,
87 **kwargs)
88
90 return self.__callCaseReport(region=region,
91 longBcReport=True,
92 **kwargs)
93
98
103
108
113
118
123
124 - def timeline(self,directory,fieldname):
125 if isinstance(fieldname,string_types):
126 f=[fieldname]
127 else:
128 f=fieldname
129 return TimelinePlot(args=[self.path],
130 directoryName=directory,
131 fields=f,
132 basicMode="lines",
133 pandasData=True)["dataFrame"]
134
140
149
151 return SamplePlot(args=[self.path],
152 directoryName=directory,
153 line=[line],
154 field=[field],
155 mode="separate",
156 pandasData=True)["dataFrame"]
157
163
170
172 return SamplePlot(args=[self.path],
173 directoryName=directory,
174 isDistribution=True,
175 line=[line],
176 time=[time],
177 fuzzyTime=True,
178 mode="separate",
179 pandasData=True)["dataFrame"]
180
182 return RedoPlot(
183 args=[path.join(self.path,pickleFile)],
184 pickleFile=True,
185 pandasData=True)["plotData"]
186
189
191 for ns in get_ipython().all_ns_refs:
192 for n,v in ns.items():
193 if obj is v:
194 if n[0]!="_":
195 return n
196 return "unknown"
197
199 for ns in get_ipython().all_ns_refs:
200 for n,v in ns.items():
201 if isinstance(v,PermanentStorage):
202 return n,v
203 return None
204
206 info=self.timelineInfo(directoryName)
207 lst=[widgets.LatexWidget(value="Fields:")]
208 fieldsSelected=set()
209 storeButton=widgets.ButtonWidget(description="Store to",disabled=True)
210 def make_field_toggle(fName):
211 def f(name,value):
212 if value:
213 fieldsSelected.add(fName)
214 else:
215 try:
216 fieldsSelected.remove(fName)
217 except KeyError:
218 pass
219 if len(fieldsSelected)>0:
220 storeButton.disabled=False
221 else:
222 storeButton.disabled=True
223 return f
224 for f in info["fields"]:
225 w=widgets.ToggleButtonWidget(description=f)
226 w.on_trait_change(make_field_toggle(f), 'value')
227 lst.append(w)
228 fields=widgets.ContainerWidget(description="Fields",children=lst)
229 fields.add_class("hbox")
230 varName=widgets.TextWidget(description="Variable Name")
231 def varname_change(name,value):
232 storeButton.description="Store to "+value
233 if len(value)==0 or len(fieldsSelected)==0:
234 storeButton.disabled=True
235 else:
236 dis=False
237 if not value[0].isalpha():
238 dis=True
239 storeButton.disabled=dis
240 varName.on_trait_change(varname_change, 'value')
241 def store_clicked(b):
242 v=varName.value
243 f=list(fieldsSelected)
244 print_("Storing",f,"from",directoryName,"in",self.path,"to variable",v)
245 name=self.__getObjectName(self)
246 store=self.__getStorageName()
247 cmd="%s.timeline('%s',%s)" % (name,directoryName,str(f))
248 if store:
249 sname,sval=store
250 create_code_cell(
251 "%s=%s('%s',lambda:%s)" % (v,sname,v,cmd),
252 "below")
253 val=sval(v,lambda:self.timeline(directoryName,f))
254 else:
255 create_code_cell(
256 "%s=%s" % (v,cmd),
257 "below")
258 val=self.timeline(directoryName,f)
259 get_ipython().push({v:val})
260 varName.value=""
261 storeButton.on_click(store_clicked)
262 total=widgets.ContainerWidget(children=[fields,varName,storeButton])
263 total.add_class("vbox")
264 display(total)
265
281 mode.on_trait_change(mode_changed,'value')
282 mode_changed('value',mode.value)
283 def varname_change(name,value):
284 storeButton.description="Store to "+value
285 if len(value)==0:
286 storeButton.disabled=True
287 else:
288 dis=False
289 if not value[0].isalpha():
290 dis=True
291 storeButton.disabled=dis
292 varName.on_trait_change(varname_change, 'value')
293 def store_clicked(b):
294 l=line.value
295 v=varName.value
296 name=self.__getObjectName(self)
297 store=self.__getStorageName()
298 if mode.value=="Time":
299 t=time.value
300 print_("Storing fields at t=",t,"on line",l,"from",directoryName,"in",self.path,"to variable",v)
301 cmdBase="%s.sampleTime('%s','%s','%s')" % (name,directoryName,l,t)
302 if store:
303 sname,sval=store
304 cmd="%s=%s('%s',lambda:%s)" % (v,sname,v,cmdBase)
305 val=sval(v,lambda:self.sampleTime(directoryName,l,t))
306 else:
307 cmd="%s=%s" % (v,cmdBase)
308 val=self.sampleTime(directoryName,l,t)
309 elif mode.value=="Field":
310 f=field.value
311 print_("Storing fields",f," at all times on line",l,"from",directoryName,"in",self.path,"to variable",v)
312 cmdBase="%s.sampleField('%s','%s','%s')" % (name,directoryName,l,f)
313 if store:
314 sname,sval=store
315 cmd="%s=%s('%s',lambda:%s)" % (v,sname,v,cmdBase)
316 val=sval(v,lambda:self.sampleField(directoryName,l,f))
317 else:
318 cmd="%s=%s" % (v,cmdBase)
319 val=self.sampleField(directoryName,l,f)
320 else:
321 print_("Unknown mode",mode)
322 return
323 create_code_cell(cmd,"below")
324 get_ipython().push({v:val})
325 varName.value=""
326 storeButton.on_click(store_clicked)
327 total=widgets.ContainerWidget(children=[mode,line,field,time,varName,storeButton])
328 total.add_class("vbox")
329 display(total)
330
346 varName.on_trait_change(varname_change, 'value')
347 def store_clicked(b):
348 l=line.value
349 v=varName.value
350 name=self.__getObjectName(self)
351 store=self.__getStorageName()
352 t=time.value
353 print_("Storing distribution at t=",t,"on line",l,"from",directoryName,"in",self.path,"to variable",v)
354 cmd="%s.distribution('%s','%s','%s')" % (name,directoryName,l,t)
355 if store:
356 sname,sval=store
357 create_code_cell(
358 "%s=%s('%s',lambda:%s)" % (v,sname,v,cmd),
359 "below")
360 val=sval(v,lambda:self.distribution(directoryName,l,t))
361 else:
362 create_code_cell(
363 "%s=%s" % (v,cmd),
364 "below")
365 val=self.distribution(directoryName,l,t)
366 get_ipython().push({v:val})
367 varName.value=""
368 storeButton.on_click(store_clicked)
369 total=widgets.ContainerWidget(children=[line,time,varName,storeButton])
370 total.add_class("vbox")
371 display(total)
372
388 varName.on_trait_change(varname_change, 'value')
389 def store_clicked(b):
390 p=pPlot.value
391 v=varName.value
392 name=self.__getObjectName(self)
393 store=self.__getStorageName()
394 print_("Storing Pickled Plot data from",p,"to variable",v)
395 cmd="%s.pickledPlots('%s')" % (name,p)
396 if store:
397 sname,sval=store
398 create_code_cell(
399 "%s=%s('%s',lambda:%s)" % (v,sname,v,cmd),
400 "below")
401 val=sval(v,lambda:self.pickledPlots(p))
402 else:
403 create_code_cell(
404 "%s=%s" % (v,cmd),
405 "below")
406 val=self.pickledPlots(p)
407 get_ipython().push({v:val})
408 varName.value=""
409 storeButton.on_click(store_clicked)
410 total=widgets.ContainerWidget(children=[pPlot,varName,storeButton])
411 total.add_class("vbox")
412 display(total)
413
429 varName.on_trait_change(varname_change, 'value')
430 def store_clicked(b):
431 p=pData.value
432 v=varName.value
433 name=self.__getObjectName(self)
434 store=self.__getStorageName()
435 print_("Storing Pickled Data from",p,"to variable",v)
436 cmd="%s.pickledData('%s')" % (name,p)
437 if store:
438 sname,sval=store
439 create_code_cell(
440 "%s=%s('%s',lambda:%s)" % (v,sname,v,cmd),
441 "below")
442 val=sval(v,lambda:self.pickledData(p))
443 else:
444 create_code_cell(
445 "%s=%s" % (v,cmd),
446 "below")
447 val=self.pickledData(p)
448 get_ipython().push({v:val})
449 varName.value=""
450 storeButton.on_click(store_clicked)
451 total=widgets.ContainerWidget(children=[pData,varName,storeButton])
452 total.add_class("vbox")
453 display(total)
454