Ignore:
Timestamp:
Jul 23, 2008, 4:38:10 PM (15 years ago)
Author:
steve
Message:

Working version of comp_flux_ext

File:
1 edited

Legend:

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

    r5538 r5563  
    4141        assert allclose( domain.quantities['stage'].explicit_update, stage_ud )
    4242        assert allclose( domain.quantities['xmomentum'].explicit_update, xmom_ud )
     43
     44
     45    def test_local_flux_function(self):
     46        normal = 1.0
     47        ql = array([1.0, 2.0],Float)
     48        qr = array([1.0, 2.0],Float)
     49        zl = 0.0
     50        zr = 0.0
     51
     52        edgeflux, maxspeed = flux_function(normal, ql,qr,zl,zr)
     53
     54        assert allclose(array([2.0, 8.9],Float), edgeflux)
     55        assert allclose(5.1304951685, maxspeed)
     56
     57        normal = -1.0
     58        ql = array([1.0, 2.0],Float)
     59        qr = array([1.0, 2.0],Float)
     60        zl = 0.0
     61        zr = 0.0
     62
     63        edgeflux, maxspeed = flux_function(normal, ql,qr,zl,zr)
     64
     65        assert allclose(array([-2.0, -8.9],Float), edgeflux)
     66        assert allclose(5.1304951685, maxspeed)
     67
     68    def test_domain_flux_function(self):
     69        normal = 1.0
     70        ql = array([1.0, 2.0],Float)
     71        qr = array([1.0, 2.0],Float)
     72        zl = 0.0
     73        zr = 0.0
     74
     75        edgeflux, maxspeed = flux_function(normal, ql,qr,zl,zr)
     76
     77        #print edgeflux
     78
     79        from shallow_water_domain import flux_function as domain_flux_function
     80
     81        domainedgeflux, domainmaxspeed = domain_flux_function(normal, ql,qr,zl,zr)
     82
     83        #print domainedgeflux
     84
     85        assert allclose(domainedgeflux, edgeflux)
     86        assert allclose(domainmaxspeed, maxspeed)
     87
    4388
    4489
     
    128173                #m = domain.neighbour_edges[k,i]
    129174                m = domain.neighbour_vertices[k,i]
     175                #print i, ' ' , m
    130176                #qr = [stage[n, m], xmom[n, m], ymom[n, m]]
    131177                qr[0] = stage[n, m]
     
    169215
    170216
     217def flux_function(normal, ql, qr, zl, zr):
     218    """Compute fluxes between volumes for the shallow water wave equation
     219    cast in terms of w = h+z using the 'central scheme' as described in
     220
     221    Kurganov, Noelle, Petrova. 'Semidiscrete Central-Upwind Schemes For
     222    Hyperbolic Conservation Laws and Hamilton-Jacobi Equations'.
     223    Siam J. Sci. Comput. Vol. 23, No. 3, pp. 707-740.
     224
     225    The implemented formula is given in equation (3.15) on page 714
     226
     227    Conserved quantities w, uh, are stored as elements 0 and 1
     228    in the numerical vectors ql an qr.
     229
     230    Bed elevations zl and zr.
     231    """
     232
     233    from config import g, epsilon
     234    from math import sqrt
     235    from Numeric import array
     236
     237    #print 'ql',ql
     238
     239    #Align momentums with x-axis
     240    #q_left  = rotate(ql, normal, direction = 1)
     241    #q_right = rotate(qr, normal, direction = 1)
     242    q_left = ql
     243    q_left[1] = q_left[1]*normal
     244    q_right = qr
     245    q_right[1] = q_right[1]*normal
     246
     247    #z = (zl+zr)/2 #Take average of field values
     248    z = 0.5*(zl+zr) #Take average of field values
     249
     250    w_left  = q_left[0]   #w=h+z
     251    h_left  = w_left-z
     252    uh_left = q_left[1]
     253
     254    if h_left < epsilon:
     255        u_left = 0.0  #Could have been negative
     256        h_left = 0.0
     257    else:
     258        u_left  = uh_left/h_left
     259
     260
     261    w_right  = q_right[0]  #w=h+z
     262    h_right  = w_right-z
     263    uh_right = q_right[1]
     264
     265
     266    if h_right < epsilon:
     267        u_right = 0.0  #Could have been negative
     268        h_right = 0.0
     269    else:
     270        u_right  = uh_right/h_right
     271
     272    #vh_left  = q_left[2]
     273    #vh_right = q_right[2]
     274
     275    #print h_right
     276    #print u_right
     277    #print h_left
     278    #print u_right
     279
     280    soundspeed_left  = sqrt(g*h_left)
     281    soundspeed_right = sqrt(g*h_right)
     282
     283    #Maximal wave speed
     284    s_max = max(u_left+soundspeed_left, u_right+soundspeed_right, 0)
     285   
     286    #Minimal wave speed
     287    s_min = min(u_left-soundspeed_left, u_right-soundspeed_right, 0)
     288   
     289    #Flux computation
     290
     291    #flux_left  = array([u_left*h_left,
     292    #                    u_left*uh_left + 0.5*g*h_left**2])
     293    #flux_right = array([u_right*h_right,
     294    #                    u_right*uh_right + 0.5*g*h_right**2])
     295    flux_left  = array([u_left*h_left,
     296                        u_left*uh_left + 0.5*g*h_left*h_left])
     297    flux_right = array([u_right*h_right,
     298                        u_right*uh_right + 0.5*g*h_right*h_right])
     299
     300    denom = s_max-s_min
     301    if denom == 0.0:
     302        edgeflux = array([0.0, 0.0])
     303        max_speed = 0.0
     304    else:
     305        edgeflux = (s_max*flux_left - s_min*flux_right)/denom
     306        edgeflux += s_max*s_min*(q_right-q_left)/denom
     307       
     308        edgeflux[1] = edgeflux[1]*normal
     309
     310        max_speed = max(abs(s_max), abs(s_min))
     311
     312    return edgeflux, max_speed
     313
    171314
    172315#-------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.