Ignore:
Timestamp:
Jun 6, 2010, 10:48:41 PM (14 years ago)
Author:
steve
Message:

Setting up test function for Quantity

File:
1 edited

Legend:

Unmodified
Added
Removed
  • anuga_work/development/anuga_1d/quantity.py

    r6453 r7793  
    1 """Class Quantity - Implements values at each 1d element
     1"""
     2Class Quantity - Implements values at each 1d element
    23
    34To create:
     
    8586        """
    8687        return self.centroid_values.shape[0]
    87    
     88
     89    def __neg__(self):
     90        """Negate all values in this quantity giving meaning to the
     91        expression -Q where Q is an instance of class Quantity
     92        """
     93
     94        Q = Quantity(self.domain)
     95        Q.set_values_from_numeric(-self.vertex_values)
     96        return Q
     97
     98
     99
     100    def __add__(self, other):
     101        """Add to self anything that could populate a quantity
     102
     103        E.g other can be a constant, an array, a function, another quantity
     104        (except for a filename or points, attributes (for now))
     105        - see set_values_from_numeric for details
     106        """
     107
     108        Q = Quantity(self.domain)
     109        Q.set_values_from_numeric(other)
     110
     111        result = Quantity(self.domain)
     112        result.set_values_from_numeric(self.vertex_values + Q.vertex_values)
     113        return result
     114
     115    def __radd__(self, other):
     116        """Handle cases like 7+Q, where Q is an instance of class Quantity
     117        """
     118
     119        return self + other
     120
     121    def __sub__(self, other):
     122        return self + -other            # Invoke self.__neg__()
     123
     124    def __mul__(self, other):
     125        """Multiply self with anything that could populate a quantity
     126
     127        E.g other can be a constant, an array, a function, another quantity
     128        (except for a filename or points, attributes (for now))
     129        - see set_values_from_numeric for details
     130        """
     131
     132        if isinstance(other, Quantity):
     133            Q = other
     134        else:
     135            Q = Quantity(self.domain)
     136            Q.set_values_from_numeric(other)
     137
     138        result = Quantity(self.domain)
     139
     140        # The product of vertex_values, edge_values and centroid_values
     141        # are calculated and assigned directly without using
     142        # set_values_from_numeric (which calls interpolate). Otherwise
     143        # centroid values wouldn't be products from q1 and q2
     144        result.vertex_values = self.vertex_values * Q.vertex_values
     145        result.centroid_values = self.centroid_values * Q.centroid_values
     146
     147        return result
     148
     149    def __rmul__(self, other):
     150        """Handle cases like 3*Q, where Q is an instance of class Quantity
     151        """
     152
     153        return self * other
     154
     155    def __div__(self, other):
     156        """Divide self with anything that could populate a quantity
     157
     158        E.g other can be a constant, an array, a function, another quantity
     159        (except for a filename or points, attributes (for now))
     160        - see set_values_from_numeric for details
     161
     162        Zero division is dealt with by adding an epsilon to the divisore
     163        FIXME (Ole): Replace this with native INF once we migrate to NumPy
     164        """
     165
     166        if isinstance(other, Quantity):
     167            Q = other
     168        else:
     169            Q = Quantity(self.domain)
     170            Q.set_values_from_numeric(other)
     171
     172        result = Quantity(self.domain)
     173
     174        # The quotient of vertex_values, edge_values and centroid_values
     175        # are calculated and assigned directly without using
     176        # set_values_from_numeric (which calls interpolate). Otherwise
     177        # centroid values wouldn't be quotient of q1 and q2
     178        result.vertex_values = self.vertex_values/(Q.vertex_values + epsilon)
     179        result.centroid_values = self.centroid_values/(Q.centroid_values + epsilon)
     180
     181        return result
     182
     183    def __rdiv__(self, other):
     184        """Handle cases like 3/Q, where Q is an instance of class Quantity
     185        """
     186
     187        return self / other
     188
     189    def __pow__(self, other):
     190        """Raise quantity to (numerical) power
     191
     192        As with __mul__ vertex values are processed entry by entry
     193        while centroid and edge values are re-interpolated.
     194
     195        Example using __pow__:
     196          Q = (Q1**2 + Q2**2)**0.5
     197        """
     198
     199        if isinstance(other, Quantity):
     200            Q = other
     201        else:
     202            Q = Quantity(self.domain)
     203            Q.set_values_from_numeric(other)
     204
     205        result = Quantity(self.domain)
     206
     207        # The power of vertex_values, edge_values and centroid_values
     208        # are calculated and assigned directly without using
     209        # set_values_from_numeric (which calls interpolate). Otherwise
     210        # centroid values wouldn't be correct
     211        result.vertex_values = self.vertex_values ** other
     212        result.centroid_values = self.centroid_values ** other
     213
     214        return result
     215
     216    def set_values_from_numeric(self, numeric):
     217        import Numeric
     218        x = Numeric.array([1.0,2.0])
     219        y = [1.0,2.0]
     220
     221        if type(numeric) == type(y):
     222            self.set_values_from_array(numeric)
     223        elif type(numeric) == type(x):
     224            self.set_values_from_array(numeric)
     225        elif callable(numeric):
     226            self.set_values_from_function(numeric)
     227        elif isinstance(numeric, Quantity):
     228            self.set_values_from_quantity(numeric)
     229        else:   # see if it's coercible to a float (float, int or long, etc)
     230            try:
     231                numeric = float(numeric)
     232            except ValueError:
     233                msg = ("Illegal type for variable 'numeric': %s" % type(numeric))
     234                raise Exception, msg
     235            self.set_values_from_constant(numeric)
     236
     237    def set_values_from_constant(self,numeric):
     238
     239        self.vertex_values[:]   = numeric
     240        self.centroid_values[:] = numeric
     241
     242
     243    def set_values_from_array(self,numeric):
     244
     245        self.vertex_values[:]   = numeric
     246        self.interpolate()
     247
     248
     249    def set_values_from_quantity(self,quantity):
     250
     251        self.vertex_values[:]   = quantity.vertex_values
     252        self.centroid_values[:] = quantity.centroid_values
     253
     254    def set_values_from_function(self,function):
     255
     256        self.vertex_values[:]   = map(function, self.domain.vertices)
     257        self.centroid_values[:] = map(function, self.domain.centroids)
     258
     259
    88260    def interpolate(self):
    89261        """
     
    218390            assert values.shape[1] == 2, msg
    219391
    220             self.vertex_values = values
     392            self.vertex_values[:] = values
    221393
    222394
     
    428600        """
    429601
    430         #print 'compute_gradient'
    431602
    432603        from Numeric import array, zeros, Float
     
    9081079        self.centroid_values[:] = (a*self.centroid_values + b*self.centroid_backup_values).astype('f')
    9091080       
    910 class Conserved_quantity(Quantity):
    911     """Class conserved quantity adds to Quantity:
    912 
    913     storage and method for updating, and
    914     methods for extrapolation from centropid to vertices inluding
    915     gradients and limiters
    916     """
    917 
    918     def __init__(self, domain, vertex_values=None):
    919         Quantity.__init__(self, domain, vertex_values)
    920 
    921         print "Use Quantity instead of Conserved_quantity"
    922 
    923 
    924 ##
    925 ##def newLinePlot(title='Simple Plot'):
    926 ##    import Gnuplot
    927 ##    g = Gnuplot.Gnuplot()
    928 ##    g.title(title)
    929 ##    g('set data style linespoints')
    930 ##    g.xlabel('x')
    931 ##    g.ylabel('y')
    932 ##    return g
    933 ##
    934 ##def linePlot(g,x,y):
    935 ##    import Gnuplot
    936 ##    g.plot(Gnuplot.PlotItems.Data(x.flat,y.flat))
     1081
    9371082
    9381083def newLinePlot(title='Simple Plot'):
Note: See TracChangeset for help on using the changeset viewer.