/[escript]/temp_trunk_copy/escript/py_src/linearPDEs.py
ViewVC logotype

Diff of /temp_trunk_copy/escript/py_src/linearPDEs.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 348 by gross, Tue Dec 13 07:33:10 2005 UTC revision 430 by gross, Wed Jan 11 06:40:50 2006 UTC
# Line 419  class LinearPDE(object): Line 419  class LinearPDE(object):
419     @cvar MKL: Intel's MKL solver library     @cvar MKL: Intel's MKL solver library
420     @cvar UMFPACK: the UMFPACK library     @cvar UMFPACK: the UMFPACK library
421     @cvar ITERATIVE: The default iterative solver     @cvar ITERATIVE: The default iterative solver
422       @cvar AMG: algebraic multi grid
423       @cvar RILU: recursive ILU
424    
425     """     """
426     DEFAULT= 0     DEFAULT= 0
# Line 443  class LinearPDE(object): Line 445  class LinearPDE(object):
445     UMFPACK= 16     UMFPACK= 16
446     ITERATIVE= 20     ITERATIVE= 20
447     PASO= 21     PASO= 21
448       AMG= 22
449       RILU = 23
450    
451     __TOL=1.e-13     __TOL=1.e-13
452     __PACKAGE_KEY="package"     __PACKAGE_KEY="package"
453     __METHOD_KEY="method"     __METHOD_KEY="method"
454     __SYMMETRY_KEY="symmetric"     __SYMMETRY_KEY="symmetric"
455     __TOLERANCE_KEY="tolerance"     __TOLERANCE_KEY="tolerance"
456       __PRECONDITIONER_KEY="preconditioner"
457    
458    
459     def __init__(self,domain,numEquations=None,numSolutions=None,debug=False):     def __init__(self,domain,numEquations=None,numSolutions=None,debug=False):
# Line 498  class LinearPDE(object): Line 503  class LinearPDE(object):
503       self.__tolerance=1.e-8       self.__tolerance=1.e-8
504       self.__solver_method=self.DEFAULT       self.__solver_method=self.DEFAULT
505       self.__solver_package=self.DEFAULT       self.__solver_package=self.DEFAULT
506         self.__preconditioner=self.DEFAULT
507       self.__matrix_type=self.__domain.getSystemMatrixTypeId(self.DEFAULT,self.DEFAULT,False)       self.__matrix_type=self.__domain.getSystemMatrixTypeId(self.DEFAULT,self.DEFAULT,False)
508       self.__sym=False       self.__sym=False
509    
# Line 772  class LinearPDE(object): Line 778  class LinearPDE(object):
778         @type verbose: C{bool}         @type verbose: C{bool}
779         @keyword reordering: reordering scheme to be used during elimination. Allowed values are         @keyword reordering: reordering scheme to be used during elimination. Allowed values are
780                              L{NO_REORDERING}, L{MINIMUM_FILL_IN}, L{NESTED_DISSECTION}                              L{NO_REORDERING}, L{MINIMUM_FILL_IN}, L{NESTED_DISSECTION}
        @keyword preconditioner: preconditioner method to be used. Allowed values are  
                                 L{SSOR}, L{ILU0}, L{ILUT}, L{JACOBI}  
781         @keyword iter_max: maximum number of iteration steps allowed.         @keyword iter_max: maximum number of iteration steps allowed.
782         @keyword drop_tolerance: threshold for drupping in L{ILUT}         @keyword drop_tolerance: threshold for drupping in L{ILUT}
783         @keyword drop_storage: maximum of allowed memory in L{ILUT}         @keyword drop_storage: maximum of allowed memory in L{ILUT}
# Line 786  class LinearPDE(object): Line 790  class LinearPDE(object):
790               self.__solution=self.copyConstraint(f*mat)               self.__solution=self.copyConstraint(f*mat)
791            else:            else:
792               options[self.__TOLERANCE_KEY]=self.getTolerance()               options[self.__TOLERANCE_KEY]=self.getTolerance()
793               options[self.__METHOD_KEY]=self.getSolverMethod()               options[self.__METHOD_KEY]=self.getSolverMethod()[0]
794                 options[self.__PRECONDITIONER_KEY]=self.getSolverMethod()[1]
795               options[self.__PACKAGE_KEY]=self.getSolverPackage()               options[self.__PACKAGE_KEY]=self.getSolverPackage()
796               options[self.__SYMMETRY_KEY]=self.isSymmetric()               options[self.__SYMMETRY_KEY]=self.isSymmetric()
797               self.trace("PDE is resolved.")               self.trace("PDE is resolved.")
# Line 815  class LinearPDE(object): Line 820  class LinearPDE(object):
820     # =============================================================================     # =============================================================================
821     #   solver settings:     #   solver settings:
822     # =============================================================================     # =============================================================================
823     def setSolverMethod(self,solver=None):     def setSolverMethod(self,solver=None,preconditioner=None):
824         """         """
825         sets a new solver         sets a new solver
826    
827         @param solver: sets a new solver method.         @param solver: sets a new solver method.
828         @type solver: one of L{DEFAULT}, L{ITERATIVE} L{DIRECT}, L{CHOLEVSKY}, L{PCG}, L{CR}, L{CGS}, L{BICGSTAB}, L{SSOR}, L{GMRES}, L{PRES20}, L{LUMPING}.         @type solver: one of L{DEFAULT}, L{ITERATIVE} L{DIRECT}, L{CHOLEVSKY}, L{PCG}, L{CR}, L{CGS}, L{BICGSTAB}, L{SSOR}, L{GMRES}, L{PRES20}, L{LUMPING}.
829           @param preconditioner: sets a new solver method.
830           @type solver: one of L{DEFAULT}, L{JACOBI} L{ILU0}, L{ILUT},L{SSOR}
831         """         """
832         if solver==None: solve=self.DEFAULT         if solver==None: solve=self.DEFAULT
833         if not solver==self.getSolverMethod():         if preconditioner==None: preconditioner=self.DEFAULT
834           if not (solver,preconditioner)==self.getSolverMethod():
835             self.__solver_method=solver             self.__solver_method=solver
836               self.__preconditioner=preconditioner
837             self.__checkMatrixType()             self.__checkMatrixType()
838             self.trace("New solver is %s"%self.getSolverMethodName())             self.trace("New solver is %s"%self.getSolverMethodName())
839    
# Line 838  class LinearPDE(object): Line 847  class LinearPDE(object):
847    
848         m=self.getSolverMethod()         m=self.getSolverMethod()
849         p=self.getSolverPackage()         p=self.getSolverPackage()
850         if m==self.DEFAULT: method="DEFAULT"         method=""
851         elif m==self.DIRECT: method= "DIRECT"         if m[0]==self.DEFAULT: method="DEFAULT"
852         elif m==self.ITERATIVE: method= "ITERATIVE"         elif m[0]==self.DIRECT: method= "DIRECT"
853         elif m==self.CHOLEVSKY: method= "CHOLEVSKY"         elif m[0]==self.ITERATIVE: method= "ITERATIVE"
854         elif m==self.PCG: method= "PCG"         elif m[0]==self.CHOLEVSKY: method= "CHOLEVSKY"
855         elif m==self.CR: method= "CR"         elif m[0]==self.PCG: method= "PCG"
856         elif m==self.CGS: method= "CGS"         elif m[0]==self.CR: method= "CR"
857         elif m==self.BICGSTAB: method= "BICGSTAB"         elif m[0]==self.CGS: method= "CGS"
858         elif m==self.SSOR: method= "SSOR"         elif m[0]==self.BICGSTAB: method= "BICGSTAB"
859         elif m==self.GMRES: method= "GMRES"         elif m[0]==self.SSOR: method= "SSOR"
860         elif m==self.PRES20: method= "PRES20"         elif m[0]==self.GMRES: method= "GMRES"
861         elif m==self.LUMPING: method= "LUMPING"         elif m[0]==self.PRES20: method= "PRES20"
862         else : method="unknown"         elif m[0]==self.LUMPING: method= "LUMPING"
863           if m[1]==self.DEFAULT: method+="+DEFAULT"
864           elif m[1]==self.JACOBI: method+= "+JACOBI"
865           elif m[1]==self.ILU0: method+= "+ILU0"
866           elif m[1]==self.ILUT: method+= "+ILUT"
867           elif m[1]==self.SSOR: method+= "+SSOR"
868         if p==self.DEFAULT: package="DEFAULT"         if p==self.DEFAULT: package="DEFAULT"
869         elif p==self.PASO: package= "PASO"         elif p==self.PASO: package= "PASO"
870         elif p==self.MKL: package= "MKL"         elif p==self.MKL: package= "MKL"
# Line 867  class LinearPDE(object): Line 881  class LinearPDE(object):
881         @return: the solver method currently be used.         @return: the solver method currently be used.
882         @rtype: C{int}         @rtype: C{int}
883         """         """
884         return self.__solver_method         return self.__solver_method,self.__preconditioner
885    
886     def setSolverPackage(self,package=None):     def setSolverPackage(self,package=None):
887         """         """
# Line 898  class LinearPDE(object): Line 912  class LinearPDE(object):
912        @return: True is lumping is currently used a solver method.        @return: True is lumping is currently used a solver method.
913        @rtype: C{bool}        @rtype: C{bool}
914        """        """
915        return self.getSolverMethod()==self.LUMPING        return self.getSolverMethod()[0]==self.LUMPING
916    
917     def setTolerance(self,tol=1.e-8):     def setTolerance(self,tol=1.e-8):
918         """         """
# Line 1091  class LinearPDE(object): Line 1105  class LinearPDE(object):
1105       """       """
1106       reassess the matrix type and, if a new matrix is needed, resets the system.       reassess the matrix type and, if a new matrix is needed, resets the system.
1107       """       """
1108       new_matrix_type=self.getDomain().getSystemMatrixTypeId(self.getSolverMethod(),self.getSolverPackage(),self.isSymmetric())       new_matrix_type=self.getDomain().getSystemMatrixTypeId(self.getSolverMethod()[0],self.getSolverPackage(),self.isSymmetric())
1109       if not new_matrix_type==self.__matrix_type:       if not new_matrix_type==self.__matrix_type:
1110           self.trace("Matrix type is now %d."%new_matrix_type)           self.trace("Matrix type is now %d."%new_matrix_type)
1111           self.__matrix_type=new_matrix_type           self.__matrix_type=new_matrix_type
# Line 2275  class AdvectionDiffusion(LinearPDE): Line 2289  class AdvectionDiffusion(LinearPDE):
2289       @param debug: if True debug informations are printed.       @param debug: if True debug informations are printed.
2290    
2291       """       """
2292       super(Helmholtz, self).__init__(domain,1,1,debug)       super(AdvectionDiffusion, self).__init__(domain,1,1,debug)
2293       self.COEFFICIENTS={"omega": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_EQUATION,),PDECoefficient.OPERATOR),       self.COEFFICIENTS={"omega": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_EQUATION,),PDECoefficient.OPERATOR),
2294                          "k": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_DIM,PDECoefficient.BY_DIM),PDECoefficient.OPERATOR),                          "k": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_DIM,PDECoefficient.BY_DIM),PDECoefficient.OPERATOR),
2295                          "f": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_EQUATION,),PDECoefficient.RIGHTHANDSIDE),                          "f": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_EQUATION,),PDECoefficient.RIGHTHANDSIDE),
# Line 2313  class AdvectionDiffusion(LinearPDE): Line 2327  class AdvectionDiffusion(LinearPDE):
2327                 depending of reduced order is used for the representation of the equation.                 depending of reduced order is used for the representation of the equation.
2328       @raise IllegalCoefficient: if an unknown coefficient keyword is used.       @raise IllegalCoefficient: if an unknown coefficient keyword is used.
2329       """       """
2330       super(Helmholtz, self).setValue(**coefficients)       super(AdvectionDiffusion, self).setValue(**coefficients)
2331    
2332     def getCoefficientOfGeneralPDE(self,name):     def getCoefficientOfGeneralPDE(self,name):
2333       """       """
# Line 2328  class AdvectionDiffusion(LinearPDE): Line 2342  class AdvectionDiffusion(LinearPDE):
2342       @note: This method is called by the assembling routine to map the Possion equation onto the general PDE.       @note: This method is called by the assembling routine to map the Possion equation onto the general PDE.
2343       """       """
2344       if name == "A" :       if name == "A" :
2345           return self.getCoefficient("k")+outer(self.getCoefficient("upwind"),self.getCoefficient("upwind"))           return self.getCoefficient("k")+util.outer(self.getCoefficient("upwind"),self.getCoefficient("upwind"))
2346       elif name == "B" :       elif name == "B" :
2347           return escript.Data()           return escript.Data()
2348       elif name == "C" :       elif name == "C" :
2349           return escript.getCoefficient("v")           return self.getCoefficient("v")
2350       elif name == "D" :       elif name == "D" :
2351           return self.getCoefficient("omega")           return self.getCoefficient("omega")
2352       elif name == "X" :       elif name == "X" :

Legend:
Removed from v.348  
changed lines
  Added in v.430

  ViewVC Help
Powered by ViewVC 1.1.26