def setup_and_evolve(domain, verbose=False): #-------------------------------------------------------------------------- # Setup domain parameters #-------------------------------------------------------------------------- domain.set_flow_algorithm('DE0') #domain.set_store_vertices_uniquely() #------------------------------------------------------------------------------ # Setup boundary conditions # This must currently happen *AFTER* domain has been distributed #------------------------------------------------------------------------------ Br = Reflective_boundary(domain) # Solid reflective wall Bd = Dirichlet_boundary([-0.2,0.,0.]) # Constant boundary values # Associate boundary tags with boundary objects domain.set_boundary({'left': Br, 'right': Bd, 'top': Br, 'bottom': Br}) #------------------------------------------------------------------------------ # Evolve #------------------------------------------------------------------------------ for t in domain.evolve(yieldstep = yieldstep, finaltime = finaltime): if myid == 0 and verbose : domain.write_time() #if myid == 0 and verbose : print domain.quantities['stage'].get_maximum_value() domain.sww_merge(delete_old=True)
def concept_ungenerateIII(self): from anuga import Domain, Reflective_boundary, \ Dirichlet_boundary from anuga.pmesh.mesh_interface import create_mesh_from_regions # These are the absolute values polygon = [[0, 0], [100, 0], [100, 100], [0, 100]] boundary_tags = {'wall': [0, 1, 3], 'wave': [2]} inner1_polygon = [[10, 10], [20, 10], [20, 20], [10, 20]] inner2_polygon = [[30, 30], [40, 30], [40, 40], [30, 40]] max_area = 1 interior_regions = [(inner1_polygon, 5), (inner2_polygon, 10)] m = create_mesh_from_regions(polygon, boundary_tags, max_area, interior_regions=interior_regions) fileName = tempfile.mktemp('.txt') file = open(fileName, 'w') file.write(' 1 ?? ??\n\ 90.0 90.0\n\ 81.0 90.0\n\ 81.0 81.0\n\ 90.0 81.0\n\ 90.0 90.0\n\ END\n\ 2 ?? ??\n\ 10.0 80.0\n\ 10.0 90.0\n\ 20.0 90.0\n\ 10.0 80.0\n\ END\n\ END\n') file.close() m.import_ungenerate_file(fileName) os.remove(fileName) m.generate_mesh(maximum_triangle_area=max_area, verbose=False) mesh_filename = 'mesh.tsh' m.export_mesh_file(mesh_filename) domain = Domain(mesh_filename, use_cache=False) Br = Reflective_boundary(domain) Bd = Dirichlet_boundary([3, 0, 0]) domain.set_boundary({'wall': Br, 'wave': Bd}) yieldstep = 0.1 finaltime = 10 for t in domain.evolve(yieldstep, finaltime): domain.write_time()
def concept_ungenerateII(self): from anuga import Domain, Reflective_boundary, Dirichlet_boundary x = 0 y = 0 mesh_geo = geo_reference = Geo_reference(56, x, y) # These are the absolute values polygon_absolute = [[0, 0], [100, 0], [100, 100], [0, 100]] x_p = -10 y_p = -40 geo_ref_poly = Geo_reference(56, x_p, y_p) polygon = geo_ref_poly.change_points_geo_ref(polygon_absolute) boundary_tags = {'wall': [0, 1, 3], 'wave': [2]} inner1_polygon_absolute = [[10, 10], [20, 10], [20, 20], [10, 20]] inner1_polygon = geo_ref_poly.\ change_points_geo_ref(inner1_polygon_absolute) inner2_polygon_absolute = [[30, 30], [40, 30], [40, 40], [30, 40]] inner2_polygon = geo_ref_poly.\ change_points_geo_ref(inner2_polygon_absolute) max_area = 1 interior_regions = [(inner1_polygon, 5), (inner2_polygon, 10)] m = create_mesh_from_regions(polygon, boundary_tags, max_area, interior_regions=interior_regions, poly_geo_reference=geo_ref_poly, mesh_geo_reference=mesh_geo) m.export_mesh_file('a_test_mesh_iknterface.tsh') fileName = tempfile.mktemp('.txt') file = open(fileName, 'w') file.write(' 1 ?? ??\n\ 90.0 90.0\n\ 81.0 90.0\n\ 81.0 81.0\n\ 90.0 81.0\n\ 90.0 90.0\n\ END\n\ 2 ?? ??\n\ 10.0 80.0\n\ 10.0 90.0\n\ 20.0 90.0\n\ 10.0 80.0\n\ END\n\ END\n') file.close() m.import_ungenerate_file(fileName) #, tag='wall') os.remove(fileName) m.generate_mesh(maximum_triangle_area=max_area, verbose=False) mesh_filename = 'bento_b.tsh' m.export_mesh_file(mesh_filename) domain = Domain(mesh_filename, use_cache=False) Br = Reflective_boundary(domain) Bd = Dirichlet_boundary([3, 0, 0]) domain.set_boundary({'wall': Br, 'wave': Bd}) yieldstep = 0.1 finaltime = 10 for t in domain.evolve(yieldstep, finaltime): domain.write_time()
domain.set_quantities_to_be_stored({ 'elevation': 2, 'stage': 2, 'xmomentum': 2, 'ymomentum': 2 }) domain.set_quantity('elevation', topography) # elevation is a function domain.set_quantity('friction', 0.01) # Constant friction domain.set_quantity('stage', expression='elevation') # Dry initial condition #------------------------------------------------------------------------------ # Setup boundary conditions #------------------------------------------------------------------------------ Bi = Dirichlet_boundary([1.5, 0, 0]) # Inflow Br = Reflective_boundary(domain) # Solid reflective wall Bo = Dirichlet_boundary([-5, 0, 0]) # Outflow domain.set_boundary({'left': Bi, 'right': Bo, 'top': Br, 'bottom': Br}) #------------------------------------------------------------------------------ # Setup erosion operator in the middle of dam #------------------------------------------------------------------------------ print 'Set up Erosion Area to test...' from anuga import Bed_shear_erosion_operator polygon1 = [[10.6, 1.0], [13.7, 1.0], [13.7, 4.0], [10.6, 4.0]] # create operator op1 = Bed_shear_erosion_operator(domain,
def run_simulation(parallel=False, G = None, seq_interpolation_points=None, verbose=False): #-------------------------------------------------------------------------- # Setup computational domain and quantities #-------------------------------------------------------------------------- domain = rectangular_cross_domain(M, N) domain.set_quantity('elevation', topography) # Use function for elevation domain.set_quantity('friction', 0.0) # Constant friction domain.set_quantity('stage', expression='elevation') # Dry initial stage domain.set_low_froude(1) domain.set_name('runup') # Set sww filename domain.set_datadir('.') # Set output dir #-------------------------------------------------------------------------- # Create the parallel domain #-------------------------------------------------------------------------- if parallel: if myid == 0 and verbose : print('DISTRIBUTING PARALLEL DOMAIN') domain = distribute(domain, verbose=False) #-------------------------------------------------------------------------- # Setup domain parameters #-------------------------------------------------------------------------- domain.set_quantities_to_be_stored(None) #------------------------------------------------------------------------------ # Setup boundary conditions # This must currently happen *AFTER* domain has been distributed #------------------------------------------------------------------------------ Br = Reflective_boundary(domain) # Solid reflective wall Bd = Dirichlet_boundary([-0.2,0.,0.]) # Constant boundary values # Associate boundary tags with boundary objects domain.set_boundary({'left': Br, 'right': Bd, 'top': Br, 'bottom': Br}) #------------------------------------------------------------------------------ # Find which sub_domain in which the interpolation points are located # # Sometimes the interpolation points sit exactly # between two centroids, so in the parallel run we # reset the interpolation points to the centroids # found in the sequential run #------------------------------------------------------------------------------ interpolation_points = [[0.4,0.5], [0.6,0.5], [0.8,0.5], [0.9,0.5]] gauge_values = [] tri_ids = [] for i, point in enumerate(interpolation_points): gauge_values.append([]) # Empty list for timeseries #if is_inside_polygon(point, domain.get_boundary_polygon()): #print "Point ", myid, i, point try: k = domain.get_triangle_containing_point(point) if domain.tri_full_flag[k] == 1: tri_ids.append(k) else: tri_ids.append(-1) except: tri_ids.append(-2) #print " tri_ids ",myid, i, tri_ids[-1] if verbose: print('P%d has points = %s' %(myid, tri_ids)) c_coord = domain.get_centroid_coordinates() interpolation_points = [] for id in tri_ids: if id<1: if verbose: print('WARNING: Interpolation point not within the domain!') interpolation_points.append(c_coord[id,:]) #------------------------------------------------------------------------------ # Evolve system through time #------------------------------------------------------------------------------ time = [] if parallel: if myid == 0 and verbose: print('PARALLEL EVOLVE') else: if myid == 0 and verbose: print('SEQUENTIAL EVOLVE') for t in domain.evolve(yieldstep = yieldstep, finaltime = finaltime): if myid == 0 and verbose : domain.write_time() # Record time series at known points time.append(domain.get_time()) stage = domain.get_quantity('stage') for i in range(4): if tri_ids[i] > -1: gauge_values[i].append(stage.centroid_values[tri_ids[i]]) #---------------------------------------- # Setup test arrays during sequential run #---------------------------------------- if not parallel: G = [] for i in range(4): G.append(gauge_values[i]) success = True for i in range(4): if tri_ids[i] > -1: #print num.max(num.array(gauge_values[i])- num.array(G[i])) success = success and num.allclose(gauge_values[i], G[i]) assert_(success) return G, interpolation_points
'concentration': 2, 'vegetation': 1}) #------------------------------------------------------------------------------ # Setup boundary conditions #------------------------------------------------------------------------------ max_elev = domain.quantities['elevation'].vertex_values.max() min_elev = domain.quantities['elevation'].vertex_values.min() """ Use operator-specific Reflective and Dirichlet boundaries. Use original Dirichlet boundary for outlet. """ Bi = Dirichlet_boundary_Sed([max_elev + 0.5, 0, 0, 0.2]) # Inflow, 20% sed Br = Reflective_boundary_Sed(domain) # Solid reflective wall Bo = Dirichlet_boundary([min_elev - 1, 0, 0]) # Outflow domain.set_boundary({'left': Bi, 'right': Bo, 'top': Br, 'bottom': Br}) #------------------------------------------------------------------------------ # Setup operators #------------------------------------------------------------------------------ """ Uniform vegetation cover of type "1" (see vegcodes.txt for corresponding stem spacing and diameter) """ domain.set_quantity('vegetation', 1) """ Create operators