Changeset 2716 for development/pyvolution-1d/shallow_water_1d.py
- Timestamp:
- Apr 13, 2006, 4:34:22 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
development/pyvolution-1d/shallow_water_1d.py
r2705 r2716 49 49 class Domain(Generic_Domain): 50 50 51 def __init__(self, coordinates, boundary = None, tagged_elements = None): 51 def __init__(self, coordinates, boundary = None, tagged_elements = None, 52 geo_reference = None): 52 53 53 54 conserved_quantities = ['stage', 'xmomentum'] … … 55 56 Generic_Domain.__init__(self, coordinates, boundary, 56 57 conserved_quantities, other_quantities, 57 tagged_elements )58 tagged_elements, geo_reference) 58 59 59 60 from config import minimum_allowed_height, g … … 281 282 # Flux computation 282 283 #def flux_function(normal, ql, qr, zl, zr): 283 def flux_function( ql, qr, zl, zr):284 def flux_function(normal, ql, qr, zl, zr): 284 285 """Compute fluxes between volumes for the shallow water wave equation 285 286 cast in terms of w = h+z using the 'central scheme' as described in … … 305 306 #q_right = rotate(qr, normal, direction = 1) 306 307 q_left = ql 308 q_left[1] = q_left[1]*normal 307 309 q_right = qr 310 q_right[1] = q_right[1]*normal 308 311 309 312 z = (zl+zr)/2 #Take average of field values … … 338 341 339 342 #Maximal wave speed 340 #s_max = max(u_left+soundspeed_left, u_right+soundspeed_right, 0) 341 s_max = max(u_left+soundspeed_left, u_right+soundspeed_right,0) 343 s_max = max(u_left+soundspeed_left, u_right+soundspeed_right, 0) 342 344 343 345 #Minimal wave speed 344 #s_min = min(u_left-soundspeed_left, u_right-soundspeed_right, 0) 345 s_min = min(u_left-soundspeed_left, u_right-soundspeed_right,0) 346 s_min = min(u_left-soundspeed_left, u_right-soundspeed_right, 0) 346 347 347 348 #Flux computation … … 363 364 denom = s_max-s_min 364 365 if denom == 0.0: 365 edgeflux = array([0.0, 0.0, 0.0])366 #edgeflux = array([0.0, 0.0, 0.0]) 366 367 edgeflux = array([0.0, 0.0]) 367 368 max_speed = 0.0 … … 369 370 edgeflux = (s_max*flux_left - s_min*flux_right)/denom 370 371 edgeflux += s_max*s_min*(q_right-q_left)/denom 372 373 edgeflux[1] = -edgeflux[1]*normal 371 374 372 375 #edgeflux = rotate(edgeflux, normal, direction=-1) … … 407 410 408 411 #Arrays 409 stage = Stage.edge_values410 xmom = Xmom.edge_values412 #stage = Stage.edge_values 413 #xmom = Xmom.edge_values 411 414 # ymom = Ymom.edge_values 412 bed = Bed.edge_values 415 #bed = Bed.edge_values 416 417 stage = Stage.vertex_values 418 xmom = Xmom.vertex_values 419 bed = Bed.vertex_values 420 421 print 'stage edge values' 422 print stage 423 print 'xmom edge values' 424 print xmom 425 print 'bed values' 426 print bed 413 427 414 428 stage_bdry = Stage.boundary_values 415 429 xmom_bdry = Xmom.boundary_values 430 print 'stage_bdry' 431 print stage_bdry 432 print 'xmom_bdry' 433 print xmom_bdry 416 434 # ymom_bdry = Ymom.boundary_values 417 435 … … 439 457 zr = zl #Extend bed elevation to boundary 440 458 else: 441 m = domain.neighbour_edges[k,i] 459 #m = domain.neighbour_edges[k,i] 460 m = domain.neighbour_vertices[k,i] 442 461 #qr = [stage[n, m], xmom[n, m], ymom[n, m]] 443 462 qr = [stage[n, m], xmom[n, m]] … … 446 465 447 466 #Outward pointing normal vector 448 normal = domain.normals[k, 2*i:2*i+2]467 #normal = domain.normals[k, 2*i:2*i+2] 449 468 #CHECK THIS LINE [k, 2*i:2*i+1] 450 469 451 470 #Flux computation using provided function 452 471 #edgeflux, max_speed = flux_function(normal, ql, qr, zl, zr) 453 edgeflux, max_speed = flux_function(ql, qr, zl, zr) 454 flux -= edgeflux * domain.edgelengths[k,i] 472 print 'ql' 473 print ql 474 print 'qr' 475 print qr 476 477 edgeflux, max_speed = flux_function(normal, ql, qr, zl, zr) 478 print 'edgeflux' 479 print edgeflux 480 # THIS IS THE LINE TO DEAL WITH LEFT AND RIGHT FLUXES 481 # flux = edgefluxleft - edgefluxright 482 flux -= edgeflux #* domain.edgelengths[k,i] 455 483 456 484 #Update optimal_timestep 457 485 try: 458 timestep = min(timestep, 0.5*domain.radii[k]/max_speed) 486 #timestep = min(timestep, 0.5*domain.radii[k]/max_speed) 487 timestep = min(timestep, 0.5/max_speed) 488 print 'check time step in compute fluxes is ok' 459 489 except ZeroDivisionError: 460 490 pass … … 514 544 domain.timestep = compute_fluxes(timestep, domain.epsilon, domain.g, 515 545 domain.neighbours, 516 domain.neighbour_edges, 546 #domain.neighbour_edges, 547 domain.neighbour_vertices, 517 548 domain.normals, 518 domain.edgelengths,519 domain.radii,549 #domain.edgelengths, 550 #domain.radii, 520 551 domain.areas, 521 Stage.edge_values,522 Xmom.edge_values,552 #Stage.edge_values, 553 #Xmom.edge_values, 523 554 #Ymom.edge_values, 524 Bed.edge_values, 555 #Bed.edge_values, 556 Stage.vertex_values, 557 Xmom.vertex_values, 558 Bed.vertex_values, 525 559 Stage.boundary_values, 526 560 Xmom.boundary_values, … … 568 602 #MH090605 if second order, 569 603 #perform the extrapolation and limiting on 570 #all of the conserved quantitie 604 #all of the conserved quantities 571 605 572 606 if (domain.order == 1): … … 595 629 596 630 #Compute edge values by interpolation 597 for name in domain.conserved_quantities:598 Q = domain.quantities[name]599 Q.interpolate_from_vertices_to_edges()631 #for name in domain.conserved_quantities: 632 # Q = domain.quantities[name] 633 # Q.interpolate_from_vertices_to_edges() 600 634 601 635 … … 898 932 899 933 #Handy shorthands 900 self.stage = domain.quantities['stage'].edge_values901 self.xmom = domain.quantities['xmomentum'].edge_values934 #self.stage = domain.quantities['stage'].edge_values 935 #self.xmom = domain.quantities['xmomentum'].edge_values 902 936 #self.ymom = domain.quantities['ymomentum'].edge_values 903 937 #self.normals = domain.normals 938 self.stage = domain.quantities['stage'].vertex_values 939 self.xmom = domain.quantities['xmomentum'].vertex_values 904 940 905 941 from Numeric import zeros, Float … … 931 967 r[1] = -q[1] 932 968 q = r 969 #For start interval there is no outward momentum so do not need to 970 #reverse direction in this case 933 971 934 972 return q … … 950 988 Stage = domain.quantities['stage'] 951 989 Elevation = domain.quantities['elevation'] 952 h = Stage.edge_values - Elevation.edge_values 990 #h = Stage.edge_values - Elevation.edge_values 991 h = Stage.vertex_values - Elevation.vertex_values 953 992 v = Elevation.vertex_values 954 993 … … 1005 1044 1006 1045 uh = domain.quantities['xmomentum'].centroid_values 1007 vh = domain.quantities['ymomentum'].centroid_values1046 #vh = domain.quantities['ymomentum'].centroid_values 1008 1047 eta = domain.quantities['friction'].centroid_values 1009 1048 1010 1049 xmom_update = domain.quantities['xmomentum'].semi_implicit_update 1011 ymom_update = domain.quantities['ymomentum'].semi_implicit_update1050 #ymom_update = domain.quantities['ymomentum'].semi_implicit_update 1012 1051 1013 1052 N = domain.number_of_elements … … 1018 1057 if eta[k] >= eps: 1019 1058 if h[k] >= eps: 1020 S = -g * eta[k]**2 * sqrt((uh[k]**2 + vh[k]**2)) 1059 #S = -g * eta[k]**2 * sqrt((uh[k]**2 + vh[k]**2)) 1060 S = -g * eta[k]**2 * uh[k] 1021 1061 S /= h[k]**(7.0/3) 1022 1062 1023 1063 #Update momentum 1024 1064 xmom_update[k] += S*uh[k] 1025 ymom_update[k] += S*vh[k]1065 #ymom_update[k] += S*vh[k] 1026 1066 1027 1067
Note: See TracChangeset
for help on using the changeset viewer.