Changeset 1753


Ignore:
Timestamp:
Aug 24, 2005, 1:49:47 PM (19 years ago)
Author:
ole
Message:

Embedded caching functionality within quantity.set_values and modified validation example lwru2.py to illustrate the advantages that can be gained from supervised caching.

Location:
inundation
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • inundation/pyvolution/data_manager.py

    r1740 r1753  
    963963
    964964    import os
    965     from Scientific.IO.NetCDF import NetCDFFile
     965    #from Scientific.IO.NetCDF import NetCDFFile
    966966    from Numeric import Float, arrayrange, concatenate
    967967
     
    10101010
    10111011    if verbose: print 'Store to NetCDF file %s' %ptsname
     1012    write_ptsfile(ptsname, points, attribute, attribute_name)
     1013
     1014
     1015def write_ptsfile(ptsname, points, attribute, attribute_name = None):
     1016    """Write points and associated attribute to pts (NetCDF) format
     1017    """
     1018
     1019    from Numeric import Float
     1020   
     1021    if attribute_name is None:
     1022        attribute_name = 'attribute'       
     1023   
     1024
     1025    from Scientific.IO.NetCDF import NetCDFFile
     1026   
    10121027    # NetCDF file definition
    10131028    outfile = NetCDFFile(ptsname, 'w')
     1029
    10141030
    10151031    #Create new file
     
    10401056    nc_attribute[:] = attribute
    10411057
    1042     infile.close()
    10431058    outfile.close()
    10441059   
     1060
    10451061def dem2pts(basename_in, basename_out=None, verbose=False,
    10461062            easting_min=None, easting_max=None,
     
    10631079    elevation: N Float array
    10641080    """
     1081
     1082    #FIXME: Can this be written feasibly using write_pts?
    10651083
    10661084    import os
  • inundation/pyvolution/domain.py

    r1752 r1753  
    1616    def __init__(self, coordinates, vertices, boundary = None,
    1717                 conserved_quantities = None, other_quantities = None,
    18                  tagged_elements = None, geo_reference = None, use_inscribed_circle=False):
     18                 tagged_elements = None, geo_reference = None,
     19                 use_inscribed_circle=False):
    1920
    2021        Mesh.__init__(self, coordinates, vertices, boundary,
     
    141142
    142143
    143     def set_quantity(self, name,
    144                      X,
    145                      location = 'vertices',
    146                      indices = None):
     144    def set_quantity(self, name, *args, **kwargs):
     145                     #X,
     146                     #location = 'vertices',
     147                     #indices = None):
    147148        """Set values for named quantity
    148149
     
    196197        #Set value
    197198        #FIXME: use **kwargs
    198         self.quantities[name].set_values(X,
    199                                          location = location,
    200                                          indices = indices)
    201 
     199        #self.quantities[name].set_values(X,
     200        #                                 location = location,
     201        #                                 indices = indices)
     202        self.quantities[name].set_values(*args, **kwargs)
    202203
    203204
  • inundation/pyvolution/quantity.py

    r1752 r1753  
    9191                   location = 'vertices',                   
    9292                   indices = None,
    93                    verbose = None):
     93                   verbose = None,
     94                   use_cache = False):
    9495       
    9596        """Set values for quantity based on different sources.
     
    155156                  will be left undefined.
    156157
     158        verbose: True means that output to stdout is generated
     159
     160        use_cache: True means that caching of intermediate results is
     161                   attempted for least squares fit.
     162                   
     163                   
     164       
    157165
    158166        Exactly one of the arguments
     
    211219            assert values is not None, msg
    212220            self.set_values_from_points(points, values, alpha,
    213                                         location, indices, verbose)
     221                                        location, indices, verbose,
     222                                        use_cache)
    214223        elif filename is not None:
    215224            self.set_values_from_file(filename, attribute_name, alpha,
    216                                       location, indices, verbose)
     225                                      location, indices, verbose,
     226                                      use_cache)
    217227        else:
    218228            raise 'This can\'t happen :-)'
     
    437447
    438448    def set_values_from_points(self, points, values, alpha,
    439                                location, indices, verbose):
    440         """
    441         """
    442 
    443        
    444         #FIXME: Needs unit test         
     449                               location, indices, verbose, use_cache):
     450        """Set quantity values from arbitray data points using least squares
     451        """
     452
     453        from Numeric import Float
    445454        from util import ensure_numeric
    446455        from least_squares import fit_to_mesh
     
    457466        triangles = self.domain.triangles
    458467
    459         #FIXME Pass and use caching here
    460         vertex_attributes = fit_to_mesh(coordinates,
    461                                         triangles,
    462                                         points,
    463                                         values,
    464                                         alpha = alpha,
    465                                         verbose = verbose)
     468        if use_cache is True:
     469            try:
     470                from caching import cache
     471            except:
     472                msg = 'Caching was requested, but caching module'+\
     473                      'could not be imported'
     474                raise msg
     475           
     476            args = (coordinates, triangles, points, values)
     477            kwargs = {'alpha': alpha, 'verbose': verbose}
     478            vertex_attributes = cache(fit_to_mesh,
     479                                      args, kwargs,
     480                                      verbose = verbose)
     481        else:   
     482            vertex_attributes = fit_to_mesh(coordinates,
     483                                            triangles,
     484                                            points,
     485                                            values,
     486                                            alpha = alpha,
     487                                            verbose = verbose)
     488           
    466489       
    467490        self.set_values_from_array(vertex_attributes,
     
    473496   
    474497    def set_values_from_file(self, filename, attribute_name, alpha,
    475                              location, indices, verbose):
     498                             location, indices, verbose, use_cache):
    476499        """Set quantity based on arbitrary points in .pts file
    477500        using least_squares attribute_name selects name of attribute
     
    481504
    482505
    483         #FIXME: Needs unit test
    484506        from types import StringType
    485507        msg = 'Filename must be a text string'
     
    513535        #Call least squares method   
    514536        self.set_values_from_points(points, z, alpha,
    515                                     location, indices, verbose)
     537                                    location, indices, verbose, use_cache)
    516538
    517539
     
    523545        location: Where values are to be stored.
    524546                  Permissible options are: vertices, edges, centroid
    525                   Default is "vertices"
     547                  and unique vertices. Default is 'vertices'
    526548
    527549        In case of location == 'centroids' the dimension values must
  • inundation/pyvolution/test_advection.py

    r1556 r1753  
    7777        domain.check_integrity()
    7878
    79         domain.set_quantity('stage', [1.0], 'centroids')
     79        domain.set_quantity('stage', [1.0], location='centroids')
    8080
    8181        domain.distribute_to_vertices_and_edges()
     
    136136        #Populate boundary array with dirichlet conditions.
    137137        domain.neighbours = array([[1,-1,-2], [0,-3,-4]])
    138         domain.set_quantity('stage', [1.0, 0.0], 'centroids')
     138        domain.set_quantity('stage', [1.0, 0.0], location='centroids')
    139139        domain.distribute_to_vertices_and_edges()
    140140
  • inundation/pyvolution/test_data_manager.py

    r1740 r1753  
    492492        #Cleanup
    493493        os.remove(sww.filename)
     494
     495
     496    def test_write_pts(self):
     497        #Get (enough) datapoints
     498
     499        from Numeric import array
     500        points = array([[ 0.66666667, 0.66666667],
     501                        [ 1.33333333, 1.33333333],
     502                        [ 2.66666667, 0.66666667],
     503                        [ 0.66666667, 2.66666667],
     504                        [ 0.0, 1.0],
     505                        [ 0.0, 3.0],
     506                        [ 1.0, 0.0],
     507                        [ 1.0, 1.0],
     508                        [ 1.0, 2.0],
     509                        [ 1.0, 3.0],
     510                        [ 2.0, 1.0],
     511                        [ 3.0, 0.0],
     512                        [ 3.0, 1.0]])
     513
     514        z = points[:,0] + 2*points[:,1]
     515
     516        ptsfile = 'testptsfile.pts'
     517        write_ptsfile(ptsfile, points, z,
     518                      attribute_name = 'linear_combination')
     519
     520        #Check contents
     521        #Get NetCDF
     522        from Scientific.IO.NetCDF import NetCDFFile       
     523        fid = NetCDFFile(ptsfile, 'r')
     524
     525        # Get the variables
     526        #print fid.variables.keys()
     527        points1 = fid.variables['points']
     528        z1 = fid.variables['linear_combination']
     529
     530        #Check values
     531
     532        #print points[:]
     533        #print ref_points
     534        assert allclose(points, points1)
     535
     536        #print attributes[:]
     537        #print ref_elevation
     538        assert allclose(z, z1)
     539
     540        #Cleanup
     541        fid.close()
     542
     543        import os
     544        os.remove(ptsfile)
     545       
    494546
    495547
  • inundation/pyvolution/test_domain.py

    r1751 r1753  
    290290
    291291
    292         domain.set_quantity('stage', [1,2,3,4], 'centroids')
    293         domain.set_quantity('xmomentum', [1,2,3,4], 'centroids')
    294         domain.set_quantity('ymomentum', [1,2,3,4], 'centroids')
     292        domain.set_quantity('stage', [1,2,3,4], location='centroids')
     293        domain.set_quantity('xmomentum', [1,2,3,4], location='centroids')
     294        domain.set_quantity('ymomentum', [1,2,3,4], location='centroids')
    295295
    296296
  • inundation/pyvolution/test_quantity.py

    r1752 r1753  
    276276
    277277
     278       
    278279
    279280    def test_set_vertex_values_using_least_squares(self):
    280         from least_squares import Interpolation, fit_to_mesh
     281
    281282       
    282283        quantity = Quantity(self.mesh4)
     
    297298                       [ 3.0, 1.0]]
    298299
    299 
    300         interp = Interpolation(quantity.domain.coordinates, quantity.domain.triangles,
    301                                data_points, alpha=0.0)
    302 
    303300        z = linear_function(data_points)
    304         answer = linear_function(quantity.domain.coordinates)
    305 
    306         f = interp.fit(z)
    307 
     301       
     302        #Obsoleted bit
     303        #interp = Interpolation(quantity.domain.coordinates,
     304        #                       quantity.domain.triangles,
     305        #                       data_points, alpha=0.0)
     306        #
     307        #answer = linear_function(quantity.domain.coordinates)
     308        #
     309        #f = interp.fit(z)
     310        #
    308311        #print "f",f
    309312        #print "answer",answer
    310         assert allclose(f, answer)
    311 
    312 
    313         quantity.set_values(f)
    314 
    315 
     313        #assert allclose(f, answer)
     314
     315
     316        #Use built-in least squares fit
     317        quantity.set_values(points = data_points, values = z, alpha = 0)
    316318        answer = linear_function(quantity.domain.get_vertex_coordinates(obj = True))
    317319        #print quantity.vertex_values, answer
    318320        assert allclose(quantity.vertex_values.flat, answer)
    319321
    320         #Now try using the general interface
    321 
     322
     323        #Now try by setting the same values directly
     324        from least_squares import fit_to_mesh       
    322325        vertex_attributes = fit_to_mesh(quantity.domain.coordinates,
    323326                                        quantity.domain.triangles,
     
    329332        #print vertex_attributes
    330333        quantity.set_values(vertex_attributes)
     334        assert allclose(quantity.vertex_values.flat, answer)
     335
     336
     337    def test_set_values_from_file(self):
     338        quantity = Quantity(self.mesh4)
     339
     340        #Get (enough) datapoints
     341        data_points = [[ 0.66666667, 0.66666667],
     342                       [ 1.33333333, 1.33333333],
     343                       [ 2.66666667, 0.66666667],
     344                       [ 0.66666667, 2.66666667],
     345                       [ 0.0, 1.0],
     346                       [ 0.0, 3.0],
     347                       [ 1.0, 0.0],
     348                       [ 1.0, 1.0],
     349                       [ 1.0, 2.0],
     350                       [ 1.0, 3.0],
     351                       [ 2.0, 1.0],
     352                       [ 3.0, 0.0],
     353                       [ 3.0, 1.0]]
     354
     355        z = linear_function(data_points)
     356       
     357
     358        #Create pts file
     359        from data_manager import write_ptsfile
     360        ptsfile = 'testptsfile.pts'
     361        att = 'spam_and_eggs'
     362        write_ptsfile(ptsfile, data_points, z, attribute_name = att)
     363
     364        #Check that values can be set from file
     365        quantity.set_values(filename = ptsfile,
     366                            attribute_name = att, alpha = 0)
     367        answer = linear_function(quantity.domain.get_vertex_coordinates(obj = True))
     368        #print quantity.vertex_values, answer
     369        assert allclose(quantity.vertex_values.flat, answer)
     370
     371
     372        #Check that values can be set from file using default attribute
     373        quantity.set_values(filename = ptsfile, alpha = 0)
    331374        assert allclose(quantity.vertex_values.flat, answer)       
    332375
     376        #Cleanup
     377        import os
     378        os.remove(ptsfile)
     379       
    333380
    334381
     
    832879        indices = [1]
    833880        quantity.set_values(value,
    834                                   location = 'centroids',
    835                                   indices = indices)
     881                            location = 'centroids',
     882                            indices = indices)
    836883        #print "quantity.centroid_values",quantity.centroid_values
    837884        assert allclose(quantity.centroid_values, [1,7,3,4,5,6])
  • inundation/pyvolution/test_shallow_water.py

    r1671 r1753  
    12381238        val3 = 2.
    12391239
    1240         domain.set_quantity('stage', [val0, val1, val2, val3], 'centroids')
     1240        domain.set_quantity('stage', [val0, val1, val2, val3],
     1241                            location='centroids')
    12411242        L = domain.quantities['stage'].vertex_values
    12421243
     
    12741275            return x**2
    12751276
    1276         domain.set_quantity('stage', stage, 'centroids')
     1277        domain.set_quantity('stage', stage, location='centroids')
    12771278
    12781279        a, b = domain.quantities['stage'].compute_gradients()
     
    13111312            return x**4+y**2
    13121313
    1313         domain.set_quantity('stage', stage, 'centroids')
     1314        domain.set_quantity('stage', stage, location='centroids')
    13141315        #print domain.quantities['stage'].centroid_values
    13151316
     
    13551356
    13561357        domain.set_quantity('elevation', slope)
    1357         domain.set_quantity('stage', stage, 'centroids')
     1358        domain.set_quantity('stage', stage, location='centroids')
    13581359
    13591360        #print domain.quantities['elevation'].centroid_values
     
    14431444        domain.set_quantity('elevation', slope)
    14441445        domain.set_quantity('stage',
    1445                             [0.01298164, 0.00365611, 0.01440365, -0.0381856437096],
    1446                             'centroids')
     1446                            [0.01298164, 0.00365611,
     1447                             0.01440365, -0.0381856437096],
     1448                            location='centroids')
    14471449        domain.set_quantity('xmomentum',
    1448                             [0.00670439, 0.01263789, 0.00647805, 0.0178180740668],
    1449                             'centroids')
     1450                            [0.00670439, 0.01263789,
     1451                             0.00647805, 0.0178180740668],
     1452                            location='centroids')
    14501453        domain.set_quantity('ymomentum',
    1451                             [-7.23510980e-004, -6.30413883e-005, 6.30413883e-005, 0.000200907255866],
    1452                             'centroids')
     1454                            [-7.23510980e-004, -6.30413883e-005,
     1455                             6.30413883e-005, 0.000200907255866],
     1456                            location='centroids')
    14531457
    14541458        E = domain.quantities['elevation'].vertex_values
     
    14661470        #print Y[1,:]
    14671471
    1468         assert allclose(L[1,:], [-0.00825735775384, -0.00801881482869, 0.0272445025825])
    1469         assert allclose(X[1,:], [0.0143507718962, 0.0142502147066, 0.00931268339717])
    1470         assert allclose(Y[1,:], [-0.000117062180693, 7.94434448109e-005, -0.000151505429018])
     1472        assert allclose(L[1,:], [-0.00825735775384,
     1473                                 -0.00801881482869,
     1474                                 0.0272445025825])
     1475        assert allclose(X[1,:], [0.0143507718962,
     1476                                 0.0142502147066,
     1477                                 0.00931268339717])
     1478        assert allclose(Y[1,:], [-0.000117062180693,
     1479                                 7.94434448109e-005,
     1480                                 -0.000151505429018])
    14711481
    14721482
     
    22112221
    22122222
    2213                 domain.set_quantity('stage', L, 'centroids')
    2214                 domain.set_quantity('xmomentum', X, 'centroids')
    2215                 domain.set_quantity('ymomentum', Y, 'centroids')
     2223                domain.set_quantity('stage', L, location='centroids')
     2224                domain.set_quantity('xmomentum', X, location='centroids')
     2225                domain.set_quantity('ymomentum', Y, location='centroids')
    22162226
    22172227                domain.check_integrity()
  • inundation/validation/LWRU2/lwru2.py

    r1747 r1753  
    1111
    1212
    13 read_mesh = True  #Use large unstructured mesh generated from create_mesh.py
    14 #read_mesh = False  #Use small structured mesh
     13#read_mesh = True  #Use large unstructured mesh generated from create_mesh.py
     14read_mesh = False  #Use small structured mesh
    1515
    1616import sys
     
    128128domain.filename, _ = os.path.splitext(base)
    129129
    130 #LS code to be included in set_quantity
    131 print 'Reading points'
    132 from pyvolution import util, least_squares
    133 #points, attributes = util.read_xya(filenames.bathymetry_filename[:-4] + '.pts')
    134 points, attributes = cache(util.read_xya,
    135                            filenames.bathymetry_filename[:-4] + '.pts')
     130print 'Initial values'
    136131
    137 elevation = attributes['elevation']
    138 
    139 #Fit attributes to mesh
    140 #vertex_attributes = least_squares.fit_to_mesh(domain.coordinates,
    141 #                                              domain.triangles,
    142 #                                              points,
    143 #                                              attributes['elevation'],
    144 #                                              alpha = 0.0001,
    145 #                                              verbose=True)
    146 
    147 vertex_attributes = cache(least_squares.fit_to_mesh,
    148                           (domain.coordinates, domain.triangles,
    149                            points, elevation) ,
    150                           {'alpha': 0.0001, 'verbose': True})
    151 
    152 print 'Initial values'
    153 domain.set_quantity('elevation', vertex_attributes)
    154 #domain.set_quantity('elevation', points=points, attributes=attributes['elevation'], alpha=0.0001)
     132domain.set_quantity('elevation',
     133                    filename=filenames.bathymetry_filename[:-4] + '.pts',
     134                    alpha = 0.0001,
     135                    verbose = True,
     136                    use_cache = True)
     137                   
    155138domain.set_quantity('friction', 0.0)
    156139domain.set_quantity('stage', 0.0)
Note: See TracChangeset for help on using the changeset viewer.