/[escript]/trunk/escript/py_src/unitsSI.py
ViewVC logotype

Annotation of /trunk/escript/py_src/unitsSI.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2962 - (hide annotations)
Wed Mar 3 01:03:56 2010 UTC (9 years, 1 month ago) by gross
File MIME type: text/x-python
File size: 11359 byte(s)
bar as unit added
1 gross 2398
2     ########################################################
3     #
4 jfenwick 2881 # Copyright (c) 2003-2010 by University of Queensland
5 gross 2398 # 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 jfenwick 2881 __copyright__="""Copyright (c) 2003-2010 by University of Queensland
15 gross 2398 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     __author__="Lutz Gross, l.gross@uq.edu.au"
22    
23 jfenwick 2625 ## :file unitsSI.py
24 gross 2398
25     """
26 gross 2403 some tools supporting physical units and conversion
27 gross 2398
28 jfenwick 2625 :var __author__: name of author
29     :var __copyright__: copyrights
30     :var __license__: licence agreement
31     :var __url__: url entry point on documentation
32     :var __version__: version
33     :var __date__: date of the version
34 gross 2398
35 jfenwick 2625 :var Yotta : prefix yotta, symbol: Y
36     :var Zetta : prefix zetta, symbol: Z
37     :var Exa : prefix exa, symbol: E
38     :var Peta : prefix peta, symbol: P
39     :var Tera : prefix tera, symbol: T
40     :var Giga : prefix giga, symbol: G
41     :var Mega : prefix mega, symbol: M
42     :var Kilo : prefix kilo, symbol: k
43     :var Hecto : prefix hecto, symbol: h
44     :var Deca : prefix deca, symbol: da
45     :var Deci : prefix deci, symbol: d
46     :var Centi : prefix centi, symbol: c
47     :var Milli : prefix milli, symbol: m
48     :var Micro : prefix micro, symbol: mu
49     :var Nano : prefix nano, symbol: n
50     :var Pico : prefix pico, symbol: p
51     :var Femto : prefix femto, symbol: f
52     :var Atto : prefix atto, symbol: a
53     :var Zepto : prefix zepto, symbol: z
54     :var Yocto : prefix yocto, symbol: y
55 gross 2398
56 jfenwick 2625 :var km : unit of kilo meter
57     :var m : unit of meter
58     :var cm : unit of centi meter
59     :var mm : unit of milli meter
60     :var sec: unit of second
61     :var minute : unit of minute
62     :var h : unit of hour
63 gross 2905 :var hour : unit of hour
64 jfenwick 2625 :var day : unit of day
65     :var yr : unit of year
66     :var Myr : unit of mega year
67     :var Gyr : unit of giga year
68     :var gram : unit of gram
69     :var kg : unit of kilo gram
70     :var lb : unit of pound
71     :var ton : metric ton
72     :var A : unit of Ampere
73     :var Hz: unit of Hertz (frequenacy)
74     :var N: unit of Newton (force)
75     :var Pa: unit of Pascal (pressure, stress)
76 gross 2962 :var bar: unit of bar (pressure)
77 jfenwick 2625 :var atm: unit of atmosphere (pressure)
78     :var J: unit of Joule (energy, work)
79     :var W: unit of Watt (power)
80     :var C: unit of Coulomb (electric charge)
81     :var V: unit of Volt (electric potential)
82     :var F: unit of Farad (capacitance)
83     :var Ohm: unit of Ohm (electric resistance)
84     :var K : unit of Kelvin (temperature)
85     :var Mol : unit of Mole (temperature)
86     :var Celsius: unit of Celsius (temperature)
87     :var Fahrenheit : unit of Fahrenheit (temperature)
88     :var Poise : unit of Poise (dynamic viscosity)
89     :var R_Earth_equator: Earth's equatorial radius
90     :var R_Earth_poles: Earth's polar radius
91     :var R_Earth: Earth's radius
92     :var v_light: speed of light
93     :var pi: value of pi accurate to 10 decimal places
94 gross 2398 """
95 gross 2647 from math import pi
96 gross 2399 class Unit(object):
97     """
98 gross 2403 a general class to define a physical unit and convert from this unit to an appropriate SI unit.
99    
100 jfenwick 2625 `Unit` object have a dual purpose: Firstly physical units can be combined through *,/ and ** to form new physical units or to add prefixes such as
101 gross 2403 Milli to m to form mm=Milli*m. Moreover, a given floating point number x (or any other arithmetic object) can be converted from the physical unit to
102     the SI system, eg. 10*mm to create the value for 10mm which is the float number 0.01 in the SI system. In addition, a value in the SI unit can be
103     converted back to the given unit, eg. to express 0.01m in physical units of mm use 0.01/mm which will return 10.
104 gross 2399 """
105     def __init__(self, name, longname,a ,b ):
106     """
107 gross 2403 initializes the physical unit
108 gross 2399
109 jfenwick 2625 :param name: short name of the physical unit or prefix
110     :type name: ``str``
111     :param longname: long name of the physical unit or prefix
112     :type longname: ``str``
113     :param a: absolute value in transformation
114     :type a: ``float``
115     :param b: slop in translation
116     :type b: ``float``
117 gross 2399 """
118     self.setName(name)
119     self.setLongName(longname)
120     self.__a=a
121     self.__b=b
122    
123     def __str__(self):
124     return self.getName()
125    
126     def getName(self):
127     """
128 gross 2403 Returns the name of the physical unit
129 gross 2399
130 jfenwick 2625 :return: name of the physical unit
131     :rtype: ``str``
132 gross 2399 """
133     return self.__name
134    
135     def setName(self, name):
136     """
137 gross 2403 Sets the name of the physical unit
138 gross 2399
139 jfenwick 2625 :param name: new name of the physical unit
140     :type name: ``str``
141 gross 2399 """
142     self.__name=name
143    
144     def getLongName(self):
145     """
146 gross 2403 Returns the long name of the physical unit
147 gross 2399
148 jfenwick 2625 :return: name of the physical unit
149     :rtype: ``str``
150 gross 2399 """
151     return self.__longname
152    
153     def setLongName(self, name):
154     """
155 gross 2403 Sets the long name of the physical unit
156 gross 2399
157 jfenwick 2625 :param name: new long name of the physical unit
158     :type name: ``str``
159 gross 2399 """
160     self.__longname=name
161    
162     def __call__(self,x):
163     """
164 gross 2403 Converts a value x in the physical unit self to SI
165 gross 2399
166 jfenwick 2625 :param x: value to convert
167     :type x: an arithmetic object
168 gross 2399 """
169     return self.__b*x+self.__a
170    
171     def __mul__(self,other):
172     """
173 jfenwick 2625 Performs self*other operation for two `Unit` objects
174 gross 2399
175 jfenwick 2625 :param other: an other physical unit
176     :type other: `Unit`
177     :rtype: `Unit` or ``NotImplemented``
178 gross 2399 """
179     if isinstance(other, Unit):
180     a=self(other(0.))
181     b=(self(other(1.))-a)
182 gross 2403 if isinstance(other, _PowUnit) or isinstance(self,_DivUnit) or isinstance(self, _PowUnit):
183     return _ProdUnit(self.getName()+" "+other.getName(),self.getLongName()+"*"+other.getLongName(),a ,b)
184 gross 2399 else:
185 gross 2403 return _ProdUnit(self.getName()+other.getName(),self.getLongName()+"*"+other.getLongName(),a ,b)
186 gross 2399 else:
187     return NotImplemented
188    
189     def __rmul__(self,other):
190     """
191     Performs other*self operation
192    
193 jfenwick 2625 :param other: an other `Unit` or an arithmetic object. if other is a arithmetic object such as ``float`` other is assumed to be given in the physical unit ``self`` and is converted into the corresponding SI unit.
194     :type other: `Unit` or
195     :rtype: `Unit` of or an arithmetic object
196 gross 2399 """
197     if isinstance(other, Unit):
198     a=other(self(0.))
199     b=(other(self(1.))-a)
200 gross 2403 if isinstance(other, _PowUnit) or isinstance(self, _PowUnit) or isinstance(other, _DivUnit):
201     return _ProdUnit(other.getName()+" "+self.getName(),other.getLongName()+"*"+self.getLongName(),a ,b)
202 gross 2399 else:
203 gross 2403 return _ProdUnit(other.getName()+self.getName(),other.getLongName()+"*"+self.getLongName(),a ,b)
204 gross 2399 else:
205     return self(other)
206    
207     def __div__(self,other):
208     """
209 jfenwick 2625 Performs self*other operation for two `Unit` objects
210 gross 2399
211 jfenwick 2625 :param other: an other physical unit
212     :type other: `Unit`
213     :rtype: `Unit` or ``NotImplemented``
214 gross 2399 """
215     if isinstance(other, Unit):
216     if abs(self(0.))+abs(other(0.))>0:
217 gross 2403 raise ValueError,"Division of physical units requires 0 absolute values"
218     if isinstance(other, (_ProdUnit, _DivUnit)):
219 gross 2399 # X/(c*d) or X/(c/d) requires brackets:
220 gross 2403 return _DivUnit(self.getName()+"/("+other.getName()+")",self.getLongName()+"/("+other.getLongName()+")",0 , self(1.)/other(1.))
221 gross 2399 else:
222 gross 2403 return _DivUnit(self.getName()+"/"+other.getName(),self.getLongName()+"/"+other.getLongName(),0 , self(1.)/other(1.))
223 gross 2399 else:
224     return NotImplemented
225     def __rdiv__(self,other):
226     """
227     Performs other/self operation
228    
229 jfenwick 2625 :param other: an other `Unit` or an arithmetic object
230     :type other: `Unit` or an arithmetic object
231     :rtype: `Unit` or an arithmetic object
232 gross 2399 """
233     if isinstance(other, Unit):
234     if abs(self(0.))+abs(other(0.))>0:
235 gross 2403 raise ValueError,"Division of physical units requires 0 absolute values"
236     if isinstance(self, (_ProdUnit, _DivUnit)):
237 gross 2399 # X/(a*b) or X/(a/b) requires brackets:
238 gross 2403 return _DivUnit(other.getName()+"/("+self.getName()+")",other.getLongName()+"/("+self.getLongName()+")",0 , other(1.)/self(1.))
239 gross 2399 else:
240 gross 2403 return _DivUnit(other.getName()+"/"+self.getName(),other.getLongName()+"/"+self.getLongName(),0 , other(1.)/self(1.))
241 gross 2399 else:
242     return (other-self(0.))/(self(1.)-self(0.))
243     def __pow__(self,other):
244     """
245     Performs self**other operation
246    
247 jfenwick 2625 :param other: an exponent
248     :type other: ``int`` or ``float``
249     :rtype: `Unit`
250 gross 2399 """
251     if isinstance(other, float) or isinstance(other, int):
252     if abs(self(0.))>0:
253 gross 2403 raise ValueError,"Power of physical unit requires 0 absolute values"
254     if isinstance(self, (_ProdUnit, _DivUnit, _PowUnit)):
255     return _PowUnit("("+self.getName()+")^%s"%other, "("+self.getLongName()+")^%s"%other, 0., self(1.)**other)
256 gross 2399 else:
257 gross 2403 return _PowUnit(self.getName()+"^%s"%other, self.getLongName()+"^%s"%other, 0., self(1.)**other)
258 gross 2399 else:
259     return NotImplemented
260    
261 gross 2403 class _ProdUnit(Unit):
262 gross 2399 pass
263 gross 2403 class _DivUnit(Unit):
264 gross 2399 pass
265 gross 2403 class _PowUnit(Unit):
266 gross 2399 pass
267 gross 2403
268 gross 2398 #
269     # prefixes:
270     #
271 gross 2403 Yotta=Unit("Y","Yotta",0.,1.e24)
272     Zetta=Unit("Z","Zetta",0.,1.e21)
273     Exa=Unit("E","Exa",0.,1.e18)
274     Peta=Unit("P","Peta",0.,1.e15)
275     Tera=Unit("T","Tera",0.,1.e12)
276     Giga=Unit("G","Giga",0.,1.e9)
277     Mega=Unit("M","Mega",0.,1.e6)
278     Kilo=Unit("k","Kilo",0.,1.e3)
279     Hecto=Unit("h","Hecto",0.,1.e2)
280     Deca=Unit("da","Deca",0.,1.e1)
281     one=Unit("1","1",0.,1.)
282     Deci=Unit("d","Deci",0.,1.e-1)
283     Centi=Unit("c","Centi",0.,1.e-2)
284     Milli=Unit("m","Milli",0.,1.e-3)
285     Micro=Unit("mu","Micro",0.,1.e-6)
286     Nano=Unit("n","Nano",0.,1.e-9)
287     Pico=Unit("p","Pico",0.,1.e-12)
288     Femto=Unit("f","Femto",0.,1.e-15)
289     Atto=Unit("a","Atto",0.,1.e-18)
290     Zepto=Unit("z","Zepto",0.,1.e-21)
291     Yocto=Unit("y","Yocto",0.,1.e-24)
292 gross 2398 #
293     # length
294     #
295 gross 2403 m=Unit("m","meter",0.,1.)
296 gross 2398 km=Kilo*m
297     cm=Centi*m
298     mm=Milli*m
299     #
300     # time
301     #
302 gross 2403 sec=Unit("sec","second",0.,1.)
303     minute=Unit("min","minute",0.,60.)
304 gross 2905 hour=Unit("h","hour",0.,60.*60.)
305     h=hour
306 gross 2403 day=Unit("d","day",0.,60.*60.*24.)
307     yr=Unit("yr","year",0.,60.*60.*24.*365.2425)
308 gross 2905 year=yr
309 gross 2398 Myr=Mega*yr
310     Gyr=Giga*yr
311     #
312     # mass
313     #
314 gross 2403 kg=Unit("kg","kg",0.,1.)
315 gross 2398 gram=Milli*kg
316 gross 2403 lb=Unit("lb","pound",0.,0.45359237)
317 gross 2398 ton=Kilo*kg
318     #
319     # electric current
320     #
321 gross 2403 A=Unit("A","Ampere",0.,1.)
322 gross 2398 #
323 gross 2403 # Temperature
324     #
325     K=Unit("K","Kelvin",0.,1.)
326     Celsius=Unit("C","Celsius",273.15,1.)
327     Fahrenheit=Unit("F","Fahrenheit",459.67*5./9.,5./9.)
328     #
329 gross 2398 # others
330     #
331 gross 2499 Mol=Unit("mole","Mole",0.,1.)
332 gross 2403 Hz=one/sec
333     N = Unit("N","Newton",0.,1.)
334     Pa = Unit("Pa","Pascal",0.,1.)
335 gross 2962 bar=100*Kilo*Pa
336 gross 2403 atm= Unit("atm","atmosphere",0.,101325.024)
337     J = Unit("J","Joule",0.,1.)
338     W= Unit("W","Watt",0.,1.)
339     C=Unit("C","Coulomb",0.,1.)
340     V = Unit("V","Volt",0.,1.)
341     F = Unit("F","Farad",0.,1.)
342     Ohm=Unit("Ohm","Ohm",0.,1.)
343 gross 2647 RAD=Unit("RAD","rad",0.,1.)
344     DEG=Unit("Ohm","Ohm",0.,pi/180.)
345 gross 2398 #
346 gross 2499 # Derived
347     #
348     Poise= gram/cm/sec
349     #
350 gross 2398 # some constants
351     #
352     R_Earth_equator=6378.1370*km
353     R_Earth_poles=6356.7523*km
354     R_Earth=(R_Earth_equator+R_Earth_poles)/2
355     v_light=299792458.*m/sec

  ViewVC Help
Powered by ViewVC 1.1.26