Diff of /trunk/escriptcore/py_src/flows.py

revision 2267 by gross, Thu Feb 12 06:18:45 2009 UTC revision 2349 by gross, Mon Mar 30 08:14:23 2009 UTC
# Line 16  http://www.uq.edu.au/esscc Line 16  http://www.uq.edu.au/esscc
20
21  """  """
22  Some models for flow  Some models for flow
# Line 55  class DarcyFlow(object): Line 55  class DarcyFlow(object):
55          @type domain: L{Domain}          @type domain: L{Domain}
56          """          """
57          self.domain=domain          self.domain=domain
58          self.__l=util.integrate(Scalar(1.,Function(self.domain)))*(1./self.domain.getDim())          self.__l=util.longestEdge(self.domain)**2
59          self.__pde_v=LinearPDESystem(domain)          self.__pde_v=LinearPDESystem(domain)
60          if useReduced: self.__pde_v.setReducedOrderOn()          if useReduced: self.__pde_v.setReducedOrderOn()
61          self.__pde_v.setSymmetryOn()          self.__pde_v.setSymmetryOn()
# Line 230  class DarcyFlow(object): Line 230  class DarcyFlow(object):
230           which is solved using the PCG method (precondition is M{Q^*Q}). In each iteration step           which is solved using the PCG method (precondition is M{Q^*Q}). In each iteration step
231           PDEs with operator M{I+D^*D} and with M{Q^*Q} needs to be solved using a sub iteration scheme.           PDEs with operator M{I+D^*D} and with M{Q^*Q} needs to be solved using a sub iteration scheme.
232           """           """
233           self.verbose=verbose           self.verbose=verbose or True
234           self.show_details= show_details and self.verbose           self.show_details= show_details and self.verbose
235           rtol=self.getTolerance()           rtol=self.getTolerance()
236           atol=self.getAbsoluteTolerance()           atol=self.getAbsoluteTolerance()
# Line 327  class DarcyFlow(object): Line 327  class DarcyFlow(object):
327            if self.show_details: print "DarcyFlux: Applying operator"            if self.show_details: print "DarcyFlux: Applying operator"
328            Qdp=self.__Q(dp)            Qdp=self.__Q(dp)
329            self.__pde_v.setValue(Y=-Qdp,X=Data(), r=Data())            self.__pde_v.setValue(Y=-Qdp,X=Data(), r=Data())
330            du=self.__pde_v.getSolution(verbose=self.show_details)            du=self.__pde_v.getSolution(verbose=self.show_details, iter_max = 100000)
331            return Qdp+du            return Qdp+du
332      def __inner_GMRES(self,r,s):      def __inner_GMRES(self,r,s):
333           return util.integrate(util.inner(r,s))           return util.integrate(util.inner(r,s))
# Line 339  class DarcyFlow(object): Line 339  class DarcyFlow(object):
339            self.__pde_p.setTolerance(self.getSubProblemTolerance())            self.__pde_p.setTolerance(self.getSubProblemTolerance())
340            if self.show_details: print "DarcyFlux: Applying preconditioner"            if self.show_details: print "DarcyFlux: Applying preconditioner"
341            self.__pde_p.setValue(X=util.transposed_tensor_mult(self.__permeability,r), Y=Data(), r=Data())            self.__pde_p.setValue(X=util.transposed_tensor_mult(self.__permeability,r), Y=Data(), r=Data())
342            return self.__pde_p.getSolution(verbose=self.show_details)            return self.__pde_p.getSolution(verbose=self.show_details, iter_max = 100000)
343
344      def getFlux(self,p=None, fixed_flux=Data(), show_details=False):      def getFlux(self,p=None, fixed_flux=Data(), show_details=False):
345          """          """
# Line 366  class DarcyFlow(object): Line 366  class DarcyFlow(object):
366             self.__pde_v.setValue(Y=g)             self.__pde_v.setValue(Y=g)
367          else:          else:
368             self.__pde_v.setValue(Y=g-self.__Q(p))             self.__pde_v.setValue(Y=g-self.__Q(p))
369          return self.__pde_v.getSolution(verbose=show_details)          return self.__pde_v.getSolution(verbose=show_details, iter_max=100000)
370