Package PyFoam :: Package IPythonHelpers :: Module Case
[hide private]
[frames] | no frames]

Source Code for Module PyFoam.IPythonHelpers.Case

  1  #  ICE Revision: $Id$ 
  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
32 - def __init__(self,input):
33 """@param input: either a SolutionDirectory-instance or a string 34 with a pathname""" 35 if isinstance(input,SolutionDirectory): 36 self.__sol=input 37 elif isinstance(input,string_types): 38 self.__sol=SolutionDirectory(input, 39 paraviewLink=False, 40 archive=None) 41 else: 42 error(type(input),"not supported")
43 44 @property
45 - def sol(self):
46 """The actual solution directory""" 47 return self.__sol
48 49 @property
50 - def path(self):
51 """The path to the solution""" 52 return self.__sol.name
53 54 @property
55 - def regions(self):
56 """Regions in the case""" 57 return self.__sol.getRegions(defaultRegion=True)
58
59 - def __callCaseReport(self,region=None,level=3,**kwargs):
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):
80 return self.__callCaseReport(region=region, 81 caseSize=True, 82 **kwargs)
83
84 - def boundaryConditions(self,region=None,**kwargs):
85 return self.__callCaseReport(region=region, 86 shortBcReport=True, 87 **kwargs)
88
89 - def longBoundaryConditions(self,region=None,**kwargs):
90 return self.__callCaseReport(region=region, 91 longBcReport=True, 92 **kwargs)
93
94 - def dimensions(self,region=None,**kwargs):
95 return self.__callCaseReport(region=region, 96 dimensions=True, 97 **kwargs)
98
99 - def internalField(self,region=None,**kwargs):
100 return self.__callCaseReport(region=region, 101 internalField=True, 102 **kwargs)
103
104 - def linearSolvers(self,region=None,**kwargs):
105 return self.__callCaseReport(region=region, 106 linearSolvers=True, 107 **kwargs)
108
109 - def relaxationFactors(self,region=None,**kwargs):
110 return self.__callCaseReport(region=region, 111 relaxationFactors=True, 112 **kwargs)
113
114 - def processorMatrix(self,region=None,**kwargs):
115 return self.__callCaseReport(region=region, 116 processorMatrix=True, 117 **kwargs)
118
119 - def decomposition(self,region=None,**kwargs):
120 return self.__callCaseReport(region=region, 121 decomposition=True, 122 **kwargs)
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
135 - def timelineInfo(self,directory):
136 return TimelinePlot(args=[self.path], 137 directoryName=directory, 138 info=True, 139 silent=True).getData()
140
141 - def sampleTime(self,directory,line,time):
142 return SamplePlot(args=[self.path], 143 directoryName=directory, 144 line=[line], 145 time=[time], 146 fuzzyTime=True, 147 mode="separate", 148 pandasData=True)["dataFrame"]
149
150 - def sampleField(self,directory,line,field):
151 return SamplePlot(args=[self.path], 152 directoryName=directory, 153 line=[line], 154 field=[field], 155 mode="separate", 156 pandasData=True)["dataFrame"]
157
158 - def sampleInfo(self,directory):
159 return SamplePlot(args=[self.path], 160 directoryName=directory, 161 info=True, 162 silent=True).getData()
163
164 - def distributionInfo(self,directory):
165 return SamplePlot(args=[self.path], 166 directoryName=directory, 167 isDistribution=True, 168 info=True, 169 silent=True).getData()
170
171 - def distribution(self,directory,line,time):
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
181 - def pickledPlots(self,pickleFile):
182 return RedoPlot( 183 args=[path.join(self.path,pickleFile)], 184 pickleFile=True, 185 pandasData=True)["plotData"]
186
187 - def pickledData(self,pickleFile):
188 return pickle.Unpickler(open(path.join(self.path,pickleFile))).load()
189
190 - def __getObjectName(self,obj):
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
198 - def __getStorageName(self):
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
205 - def timelineSelector(self,directoryName):
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 # this should not happen, but hey! 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
266 - def sampleSelector(self,directoryName):
267 info=self.sampleInfo(directoryName) 268 mode=widgets.ToggleButtonsWidget(description="Mode",values=["Time","Field"]) 269 field=widgets.DropdownWidget(description="Field",values=info["values"]) 270 time=widgets.DropdownWidget(description="Time",values=info["times"],value=info["times"][-1]) 271 line=widgets.DropdownWidget(description="Sample line",values=info["lines"]) 272 varName=widgets.TextWidget(description="Variable Name") 273 storeButton=widgets.ButtonWidget(description="Store to",disabled=True) 274 def mode_changed(name,value): 275 if value=="Time": 276 time.disabled=False 277 field.disabled=True 278 else: 279 time.disabled=True 280 field.disabled=False
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
331 - def distributionSelector(self,directoryName):
332 info=self.distributionInfo(directoryName) 333 time=widgets.DropdownWidget(description="Time",values=info["times"],value=info["times"][-1]) 334 line=widgets.DropdownWidget(description="Sample line",values=info["lines"]) 335 varName=widgets.TextWidget(description="Variable Name") 336 storeButton=widgets.ButtonWidget(description="Store to",disabled=True) 337 def varname_change(name,value): 338 storeButton.description="Store to "+value 339 if len(value)==0: 340 storeButton.disabled=True 341 else: 342 dis=False 343 if not value[0].isalpha(): 344 dis=True 345 storeButton.disabled=dis
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
373 - def pickledPlotSelector(self):
374 pPlot=widgets.DropdownWidget(description="Pickled plot file", 375 values=self.sol.pickledPlots, 376 value=self.sol.pickledPlots[0]) 377 varName=widgets.TextWidget(description="Variable Name") 378 storeButton=widgets.ButtonWidget(description="Store to",disabled=True) 379 def varname_change(name,value): 380 storeButton.description="Store to "+value 381 if len(value)==0: 382 storeButton.disabled=True 383 else: 384 dis=False 385 if not value[0].isalpha(): 386 dis=True 387 storeButton.disabled=dis
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
414 - def pickledDataSelector(self):
415 pData=widgets.DropdownWidget(description="Pickled data file", 416 values=self.sol.pickledData, 417 value=self.sol.pickledData[0]) 418 varName=widgets.TextWidget(description="Variable Name") 419 storeButton=widgets.ButtonWidget(description="Store to",disabled=True) 420 def varname_change(name,value): 421 storeButton.description="Store to "+value 422 if len(value)==0: 423 storeButton.disabled=True 424 else: 425 dis=False 426 if not value[0].isalpha(): 427 dis=True 428 storeButton.disabled=dis
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