Пример #1
0
 def on_solve_clicked(self):
     """ Solve in domain tab. """
     domain = self.domains_dict[str(self.domains.currentItem().text())]
     if not (self.mesh is not None and domain.dim == 'FILE'):
         if not self.getMesh() and self.mesh is None:
             return
     dim = self.mesh.topology().dim()
     initsize = self.mesh.size(dim)
     trans = [self.selectedTransforms.item(i).obj
              for i in xrange(self.selectedTransforms.count())]
     bcs = self.getBCList()
     # create solver and adjust parameters
     wTop, wBottom = self.getWeights()
     solver = Solver(self.mesh, bcs, trans, deg=self.femDegree.value(),
                     bcLast=self.useTransformed.isChecked(),
                     method=str(self.femType.currentText()),
                     wTop=wTop, wBottom=wBottom)
     solver.refineTo(int(self.meshSize.text()),
                     self.meshLimit.currentText() == 'at most',
                     self.refine.currentText() == 'long edge')
     if self.solveType.currentIndex() == 0:
         solver.solveFor(self.solveNumber.value(), None, False)
     else:
         solver.solveFor(self.solveNumber.value(),
                         float(self.targetValue.text()), False)
     # get ready for pickling
     solver.removeMesh()
     longcalc = LongCalculation(solver, [], pickle_solutions, "Solving")
     code = longcalc.exec_()
     if not code:
         # worker failed
         longcalc.cleanUp()
         self.stats.appendPlainText("Solver failed!\n\n")
         return
     results = longcalc.res
     eigv, eigf = results[:2]
     for i in range(len(eigf)):
         u = solver.newFunction()
         u.vector()[:] = eigf[i]
         eigf[i] = u
     finalsize = solver.finalsize
     sol = SolutionTab(dim)
     sol.data = {'geometry': results[2]}
     self.fillTabData(sol.data, trans, bcs, str(initsize), str(finalsize),
                      solver.extraRefine)
     sol.formatData()
     domain = self.domains.currentItem().text()
     self.solutionTabs.addTab(sol, domain)
     for i, [e, u] in enumerate(zip(eigv, eigf)):
         if abs(e) < 1E-9:
             e = 0.0
         new = QListWidgetItem(str(i+1)+': '+str(e))
         new.eigenvalue = e
         new.eigenfunction = u
         sol.eigList.addItem(new)
     self.tabs.tabBar().setCurrentIndex(4)
     self.solutionTabs.tabBar().setCurrentIndex(self.solutionTabs.count()-1)
     sol.setFocus(True)
     self.stats.appendPlainText("Solutions found.\n\n")
Пример #2
0
 def on_solve_clicked(self):
     """ Solve in domain tab. """
     domain = self.domains_dict[str(self.domains.currentItem().text())]
     if not (self.mesh is not None and domain.dim == 'FILE'):
         if not self.getMesh() and self.mesh is None:
             return
     dim = self.mesh.topology().dim()
     initsize = self.mesh.size(dim)
     trans = [
         self.selectedTransforms.item(i).obj
         for i in xrange(self.selectedTransforms.count())
     ]
     bcs = self.getBCList()
     # create solver and adjust parameters
     wTop, wBottom = self.getWeights()
     solver = Solver(self.mesh,
                     bcs,
                     trans,
                     deg=self.femDegree.value(),
                     bcLast=self.useTransformed.isChecked(),
                     method=str(self.femType.currentText()),
                     wTop=wTop,
                     wBottom=wBottom)
     solver.refineTo(int(self.meshSize.text()),
                     self.meshLimit.currentText() == 'at most',
                     self.refine.currentText() == 'long edge')
     if self.solveType.currentIndex() == 0:
         solver.solveFor(self.solveNumber.value(), None, False)
     else:
         solver.solveFor(self.solveNumber.value(),
                         float(self.targetValue.text()), False)
     # get ready for pickling
     solver.removeMesh()
     longcalc = LongCalculation(solver, [], pickle_solutions, "Solving")
     code = longcalc.exec_()
     if not code:
         # worker failed
         longcalc.cleanUp()
         self.stats.appendPlainText("Solver failed!\n\n")
         return
     results = longcalc.res
     eigv, eigf = results[:2]
     for i in range(len(eigf)):
         u = solver.newFunction()
         u.vector()[:] = eigf[i]
         eigf[i] = u
     finalsize = solver.finalsize
     sol = SolutionTab(dim)
     sol.data = {'geometry': results[2]}
     self.fillTabData(sol.data, trans, bcs, str(initsize), str(finalsize),
                      solver.extraRefine)
     sol.formatData()
     domain = self.domains.currentItem().text()
     self.solutionTabs.addTab(sol, domain)
     for i, [e, u] in enumerate(zip(eigv, eigf)):
         if abs(e) < 1E-9:
             e = 0.0
         new = QListWidgetItem(str(i + 1) + ': ' + str(e))
         new.eigenvalue = e
         new.eigenfunction = u
         sol.eigList.addItem(new)
     self.tabs.tabBar().setCurrentIndex(4)
     self.solutionTabs.tabBar().setCurrentIndex(self.solutionTabs.count() -
                                                1)
     sol.setFocus(True)
     self.stats.appendPlainText("Solutions found.\n\n")