# Diff of /trunk/escript/py_src/linearPDEs.py

revision 595 by gross, Wed Feb 15 08:11:10 2006 UTC revision 596 by gross, Wed Mar 15 22:41:23 2006 UTC
# Line 448  class LinearPDE(object): Line 448  class LinearPDE(object):
448     AMG= 22     AMG= 22
449     RILU = 23     RILU = 23
450
451     __TOL=1.e-13     SMALL_TOLERANCE=1.e-13
452     __PACKAGE_KEY="package"     __PACKAGE_KEY="package"
453     __METHOD_KEY="method"     __METHOD_KEY="method"
454     __SYMMETRY_KEY="symmetric"     __SYMMETRY_KEY="symmetric"
# Line 703  class LinearPDE(object): Line 703  class LinearPDE(object):
703        else:        else:
704           A=self.getCoefficientOfGeneralPDE("A")           A=self.getCoefficientOfGeneralPDE("A")
705           if not A.isEmpty():           if not A.isEmpty():
706              tol=util.Lsup(A)*self.__TOL              tol=util.Lsup(A)*self.SMALL_TOLERANCE
707              if self.getNumSolutions()>1:              if self.getNumSolutions()>1:
708                 for i in range(self.getNumEquations()):                 for i in range(self.getNumEquations()):
709                    for j in range(self.getDim()):                    for j in range(self.getDim()):
# Line 727  class LinearPDE(object): Line 727  class LinearPDE(object):
727              if verbose: print "non-symmetric PDE because C is not present but B is"              if verbose: print "non-symmetric PDE because C is not present but B is"
728              out=False              out=False
729           elif not B.isEmpty() and not C.isEmpty():           elif not B.isEmpty() and not C.isEmpty():
730              tol=(util.Lsup(B)+util.Lsup(C))*self.__TOL/2.              tol=(util.Lsup(B)+util.Lsup(C))*self.SMALL_TOLERANCE/2.
731              if self.getNumSolutions()>1:              if self.getNumSolutions()>1:
732                 for i in range(self.getNumEquations()):                 for i in range(self.getNumEquations()):
733                     for j in range(self.getDim()):                     for j in range(self.getDim()):
# Line 743  class LinearPDE(object): Line 743  class LinearPDE(object):
743           if self.getNumSolutions()>1:           if self.getNumSolutions()>1:
744             D=self.getCoefficientOfGeneralPDE("D")             D=self.getCoefficientOfGeneralPDE("D")
745             if not D.isEmpty():             if not D.isEmpty():
746               tol=util.Lsup(D)*self.__TOL               tol=util.Lsup(D)*self.SMALL_TOLERANCE
747               for i in range(self.getNumEquations()):               for i in range(self.getNumEquations()):
748                  for k in range(self.getNumSolutions()):                  for k in range(self.getNumSolutions()):
749                    if util.Lsup(D[i,k]-D[k,i])>tol:                    if util.Lsup(D[i,k]-D[k,i])>tol:
# Line 751  class LinearPDE(object): Line 751  class LinearPDE(object):
751                        out=False                        out=False
752             d=self.getCoefficientOfGeneralPDE("d")             d=self.getCoefficientOfGeneralPDE("d")
753             if not d.isEmpty():             if not d.isEmpty():
754               tol=util.Lsup(d)*self.__TOL               tol=util.Lsup(d)*self.SMALL_TOLERANCE
755               for i in range(self.getNumEquations()):               for i in range(self.getNumEquations()):
756                  for k in range(self.getNumSolutions()):                  for k in range(self.getNumSolutions()):
757                    if util.Lsup(d[i,k]-d[k,i])>tol:                    if util.Lsup(d[i,k]-d[k,i])>tol:
# Line 759  class LinearPDE(object): Line 759  class LinearPDE(object):
759                        out=False                        out=False
760             d_contact=self.getCoefficientOfGeneralPDE("d_contact")             d_contact=self.getCoefficientOfGeneralPDE("d_contact")
761             if not d_contact.isEmpty():             if not d_contact.isEmpty():
762               tol=util.Lsup(d_contact)*self.__TOL               tol=util.Lsup(d_contact)*self.SMALL_TOLERANCE
763               for i in range(self.getNumEquations()):               for i in range(self.getNumEquations()):
764                  for k in range(self.getNumSolutions()):                  for k in range(self.getNumSolutions()):
765                    if util.Lsup(d_contact[i,k]-d_contact[k,i])>tol:                    if util.Lsup(d_contact[i,k]-d_contact[k,i])>tol:
# Line 1836  class LameEquation(LinearPDE): Line 1836  class LameEquation(LinearPDE):
1836                            "q"            : PDECoefficient(PDECoefficient.SOLUTION,(PDECoefficient.BY_EQUATION,),PDECoefficient.BOTH)}                            "q"            : PDECoefficient(PDECoefficient.SOLUTION,(PDECoefficient.BY_EQUATION,),PDECoefficient.BOTH)}
1837        self.setSymmetryOn()        self.setSymmetryOn()
1838
1839     def setValue(self,**coefficients):     def setValues(self,**coefficients):
1840       """       """
1841       sets new values to coefficients       sets new values to coefficients
1842
# Line 1859  class LameEquation(LinearPDE): Line 1859  class LameEquation(LinearPDE):
1859                 depending of reduced order is used for the representation of the equation.                 depending of reduced order is used for the representation of the equation.
1860       @raise IllegalCoefficient: if an unknown coefficient keyword is used.       @raise IllegalCoefficient: if an unknown coefficient keyword is used.
1861       """       """
1862       super(LameEquation, self).setValue(**coefficients)       super(LameEquation, self).setValues(**coefficients)
1863
1864     def getCoefficientOfGeneralPDE(self,name):     def getCoefficientOfGeneralPDE(self,name):
1865       """       """
# Line 1973  class AdvectivePDE(LinearPDE): Line 1973  class AdvectivePDE(LinearPDE):
1973           self.__xi=xi           self.__xi=xi
1974        self.__Xi=escript.Data()        self.__Xi=escript.Data()
1975
1976     def setValue(**coefficients):     def setValue(self,**coefficients):
1977        """        """
1978        sets new values to coefficients        sets new values to coefficients
1979
# Line 2057  class AdvectivePDE(LinearPDE): Line 2057  class AdvectivePDE(LinearPDE):
2057       """       """
2058       return escript.Scalar(0.5,P.getFunctionSpace())       return escript.Scalar(0.5,P.getFunctionSpace())
2059
def __calculateXi(self,peclet_factor,flux,h):
flux=util.Lsup(flux)
if flux_max>0.:
return h*self.__xi(flux*peclet_factor)/(flux+flux_max*self.__TOL)
else:
return 0.

2060     def __getXi(self):     def __getXi(self):
2061        if self.__Xi.isEmpty():        if self.__Xi.isEmpty():
2062           B=self.getCoefficient("B")           B=self.getCoefficient("B")
# Line 2073  class AdvectivePDE(LinearPDE): Line 2066  class AdvectivePDE(LinearPDE):
2066           self.__Xi=escript.Scalar(0.,self.getFunctionSpaceForCoefficient("A"))           self.__Xi=escript.Scalar(0.,self.getFunctionSpaceForCoefficient("A"))
2067           if not C.isEmpty() or not B.isEmpty():           if not C.isEmpty() or not B.isEmpty():
2068              if not C.isEmpty() and not B.isEmpty():              if not C.isEmpty() and not B.isEmpty():
flux2=escript.Scalar(0,self.getFunctionSpaceForCoefficient("A"))
2069                  if self.getNumEquations()>1:                  if self.getNumEquations()>1:
2070                     if self.getNumSolutions()>1:                     if self.getNumSolutions()>1:
2071                          flux2=escript.Scalar(0,self.getFunctionSpaceForCoefficient("A"))
2072                        for i in range(self.getNumEquations()):                        for i in range(self.getNumEquations()):
2073                           for k in range(self.getNumSolutions()):                           for k in range(self.getNumSolutions()):
2074                              for l in range(self.getDim()): flux2+=(C[i,k,l]-B[i,l,k])**2                              for l in range(self.getDim()): flux2+=(C[i,k,l]-B[i,l,k])**2
2075                          length_of_flux=util.sqrt(flux2)
2076                        # flux=C-util.reorderComponents(B,[0,2,1])                        # flux=C-util.reorderComponents(B,[0,2,1])
2077                     else:                     else:
2078                          flux2=escript.Scalar(0,self.getFunctionSpaceForCoefficient("A"))
2079                        for i in range(self.getNumEquations()):                        for i in range(self.getNumEquations()):
2080                           for l in range(self.getDim()): flux2+=(C[i,l]-B[i,l])**2                           for l in range(self.getDim()): flux2+=(C[i,l]-B[i,l])**2
2081                          length_of_flux=util.sqrt(flux2)
2082                        # flux=C-B                        # flux=C-B
2083                  else:                  else:
2084                     if self.getNumSolutions()>1:                     if self.getNumSolutions()>1:
2085                          flux2=escript.Scalar(0,self.getFunctionSpaceForCoefficient("A"))
2086                        for k in range(self.getNumSolutions()):                        for k in range(self.getNumSolutions()):
2087                           for l in range(self.getDim()): flux2+=(C[k,l]-B[l,k])**2                           for l in range(self.getDim()): flux2+=(C[k,l]-B[l,k])**2
2088                        # flux=C-util.reorderComponents(B,[1,0])                        # flux=C-util.reorderComponents(B,[1,0])
2089                          length_of_flux=util.sqrt(flux2)
2090                     else:                     else:
2091                        for l in range(self.getDim()): flux2+=(C[l]-B[l])**2                        length_of_flux=util.length(C-B)
#flux=C-B
length_of_flux=util.sqrt(flux2)
2092              elif C.isEmpty():              elif C.isEmpty():
2093                length_of_flux=util.length(B)                length_of_flux=util.length(B)
#flux=B
2094              else:              else:
2095                length_of_flux=util.length(C)                length_of_flux=util.length(C)
#flux=C

#length_of_flux=util.length(flux)
2096              flux_max=util.Lsup(length_of_flux)              flux_max=util.Lsup(length_of_flux)
2097              if flux_max>0.:              if flux_max>0.:
2098                 # length_of_A=util.inner(flux,util.tensormutiply(A,flux))                if A.isEmpty():
2099                 length_of_A=util.length(A)                    inv_A=1./self.SMALL_TOLERANCE
2100                 A_max=util.Lsup(length_of_A)                    peclet_number=escript.Scalar(inv_A,length_of_flux.getFunctionSpace())
2101                 if A_max>0:                    xi=self.__xi(self,peclet_number)
2102                      inv_A=1./(length_of_A+A_max*self.__TOL)                else:
2103                 else:                    # length_of_A=util.inner(flux,util.tensormutiply(A,flux))
2104                      inv_A=1./self.__TOL                    length_of_A=util.length(A)
2105                 peclet_number=length_of_flux*h/2*inv_A                    A_max=util.Lsup(length_of_A)
2106                 xi=self.__xi(peclet_number)                    if A_max>0:
2107                 self.__Xi=h*xi/(length_of_flux+flux_max*self.__TOL)                         inv_A=1./(length_of_A+A_max*self.SMALL_TOLERANCE)
2108                 self.trace("preclet number = %e"%util.Lsup(peclet_number))                    else:
2109                           inv_A=1./self.SMALL_TOLERANCE
2110                      peclet_number=length_of_flux*h/2*inv_A
2111                      xi=self.__xi(self,peclet_number)
2112                  self.__Xi=h*xi/(length_of_flux+flux_max*self.SMALL_TOLERANCE)
2113                  self.trace("preclet number = %e"%util.Lsup(peclet_number))
2114                else:
2115                  self.__Xi=escript.Scalar(0.,length_of_flux.getFunctionSpace())
2116        return self.__Xi        return self.__Xi
2117
2118
# Line 2140  class AdvectivePDE(LinearPDE): Line 2139  class AdvectivePDE(LinearPDE):
2139              Aout=A              Aout=A
2140           else:           else:
2141              if A.isEmpty():              if A.isEmpty():
2142                 Aout=self.createNewCoefficient("A")                 Aout=self.createCoefficientOfGeneralPDE("A")
2143              else:              else:
2144                 Aout=A[:]                 Aout=A[:]
2145              Xi=self.__getXi()              Xi=self.__getXi()
# Line 2160  class AdvectivePDE(LinearPDE): Line 2159  class AdvectivePDE(LinearPDE):
2159                                 for p in range(self.getNumEquations()): Aout[i,j,k,l]+=Xi*C[p,i,j]*C[p,k,l]                                 for p in range(self.getNumEquations()): Aout[i,j,k,l]+=Xi*C[p,i,j]*C[p,k,l]
2160                                 # Aout=Aout+Xi*util.generalTensorProduct(util.reorder(C,[1,2,0]),C,offset=1)                                 # Aout=Aout+Xi*util.generalTensorProduct(util.reorder(C,[1,2,0]),C,offset=1)
2161              else:              else:
2162                  for j in range(self.getDim()):                 if not C.isEmpty() and not B.isEmpty():
2163                     for l in range(self.getDim()):                     delta=(C-B)
2164                        if not C.isEmpty() and not B.isEmpty():                     Aout+=util.outer(Xi*delta,delta)
2165                            Aout[j,l]+=Xi*(C[j]-B[j])*(C[l]-B[l])                 elif not B.isEmpty():
2166                        elif C.isEmpty():                     Aout+=util.outer(Xi*B,B)
2167                            Aout[j,l]+=Xi*B[j]*B[l]                 elif not C.isEmpty():
2168                        else:                     Aout+=util.outer(Xi*C,C)
Aout[j,l]+=Xi*C[j]*C[l]
# if not C.isEmpty() and not B.isEmpty():
#    tmp=C-B
#    Aout=Aout+Xi*util.outer(tmp,tmp)
# elif C.isEmpty():
#    Aout=Aout+Xi*util.outer(B,B)
# else:
# Aout=Aout+Xi*util.outer(C,C)
2169           return Aout           return Aout
2170       elif name == "B" :       elif name == "B" :
2171             # return self.getCoefficient("B")
2172           B=self.getCoefficient("B")           B=self.getCoefficient("B")
2173           C=self.getCoefficient("C")           C=self.getCoefficient("C")
2174           D=self.getCoefficient("D")           D=self.getCoefficient("D")
# Line 2185  class AdvectivePDE(LinearPDE): Line 2177  class AdvectivePDE(LinearPDE):
2177           else:           else:
2178              Xi=self.__getXi()              Xi=self.__getXi()
2179              if B.isEmpty():              if B.isEmpty():
2180                  Bout=self.createNewCoefficient("B")                  Bout=self.createCoefficientOfGeneralPDE("B")
2181              else:              else:
2182                  Bout=B[:]                  Bout=B[:]
2183              if self.getNumEquations()>1:              if self.getNumEquations()>1:
# Line 2197  class AdvectivePDE(LinearPDE): Line 2189  class AdvectivePDE(LinearPDE):
2189                             Bout[i,j,k]+=tmp*C[p,i,j]                             Bout[i,j,k]+=tmp*C[p,i,j]
2190                             # Bout=Bout+Xi*util.generalTensorProduct(util.reorder(C,[1,2,0]),D,offset=1)                             # Bout=Bout+Xi*util.generalTensorProduct(util.reorder(C,[1,2,0]),D,offset=1)
2191              else:              else:
2192                 tmp=Xi*D                 Bout+=(Xi*D)*C
for j in range(self.getDim()): Bout[j]+=tmp*C[j]
# Bout=Bout+Xi*D*C
2193           return Bout           return Bout
2194       elif name == "C" :       elif name == "C" :
2195             # return self.getCoefficient("C")
2196           B=self.getCoefficient("B")           B=self.getCoefficient("B")
2197           C=self.getCoefficient("C")           C=self.getCoefficient("C")
2198           D=self.getCoefficient("D")           D=self.getCoefficient("D")
# Line 2210  class AdvectivePDE(LinearPDE): Line 2201  class AdvectivePDE(LinearPDE):
2201           else:           else:
2202              Xi=self.__getXi()              Xi=self.__getXi()
2203              if C.isEmpty():              if C.isEmpty():
2204                  Cout=self.createNewCoefficient("C")                  Cout=self.createCoefficientOfGeneralPDE("C")
2205              else:              else:
2206                  Cout=C[:]                  Cout=C[:]
2207              if self.getNumEquations()>1:              if self.getNumEquations()>1:
# Line 2222  class AdvectivePDE(LinearPDE): Line 2213  class AdvectivePDE(LinearPDE):
2213                                   Cout[i,k,l]+=tmp*B[p,l,i]                                   Cout[i,k,l]+=tmp*B[p,l,i]
2214                                   # Cout=Cout+Xi*B[p,l,i]*D[p,k]                                   # Cout=Cout+Xi*B[p,l,i]*D[p,k]
2215              else:              else:
2216                 tmp=Xi*D                 Cout+=(Xi*D)*B
for j in range(self.getDim()): Cout[j]+=tmp*B[j]
# Cout=Cout+tmp*D*B
2217           return Cout           return Cout
2218       elif name == "D" :       elif name == "D" :
2219           return self.getCoefficient("D")           return self.getCoefficient("D")
2220       elif name == "X" :       elif name == "X" :
2221             # return self.getCoefficient("X")
2222           X=self.getCoefficient("X")           X=self.getCoefficient("X")
2223           Y=self.getCoefficient("Y")           Y=self.getCoefficient("Y")
2224           B=self.getCoefficient("B")           B=self.getCoefficient("B")
# Line 2237  class AdvectivePDE(LinearPDE): Line 2227  class AdvectivePDE(LinearPDE):
2227              Xout=X              Xout=X
2228           else:           else:
2229              if X.isEmpty():              if X.isEmpty():
2230                  Xout=self.createNewCoefficient("X")                  Xout=self.createCoefficientOfGeneralPDE("X")
2231              else:              else:
2232                  Xout=X[:]                  Xout=X[:]
2233              Xi=self.__getXi()              Xi=self.__getXi()
# Line 2256  class AdvectivePDE(LinearPDE): Line 2246  class AdvectivePDE(LinearPDE):
2246                               Xout[i,j]+=tmp*C[p,i,j]                               Xout[i,j]+=tmp*C[p,i,j]
2247                               # Xout=X_out+Xi*util.inner(Y,C,offset=1)                               # Xout=X_out+Xi*util.inner(Y,C,offset=1)
2248              else:              else:
2249                   tmp=Xi*Y                if not C.isEmpty() and not B.isEmpty():
2250                   for j in range(self.getDim()):                  Xout+=(Xi*Y)*(C-B)
2251                      if not C.isEmpty() and not B.isEmpty():                elif C.isEmpty():
2252                         Xout[j]+=tmp*(C[j]-B[j])                  Xout-=(Xi*Y)*B
2253                         # Xout=Xout+Xi*Y*(C-B)                else:
2254                      elif C.isEmpty():                  Xout+=(Xi*Y)*C
Xout[j]-=tmp*B[j]
# Xout=Xout-Xi*Y*B
else:
Xout[j]+=tmp*C[j]
# Xout=Xout+Xi*Y*C
2255           return Xout           return Xout
2256       elif name == "Y" :       elif name == "Y" :
2257           return self.getCoefficient("Y")           return self.getCoefficient("Y")
# Line 2285  class AdvectivePDE(LinearPDE): Line 2270  class AdvectivePDE(LinearPDE):
2270       else:       else:
2271          raise IllegalCoefficient,"illegal coefficient %s requested for general PDE."%name          raise IllegalCoefficient,"illegal coefficient %s requested for general PDE."%name
2272
class AdvectionDiffusion(LinearPDE):
"""
Class to define PDE equation of the unisotropic advection-diffusion problem, which is genear L{LinearPDE} of the form

M{S{omega}*u + inner(v,grad(u))- grad(matrixmult(k_bar,grad(u))[j])[j] = f}

with natural boundary conditons

M{n[j]*matrixmult(k,grad(u))[j] = g- S{alpha}u }

and constraints:

M{u=r} where M{q>0}

and

M{k_bar[i,j]=k[i,j]+upwind[i]*upwind[j]}

"""

def __init__(self,domain,debug=False):
"""
initializes a new Poisson equation

@param domain: domain of the PDE
@type domain: L{Domain<escript.Domain>}
@param debug: if True debug informations are printed.

"""
super(AdvectionDiffusion, self).__init__(domain,1,1,debug)
self.COEFFICIENTS={"omega": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_EQUATION,),PDECoefficient.OPERATOR),
"k": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_DIM,PDECoefficient.BY_DIM),PDECoefficient.OPERATOR),
"f": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_EQUATION,),PDECoefficient.RIGHTHANDSIDE),
"v": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_DIM,),PDECoefficient.OPERATOR),
"upwind": PDECoefficient(PDECoefficient.INTERIOR,(PDECoefficient.BY_DIM,),PDECoefficient.OPERATOR),
"alpha": PDECoefficient(PDECoefficient.BOUNDARY,(PDECoefficient.BY_EQUATION,),PDECoefficient.OPERATOR),
"g": PDECoefficient(PDECoefficient.BOUNDARY,(PDECoefficient.BY_EQUATION,),PDECoefficient.RIGHTHANDSIDE),
"r": PDECoefficient(PDECoefficient.SOLUTION,(PDECoefficient.BY_EQUATION,),PDECoefficient.BOTH),
"q": PDECoefficient(PDECoefficient.SOLUTION,(PDECoefficient.BY_EQUATION,),PDECoefficient.BOTH)}

def setValue(self,**coefficients):
"""
sets new values to coefficients

@param coefficients: new values assigned to coefficients
@keyword omega: value for coefficient M{S{omega}}
@type omega: any type that can be casted to L{Scalar<escript.Scalar>} object on L{Function<escript.Function>}.
@keyword k: value for coefficient M{k}
@type k: any type that can be casted to L{Tensor<escript.Tensor>} object on L{Function<escript.Function>}.
@keyword v: value for coefficient M{v}
@type v: any type that can be casted to L{Vector<escript.Vector>} object on L{Function<escript.Function>}.
@keyword upwind: value for upwind term M{upwind}
@type upwind: any type that can be casted to L{Vector<escript.Vector>} object on L{Function<escript.Function>}.
@keyword f: value for right hand side M{f}
@type f: any type that can be casted to L{Scalar<escript.Scalar>} object on L{Function<escript.Function>}.
@keyword alpha: value for right hand side M{S{alpha}}
@type alpha: any type that can be casted to L{Scalar<escript.Scalar>} object on L{FunctionOnBoundary<escript.FunctionOnBoundary>}.
@keyword g: value for right hand side M{g}
@type g: any type that can be casted to L{Scalar<escript.Scalar>} object on L{FunctionOnBoundary<escript.FunctionOnBoundary>}.
@keyword r: prescribed values M{r} for the solution in constraints.
@type r: any type that can be casted to L{Scalar<escript.Scalar>} object on L{Solution<escript.Solution>} or L{ReducedSolution<escript.ReducedSolution>}
depending of reduced order is used for the representation of the equation.
@keyword q: mask for location of constraints
@type q: any type that can be casted to L{Scalar<escript.Scalar>} object on L{Solution<escript.Solution>} or L{ReducedSolution<escript.ReducedSolution>}
depending of reduced order is used for the representation of the equation.
@raise IllegalCoefficient: if an unknown coefficient keyword is used.
"""
super(AdvectionDiffusion, self).setValue(**coefficients)

def getCoefficientOfGeneralPDE(self,name):
"""
return the value of the coefficient name of the general PDE

@param name: name of the coefficient requested.
@type name: C{string}
@return: the value of the coefficient  name
@rtype: L{Data<escript.Data>}
@raise IllegalCoefficient: if name is not one of coefficients
"A", M{B}, M{C}, M{D}, M{X}, M{Y}, M{d}, M{y}, M{d_contact}, M{y_contact}, M{r} or M{q}.
@note: This method is called by the assembling routine to map the Possion equation onto the general PDE.
"""
if name == "A" :
return self.getCoefficient("k")+util.outer(self.getCoefficient("upwind"),self.getCoefficient("upwind"))
elif name == "B" :
return escript.Data()
elif name == "C" :
return self.getCoefficient("v")
elif name == "D" :
return self.getCoefficient("omega")
elif name == "X" :
return escript.Data()
elif name == "Y" :
return self.getCoefficient("f")
elif name == "d" :
return self.getCoefficient("alpha")
elif name == "y" :
return self.getCoefficient("g")
elif name == "d_contact" :
return escript.Data()
elif name == "y_contact" :
return escript.Data()
elif name == "r" :
return self.getCoefficient("r")
elif name == "q" :
return self.getCoefficient("q")
else:
raise IllegalCoefficient,"illegal coefficient %s requested for general PDE."%name

2273  # \$Log\$  # \$Log\$
2274  # Revision 1.14  2005/09/22 01:54:57  jgs  # Revision 1.14  2005/09/22 01:54:57  jgs
2275  # Merge of development branch dev-02 back to main trunk on 2005-09-22  # Merge of development branch dev-02 back to main trunk on 2005-09-22

Legend:
 Removed from v.595 changed lines Added in v.596

 ViewVC Help Powered by ViewVC 1.1.26