/[escript]/branches/symbolic_from_3470/escript/py_src/heat.py
ViewVC logotype

Contents of /branches/symbolic_from_3470/escript/py_src/heat.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2479 - (show annotations)
Thu Jun 18 06:50:37 2009 UTC (10 years ago) by gross
Original Path: trunk/escript/py_src/heat.py
File MIME type: text/x-python
File size: 5709 byte(s)
paso returns now some diagnostics. SCSL has been removed.

1
2 ########################################################
3 #
4 # Copyright (c) 2003-2008 by University of Queensland
5 # Earth Systems Science Computational Center (ESSCC)
6 # http://www.uq.edu.au/esscc
7 #
8 # Primary Business: Queensland, Australia
9 # Licensed under the Open Software License version 3.0
10 # http://www.opensource.org/licenses/osl-3.0.php
11 #
12 ########################################################
13
14 __copyright__="""Copyright (c) 2003-2008 by University of Queensland
15 Earth Systems Science Computational Center (ESSCC)
16 http://www.uq.edu.au/esscc
17 Primary Business: Queensland, Australia"""
18 __license__="""Licensed under the Open Software License version 3.0
19 http://www.opensource.org/licenses/osl-3.0.php"""
20 __url__="https://launchpad.net/escript-finley"
21
22 """
23 Some models for heat advection-diffusion
24
25 @var __author__: name of author
26 @var __copyright__: copyrights
27 @var __license__: licence agreement
28 @var __url__: url entry point on documentation
29 @var __version__: version
30 @var __date__: date of the version
31 """
32
33 __author__="Lutz Gross, l.gross@uq.edu.au"
34
35 # from escript import *
36 import util
37 from linearPDEs import TransportPDE
38
39 class TemperatureCartesian(TransportPDE):
40 """
41 Represents and solves the temperature advection-diffusion problem
42
43 M{rhocp(T_{,t} + v_i T_{,i} - ( k T_{,i})_i = Q}
44
45 M{k T_{,i}*n_i=surface_flux} and M{T_{,t} = 0} where C{given_T_mask}>0.
46
47 If surface_flux is not given 0 is assumed.
48
49 Typical usage::
50
51 sp = TemperatureCartesian(domain)
52 sp.setTolerance(1.e-4)
53 t = 0
54 T = ...
55 sp.setValues(rhocp=..., v=..., k=..., given_T_mask=...)
56 sp.setInitialTemperature(T)
57 while t < t_end:
58 sp.setValue(Q=...)
59 T = sp.getTemperature(dt)
60 t += dt
61 """
62 def __init__(self,domain,useBackwardEuler=False,**kwargs):
63 """
64 Initializes the temperature advection-diffusion problem.
65
66 @param domain: domain of the problem
67 @param useBackwardEuler: if set the backward Euler scheme is used. Otherwise the Crank-Nicholson scheme is applied. Not that backward Euler scheme will return a safe time step size which is practically infinity as the scheme is unconditional unstable. So other measures need to be applied to control the time step size. The Crank-Nicholson scheme provides a higher accuracy but requires to limit the time step size to be stable.
68 @type useBackwardEuler: C{bool}
69 """
70 TransportPDE.__init__(self,domain,numEquations=1,useBackwardEuler=useBackwardEuler,**kwargs)
71 self.setReducedOrderOn()
72 self.__rhocp=None
73 self.__v=None
74
75 def setInitialTemperature(self,T):
76 """
77 Same as L{setInitialSolution}.
78 """
79 self.setInitialSolution(T)
80
81 def setValue(self,rhocp=None,v=None,k=None,Q=None,surface_flux=None,given_T_mask=None):
82 if rhocp!=None:
83 self.__rhocp=rhocp
84 if v!=None:
85 self.__v=v
86 if rhocp!=None:
87 super(TemperatureCartesian,self).setValue(M=self.__rhocp)
88 if (rhocp!=None or v!=None) and self.__rhocp!=None and self.__v!=None:
89 super(TemperatureCartesian,self).setValue(C=-self.__rhocp*self.__v)
90 if k!=None:
91 super(TemperatureCartesian,self).setValue(A=-k*util.kronecker(self.getDomain()))
92 if Q!=None:
93 super(TemperatureCartesian,self).setValue(Y=Q)
94 if surface_flux!=None:
95 super(TemperatureCartesian,self).setValue(y=surface_flux)
96 if given_T_mask!=None:
97 super(TemperatureCartesian,self).setValue(q=given_T_mask)
98
99 def getTemperature(self,dt,**kwargs):
100 """
101 Same as L{getSolution}.
102 """
103 return self.getSolution(dt,**kwargs)
104
105
106 class Tracer(TransportPDE):
107 """
108 Represents and solves the tracer problem
109
110 M{C_{,t} + v_i C_{,i} - ( k T_{,i})_i) = 0}
111
112 M{C_{,t} = 0} where C{given_C_mask}>0.
113 M{C_{,i}*n_i=0}
114
115 Typical usage::
116
117 sp = Tracer(domain)
118 sp.setTolerance(1.e-4)
119 t = 0
120 T = ...
121 sp.setValues(given_C_mask=...)
122 sp.setInitialTracer(C)
123 while t < t_end:
124 sp.setValue(v=...)
125 dt.getSaveTimeStepSize()
126 C = sp.getTracer(dt)
127 t += dt
128 """
129 def __init__(self,domain,useBackwardEuler=False,**kwargs):
130 """
131 Initializes the Tracer advection problem
132
133 @param domain: domain of the problem
134 @param useBackwardEuler: if set the backward Euler scheme is used. Otherwise the Crank-Nicholson scheme is applied. Not that backward Euler scheme will return a safe time step size which is practically infinity as the scheme is unconditional unstable. So other measures need to be applied to control the time step size. The Crank-Nicholson scheme provides a higher accuracy but requires to limit the time step size to be stable.
135 @type useBackwardEuler: C{bool}
136 """
137 TransportPDE.__init__(self,domain,numEquations=1,useBackwardEuler=useBackwardEuler,**kwargs)
138 self.setReducedOrderOn()
139 super(Tracer,self).setValue(M=1.)
140
141 def setInitialTracer(self,C):
142 """
143 Same as L{setInitialSolution}.
144 """
145 self.setInitialSolution(C)
146
147 def setValue(self,v=None,given_C_mask=None, k=None):
148 if v!=None:
149 super(Tracer,self).setValue(C=-v)
150 if k!=None:
151 super(Tracer,self).setValue(A=-k*util.kronecker(self.getDomain()))
152 if given_C_mask!=None:
153 super(Tracer,self).setValue(q=given_C_mask)
154
155 def getTracer(self,dt,**kwargs):
156 """
157 Same as L{getSolution}.
158 """
159 return self.getSolution(dt,**kwargs)
160

  ViewVC Help
Powered by ViewVC 1.1.26