Ignore:
Timestamp:
Aug 23, 2004, 2:45:42 PM (21 years ago)
Author:
ole
Message:

Finished and tested gradient and limiters
Added forcing terms (not tested yet)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • inundation/ga/storm_surge/pyvolution/test_quantity.py

    r198 r205  
    148148        quantity = Quantity(self.mesh4)
    149149
    150         #Set up for a gradient of (1,0)
    151         quantity.set_values([2.0/3, 4.0/3, 8.0/3, 2.0/3],
     150        #Set up for a gradient of (3,0) at mid triangle
     151        quantity.set_values([2.0, 4.0, 8.0, 2.0],
    152152                            location = 'centroids')
    153153       
    154154        #Gradients
    155         quantity.compute_gradients()
    156 
    157         #FIXME:
    158 
    159         #HERTIL
    160        
    161         #Gradient of fitted pwl surface   
    162         #a, b = compute_gradient(v2.id)
    163 
    164         #assert a == 1.0
    165         #assert b == 0.0
    166 
    167 
    168         #And now for the second order stuff       
    169         # - the full second order extrapolation
    170         #domain.order = 2
    171         #domain.limiter = dummy_limiter
    172         #distribute_to_vertices_and_edges(domain)       
    173    
    174         #assert v2.conserved_quantities_vertex0 == 0.0
    175         #assert v2.conserved_quantities_vertex1 == 2.0       
    176         #assert v2.conserved_quantities_vertex2 == 2.0       
     155        a, b = quantity.compute_gradients()
     156
     157
     158        #gradient bewteen t0 and t1 is undefined as det==0
     159        assert a[0] == 0.0
     160        assert b[0] == 0.0
     161        #The others are OK
     162        for i in range(1,4):
     163            assert a[i] == 3.0
     164            assert b[i] == 0.0
     165
     166
     167        quantity.second_order_extrapolator()
     168       
     169        assert allclose(quantity.vertex_values, [[2., 2.,  2.],
     170                                                 [0., 6.,  6.],
     171                                                 [6., 6., 12.],
     172                                                 [0., 0.,  6.]])
    177173
    178174
     
    355351
    356352
    357     def test_first_order_limiter(self):
     353    def test_first_order_extrapolator(self):
    358354        quantity = Quantity(self.mesh4)
    359355
     
    363359
    364360        #Extrapolate
    365         quantity.first_order_limiter()
     361        quantity.first_order_extrapolator()
    366362
    367363        #Check vertices but not edge values
     
    370366
    371367
    372     def test_second_order_limiter(self):
    373         quantity = Quantity(self.mesh4)
    374 
    375         #Create a deliberate overshoot (e.g. from gradient computation)
    376         quantity.set_values([[0,3,3], [6,2,2], [3,8,5], [3,5,8]])
    377 
    378         #Limit and extrapolate
    379         quantity.second_order_limiter()
     368    def test_second_order_extrapolator(self):
     369        quantity = Quantity(self.mesh4)
     370
     371        #Set up for a gradient of (3,0) at mid triangle
     372        quantity.set_values([2.0, 4.0, 8.0, 2.0],
     373                            location = 'centroids')
     374       
     375
     376
     377        quantity.second_order_extrapolator()
     378        quantity.limiter()
    380379
    381380
    382381        #Assert that central triangle is limited by neighbours
    383         assert quantity.vertex_values[1,0] <= quantity.vertex_values[2,2]
    384         assert quantity.vertex_values[1,0] <= quantity.vertex_values[3,1]
    385        
    386         assert quantity.vertex_values[1,1] <= quantity.vertex_values[3,0]
     382        assert quantity.vertex_values[1,0] >= quantity.vertex_values[0,0]
     383        assert quantity.vertex_values[1,0] >= quantity.vertex_values[3,1]
     384       
     385        assert quantity.vertex_values[1,1] <= quantity.vertex_values[2,1]
    387386        assert quantity.vertex_values[1,1] >= quantity.vertex_values[0,2]
    388387       
    389388        assert quantity.vertex_values[1,2] <= quantity.vertex_values[2,0]
    390         assert quantity.vertex_values[1,2] >= quantity.vertex_values[0,1]
     389        assert quantity.vertex_values[1,2] >= quantity.vertex_values[3,1]
    391390
    392391       
     
    398397       
    399398       
    400         #Check vertices but not edge values
    401         #assert allclose(quantity.vertex_values,
    402         #                [[1,1,1], [2,2,2], [3,3,3], [4, 4, 4]])
     399
     400       
     401
     402    def test_limiter(self):       
     403        quantity = Quantity(self.mesh4)
     404
     405        #Create a deliberate overshoot (e.g. from gradient computation)
     406        quantity.set_values([[3,0,3], [2,2,6], [5,3,8], [8,3,5]])
     407
     408
     409        #Limit
     410        quantity.limiter()
     411
     412        #Assert that central triangle is limited by neighbours
     413        assert quantity.vertex_values[1,0] >= quantity.vertex_values[0,0]
     414        assert quantity.vertex_values[1,0] <= quantity.vertex_values[3,1]
     415       
     416        assert quantity.vertex_values[1,1] <= quantity.vertex_values[2,1]
     417        assert quantity.vertex_values[1,1] >= quantity.vertex_values[0,2]
     418       
     419        assert quantity.vertex_values[1,2] <= quantity.vertex_values[2,0]
     420        assert quantity.vertex_values[1,2] <= quantity.vertex_values[3,1]
     421
     422
     423       
     424        #Assert that quantities are conserved
     425        from Numeric import sum
     426        for k in range(quantity.centroid_values.shape[0]):
     427            assert allclose (quantity.centroid_values[k],
     428                             sum(quantity.vertex_values[k,:])/3)
     429       
    403430
    404431
     
    412439
    413440        #Extrapolate
    414         quantity.distribute_to_vertices_and_edges(order=1)
     441        quantity.first_order_extrapolator()
     442
     443        #Interpolate
     444        quantity.interpolate_from_vertices_to_edges()       
    415445
    416446        assert allclose(quantity.vertex_values,
Note: See TracChangeset for help on using the changeset viewer.