# structured mesh points, vertices, boundary = anuga.rectangular_cross(int(L/dx), int(W/dy), L, W, (-L/2.0, -W/2.0)) #domain = anuga.Domain(points, vertices, boundary) domain = Domain(points, vertices, boundary) domain.set_name(output_file) domain.set_datadir(output_dir) #------------------------------------------------------------------------------ # Setup Algorithm, either using command line arguments # or override manually yourself #------------------------------------------------------------------------------ from anuga.utilities.argparsing import parse_standard_args alg = parse_standard_args() domain.set_flow_algorithm(alg) #------------------------------------------------------------------------------ # Setup initial conditions #------------------------------------------------------------------------------ domain.set_quantity('elevation',0.0) domain.set_quantity('friction', 0.0) h0 = 5.0 h1 = 1.0 def height(x,y): z = zeros(len(x), float) for i in range(len(x)): if x[i]<=0.0:
else: z[i] = (4.5/40000)*(x[i]-1800)*(x[i]-1800) + 2.0 return z #------------------------------------------------------------------------------ # Setup sequential domain #------------------------------------------------------------------------------ if myid == 0: # structured mesh points, vertices, boundary = anuga.rectangular_cross(int(L/dx), int(W/dy), L, W, (0.0, 0.0)) domain = Domain(points, vertices, boundary) domain.set_name(output_file) domain.set_datadir(output_dir) domain.set_flow_algorithm(alg) #------------------------------------------------------------------------------ # Setup initial conditions #------------------------------------------------------------------------------ domain.set_quantity('friction', 0.0) domain.set_quantity('stage', stage_flat) domain.set_quantity('elevation', bed_elevation) else: domain = None #----------------------------------------------------------------------------- # Parallel Domain #-----------------------------------------------------------------------------
def test_runup_sinusoid(self): """ Run a version of the validation test runup_sinusoid to ensure limiting solution has small velocity """ points, vertices, boundary = anuga.rectangular_cross(20,20, len1=1., len2=1.) domain=Domain(points,vertices,boundary) # Create Domain domain.set_flow_algorithm('DE0') domain.set_name('runup_sinusoid_v2') # Output to file runup.sww domain.set_datadir('.') # Use current folder domain.set_quantities_to_be_stored({'stage': 2, 'xmomentum': 2, 'ymomentum': 2, 'elevation': 1}) #domain.set_store_vertices_uniquely(True) #------------------ # Define topography #------------------ scale_me=1.0 def topography(x,y): return (-x/2.0 +0.05*num.sin((x+y)*50.0))*scale_me def stagefun(x,y): stge=-0.2*scale_me #+0.01*(x>0.9) return stge domain.set_quantity('elevation',topography) # Use function for elevation domain.get_quantity('elevation').smooth_vertex_values() domain.set_quantity('friction',0.03) # Constant friction domain.set_quantity('stage', stagefun) # Constant negative initial stage domain.get_quantity('stage').smooth_vertex_values() #-------------------------- # Setup boundary conditions #-------------------------- Br=anuga.Reflective_boundary(domain) # Solid reflective wall Bd=anuga.Dirichlet_boundary([-0.1*scale_me,0.,0.]) # Constant boundary values -- not used in this example #---------------------------------------------- # Associate boundary tags with boundary objects #---------------------------------------------- domain.set_boundary({'left': Br, 'right': Bd, 'top': Br, 'bottom':Br}) #------------------------------ #Evolve the system through time #------------------------------ for t in domain.evolve(yieldstep=7.0,finaltime=7.0): #print domain.timestepping_statistics() xx = domain.quantities['xmomentum'].centroid_values yy = domain.quantities['ymomentum'].centroid_values dd = domain.quantities['stage'].centroid_values - domain.quantities['elevation'].centroid_values #dd_raw=1.0*dd dd = (dd)*(dd>1.0e-03)+1.0e-03 vv = ( (xx/dd)**2 + (yy/dd)**2)**0.5 vv = vv*(dd>1.0e-03) #print 'Peak velocity is: ', vv.max(), vv.argmax() #print 'Volume is', sum(dd_raw*domain.areas) #print vv.max() assert num.all(vv<1.01e-01)
# Setup and Run Model #=============================================================================== #------------------------------------------------------------------------------ # Setup computational domain #------------------------------------------------------------------------------ print ' Set up Domain first...' length = 24. width = 5. dx = dy = 0.2 #.1 # Resolution: Length of subdivisions on both axes points, vertices, boundary = rectangular_cross(int(length/dx), int(width/dy), len1=length, len2=width) domain = Domain(points, vertices, boundary) domain.set_flow_algorithm('DE1') domain.set_name('flat_fill_slice_erosion') # Output name print domain.statistics() 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 #------------------------------------------------------------------------------
def setup_domain(simulation): args = simulation.args verbose = args.verbose alg = args.alg N = args.N S = args.S E = args.E W = args.W from catchment_info import create_catchment_list from catchment_info import create_manning_list CatchmentList = create_catchment_list(simulation) ManningList = create_manning_list(simulation) #--------------------------------------------------------------------------- # CREATING MESH #--------------------------------------------------------------------------- bounding_polygon = [[W, S], [E, S], [E, N], [W, N]] interior_regions = read_polygon_list(CatchmentList) # FIXME: Have these in a shapefile / other file and read them in breaklines = [[[306612.336559443, 6193708.75358065], [306604.441364239, 6193693.17994946]], [[306977.886673843, 6193753.44134088], [306978.027867398, 6193710.94208076]], [[306956.001672788, 6193750.89985688], [306956.707640564, 6193706.14149989]], [[306627.303076293, 6193697.45809624], [306620.525785644, 6193683.62112783]], [[307236.83565407, 6193741.01630802], [307231.682089306, 6193721.03741996]], [[307224.975395434, 6193742.71063068], [307220.880782334, 6193723.36711362]], [[307624.764946969, 6193615.98941489], [307617.98765632, 6193601.44647871]], [[307613.328268998, 6193623.19028621], [307607.751123568, 6193610.97704368]]] # Make the mesh create_mesh_from_regions(bounding_polygon, boundary_tags={ 'south': [0], 'east': [1], 'north': [2], 'west': [3] }, maximum_triangle_area=args.maximum_triangle_area, interior_regions=interior_regions, filename=args.meshname, breaklines=breaklines, use_cache=False, verbose=True) #--------------------------------------------------------------------------- # SETUP COMPUTATIONAL DOMAIN #--------------------------------------------------------------------------- domain = Domain(args.meshname, use_cache=False, verbose=True) domain.set_flow_algorithm(alg) if (not domain.get_using_discontinuous_elevation()): raise Exception, 'This model run relies on a discontinuous elevation solver (because of how topography is set up)' domain.set_datadir(args.model_output_dir) domain.set_name(args.outname) print domain.statistics() #------------------------------------------------------------------------------ # APPLY MANNING'S ROUGHNESSES #------------------------------------------------------------------------------ if verbose: print 'Calculating complicated polygon friction function' friction_list = read_polygon_list(ManningList) domain.set_quantity( 'friction', Polygon_function(friction_list, default=args.base_friction, geo_reference=domain.geo_reference)) # Set a Initial Water Level over the Domain domain.set_quantity('stage', 0) if verbose: print 'Setting up elevation interpolation function' from anuga.utilities.quantity_setting_functions import make_nearestNeighbour_quantity_function if verbose: print 'READING %s' % args.basename + '.csv' elev_xyz = numpy.genfromtxt(fname=args.basename + '.csv', delimiter=',') # Use nearest-neighbour interpolation of elevation if verbose: print 'CREATING nearest neighbour interpolator' elev_fun_wrapper = make_nearestNeighbour_quantity_function( elev_xyz, domain) if verbose: print 'Applying elevation interpolation function' domain.set_quantity('elevation', elev_fun_wrapper, location='centroids') return domain
#=============================================================================== #------------------------------------------------------------------------------ # Setup computational domain #------------------------------------------------------------------------------ print ' Set up Domain first...' length = 24. width = 5. dx = dy = 0.2 #.1 # Resolution: Length of subdivisions on both axes points, vertices, boundary = rectangular_cross(int(length / dx), int(width / dy), len1=length, len2=width) domain = Domain(points, vertices, boundary) domain.set_flow_algorithm('DE0') domain.set_name() # Output name domain.set_store_vertices_uniquely(True) print domain.statistics() 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
def test_erosion_operator_simple_1_5(self): from anuga.config import rho_a, rho_w, eta_w from math import pi, cos, sin a = [0.0, 0.0] b = [0.0, 2.0] c = [2.0, 0.0] d = [0.0, 4.0] e = [2.0, 2.0] f = [4.0, 0.0] points = [a, b, c, d, e, f] # bac, bce, ecf, dbe vertices = [[1,0,2], [1,2,4], [4,2,5], [3,1,4]] domain = Domain(points, vertices) domain.set_flow_algorithm('1_5') #Flat surface with 1m of water domain.set_quantity('elevation', 0.5) domain.set_quantity('stage', 1.0) domain.set_quantity('friction', 0) domain.set_quantity('xmomentum',2.0) domain.set_quantity('ymomentum',3.0) Stage = domain.quantities['stage'].centroid_values Elevation = domain.quantities['elevation'].centroid_values Height = Stage - Elevation sum1 = num.sum(Height) Br = Reflective_boundary(domain) domain.set_boundary({'exterior': Br}) # print domain.quantities['stage'].centroid_values # print domain.quantities['xmomentum'].centroid_values # print domain.quantities['ymomentum'].centroid_values # Apply operator to these triangles indices = [0,1,3] operator = Erosion_operator(domain, indices=indices, logging=True) # Apply Operator domain.timestep = 2.0 operator() elev_ex = [ 0.05555556, 0.11111111, 0.27777778, 0.05555556] stage_ex = [ 0.55555556, 0.61111111, 0.77777778, 0.55555556] Stage = domain.quantities['stage'].centroid_values Elevation = domain.quantities['elevation'].centroid_values Height = Stage - Elevation sum2 = num.sum(Height) #print domain.quantities['elevation'].centroid_values #print domain.quantities['stage'].centroid_values #print domain.quantities['xmomentum'].centroid_values #print domain.quantities['ymomentum'].centroid_values assert sum1 == sum2 assert num.allclose(domain.quantities['stage'].centroid_values, stage_ex) assert num.allclose(domain.quantities['xmomentum'].centroid_values, 2.0) assert num.allclose(domain.quantities['ymomentum'].centroid_values, 3.0)
def setup_domain(simulation): args = simulation.args verbose = args.verbose alg = args.alg N = args.N S = args.S E = args.E W = args.W from catchment_info import create_catchment_list from catchment_info import create_manning_list CatchmentList = create_catchment_list(simulation) ManningList = create_manning_list(simulation) #------------------------------------------------------------------------------ # CREATING MESH #------------------------------------------------------------------------------ bounding_polygon = [[W, S], [E, S], [E, N], [W, N]] #interior_regions = read_polygon_dir(CatchmentDictionary, join('Model', 'Bdy')) interior_regions = read_polygon_list(CatchmentList) # FIXME: Have these in a shapefile / other file and read them in breaklines=[[[306612.336559443,6193708.75358065], [306604.441364239,6193693.17994946]], [[306977.886673843,6193753.44134088], [306978.027867398,6193710.94208076]], [[306956.001672788,6193750.89985688], [306956.707640564,6193706.14149989]], [[306627.303076293,6193697.45809624], [306620.525785644,6193683.62112783]], [[307236.83565407,6193741.01630802], [307231.682089306,6193721.03741996]], [[307224.975395434,6193742.71063068], [307220.880782334,6193723.36711362]], [[307624.764946969,6193615.98941489], [307617.98765632,6193601.44647871]], [[307613.328268998,6193623.19028621], [307607.751123568,6193610.97704368]]] # Make the mesh create_mesh_from_regions(bounding_polygon, boundary_tags={'south': [0], 'east': [1], 'north': [2], 'west': [3]}, maximum_triangle_area=args.maximum_triangle_area, interior_regions=interior_regions, filename=args.meshname, breaklines=breaklines, use_cache=False, verbose=True) #------------------------------------------------------------------------------ # SETUP COMPUTATIONAL DOMAIN #------------------------------------------------------------------------------ domain = Domain(args.meshname, use_cache=False, verbose=True) domain.set_flow_algorithm(alg) if(not domain.get_using_discontinuous_elevation()): raise Exception, 'This model run relies on a discontinuous elevation solver (because of how topography is set up)' domain.set_datadir(args.model_output_dir) domain.set_name(args.outname) print domain.statistics() #------------------------------------------------------------------------------ # APPLY MANNING'S ROUGHNESSES #------------------------------------------------------------------------------ if verbose: print 'Calculating complicated polygon friction function' friction_list = read_polygon_list(ManningList) domain.set_quantity('friction', Polygon_function(friction_list, default=args.base_friction, geo_reference=domain.geo_reference)) # Set a Initial Water Level over the Domain domain.set_quantity('stage', 0) # Decompress the zip file to make a csv for reading zipfile.ZipFile('DEM_bridges/towradgi_cleaner.zip').extract('towradgi.csv',path='DEM_bridges/') if verbose: print 'Setting up elevation interpolation function' from anuga.utilities.quantity_setting_functions import make_nearestNeighbour_quantity_function elev_xyz=numpy.genfromtxt(fname=args.basename+'.csv',delimiter=',') # Use nearest-neighbour interpolation of elevation elev_fun_wrapper=make_nearestNeighbour_quantity_function(elev_xyz,domain) if verbose: print 'Applying elevation interpolation function' domain.set_quantity('elevation', elev_fun_wrapper, location='centroids') os.remove('DEM_bridges/towradgi.csv') # Clean up csv file return domain
def test_set_elevation_operator_small_function_1_5(self): from anuga.config import rho_a, rho_w, eta_w from math import pi, cos, sin a = [0.0, 0.0] b = [0.0, 2.0] c = [2.0, 0.0] d = [0.0, 4.0] e = [2.0, 2.0] f = [4.0, 0.0] points = [a, b, c, d, e, f] # bac, bce, ecf, dbe vertices = [[1, 0, 2], [1, 2, 4], [4, 2, 5], [3, 1, 4]] domain = Domain(points, vertices) domain.set_flow_algorithm('1_5') #Flat surface with 1m of water domain.set_quantity('elevation', 0.0) domain.set_quantity('stage', 1.0) domain.set_quantity('friction', 0) Br = Reflective_boundary(domain) domain.set_boundary({'exterior': Br}) # print domain.quantities['stage'].centroid_values # print domain.quantities['xmomentum'].centroid_values # print domain.quantities['ymomentum'].centroid_values # Apply operator to these triangles indices = [0, 1, 3] def elev(t): if t < 10.0: return 5.0 else: return 7.0 operator = Set_elevation_operator(domain, elevation=elev, indices=indices) # Apply Operator at time t=1.0 domain.set_time(1.0) operator() elev_ex = [4.44444444, 3.88888889, 2.22222222, 4.44444444] stage_ex = [5.44444444, 4.88888889, 3.22222222, 5.44444444] # print domain.quantities['elevation'].centroid_values # print domain.quantities['stage'].centroid_values # print domain.quantities['xmomentum'].centroid_values # print domain.quantities['ymomentum'].centroid_values assert num.allclose(domain.quantities['elevation'].centroid_values, elev_ex) assert num.allclose(domain.quantities['stage'].centroid_values, stage_ex) assert num.allclose(domain.quantities['xmomentum'].centroid_values, 0.0) assert num.allclose(domain.quantities['ymomentum'].centroid_values, 0.0) # Apply Operator at time t=15.0 domain.set_time(15.0) operator() elev_ex = [6.59259259, 6.18518519, 3.85185185, 6.59259259] stage_ex = [7.59259259, 7.18518519, 4.85185185, 7.59259259] # print domain.quantities['elevation'].centroid_values # print domain.quantities['stage'].centroid_values # print domain.quantities['xmomentum'].centroid_values # print domain.quantities['ymomentum'].centroid_values assert num.allclose(domain.quantities['elevation'].centroid_values, elev_ex) assert num.allclose(domain.quantities['stage'].centroid_values, stage_ex) assert num.allclose(domain.quantities['xmomentum'].centroid_values, 0.0) assert num.allclose(domain.quantities['ymomentum'].centroid_values, 0.0)
def test_set_elevation_operator_simple_1_5(self): from anuga.config import rho_a, rho_w, eta_w from math import pi, cos, sin a = [0.0, 0.0] b = [0.0, 2.0] c = [2.0, 0.0] d = [0.0, 4.0] e = [2.0, 2.0] f = [4.0, 0.0] points = [a, b, c, d, e, f] # bac, bce, ecf, dbe vertices = [[1, 0, 2], [1, 2, 4], [4, 2, 5], [3, 1, 4]] domain = Domain(points, vertices) domain.set_flow_algorithm('1_5') #Flat surface with 1m of water domain.set_quantity('elevation', 0) domain.set_quantity('stage', 1.0) domain.set_quantity('friction', 0) stage_c = domain.quantities['stage'].centroid_values elev_c = domain.quantities['elevation'].centroid_values height_c = stage_c - elev_c integral0 = num.sum(height_c) Br = Reflective_boundary(domain) domain.set_boundary({'exterior': Br}) # print domain.quantities['stage'].centroid_values # print domain.quantities['xmomentum'].centroid_values # print domain.quantities['ymomentum'].centroid_values # Apply operator to these triangles indices = [0, 1, 3] elev = 3.0 operator = Set_elevation_operator(domain, elevation=elev, indices=indices) # Apply Operator domain.timestep = 2.0 operator() height_c = stage_c - elev_c integral1 = num.sum(height_c) assert integral0 == integral1 stage_ex = [3.66666667, 3.33333333, 2.33333333, 3.66666667] elev_ex = [2.66666667, 2.33333333, 1.33333333, 2.66666667] # print domain.quantities['elevation'].centroid_values # print domain.quantities['stage'].centroid_values # print domain.quantities['xmomentum'].centroid_values # print domain.quantities['ymomentum'].centroid_values assert num.allclose(domain.quantities['elevation'].centroid_values, elev_ex) assert num.allclose(domain.quantities['stage'].centroid_values, stage_ex) assert num.allclose(domain.quantities['xmomentum'].centroid_values, 0.0) assert num.allclose(domain.quantities['ymomentum'].centroid_values, 0.0)
def test_set_elevation_operator_negative_1_5(self): from anuga.config import rho_a, rho_w, eta_w from math import pi, cos, sin a = [0.0, 0.0] b = [0.0, 2.0] c = [2.0, 0.0] d = [0.0, 4.0] e = [2.0, 2.0] f = [4.0, 0.0] points = [a, b, c, d, e, f] # bac, bce, ecf, dbe vertices = [[1, 0, 2], [1, 2, 4], [4, 2, 5], [3, 1, 4]] domain = Domain(points, vertices) domain.set_flow_algorithm('1_5') #Flat surface with 1m of water domain.set_quantity('elevation', lambda x, y: -2 * x) domain.set_quantity('stage', 1.0) domain.set_quantity('friction', 0) stage_c = domain.quantities['stage'].centroid_values elev_c = domain.quantities['elevation'].centroid_values height_c = stage_c - elev_c integral0 = num.sum(height_c) Br = Reflective_boundary(domain) domain.set_boundary({'exterior': Br}) # print domain.quantities['elevation'].centroid_values # print domain.quantities['stage'].centroid_values # print domain.quantities['xmomentum'].centroid_values # print domain.quantities['ymomentum'].centroid_values # Apply operator to these triangles indices = [0, 1, 3] #Catchment_Rain_Polygon = read_polygon(join('CatchmentBdy.csv')) #rainfall = file_function(join('1y120m.tms'), quantities=['rainfall']) elev = -5.0 operator = Set_elevation_operator(domain, elevation=elev, indices=indices) # Apply Operator domain.timestep = 2.0 operator() height_c = stage_c - elev_c integral1 = num.sum(height_c) assert integral0 == integral1 elev_ex = [-4.88888889, -4.77777778, -5.77777778, -4.88888889] stage_ex = [-2.55555556, -1.11111111, 0.55555556, -2.55555556] # print domain.quantities['elevation'].centroid_values # print domain.quantities['stage'].centroid_values # print domain.quantities['xmomentum'].centroid_values # print domain.quantities['ymomentum'].centroid_values assert num.allclose(domain.quantities['elevation'].centroid_values, elev_ex) assert num.allclose(domain.quantities['stage'].centroid_values, stage_ex) assert num.allclose(domain.quantities['xmomentum'].centroid_values, 0.0) assert num.allclose(domain.quantities['ymomentum'].centroid_values, 0.0)
# =============================================================================== # ------------------------------------------------------------------------------ # Setup computational domain # ------------------------------------------------------------------------------ length = 15.0 width = 4.0 dx = dy = 0.25 # .1 # Resolution: Length of subdivisions on both axes points, vertices, boundary = rectangular_cross(int(length / dx), int(width / dy), len1=length, len2=width) evolved_quantities = ["stage", "xmomentum", "ymomentum", "elevation", "concentration"] domain = Domain(points, vertices, boundary, evolved_quantities=evolved_quantities) domain.set_flow_algorithm("DE0") domain.set_name("test_equations") # Output name # domain.set_store_vertices_uniquely(True) # print domain.statistics() domain.set_quantities_to_be_stored( { "elevation": 2, "stage": 2, # # 'xmomentum': 2, # 'ymomentum': 2, "concentration": 2, } )
""" Must include the process-specific quantities when creating the domain """ evolved_quantities = ['stage', 'xmomentum', 'ymomentum', 'concentration'] other_quantities=['elevation', 'friction', 'height', 'xvelocity', \ 'yvelocity', 'x', 'y', 'vegetation', 'diffusivity'] domain = Domain(points, vertices, boundary, evolved_quantities = evolved_quantities, other_quantities = other_quantities) domain.set_flow_algorithm('1_75') domain.set_name('run_simple_sed_transport_veg') # Output name domain.set_store_vertices_uniquely(True) domain.set_quantity('elevation', topography) # elevation is a function domain.set_quantity('stage', expression='elevation') # Dry initial condition print domain.statistics() """ Store process-specific quantities with same functions """ domain.set_quantities_to_be_stored({'elevation': 2, 'stage': 2, 'xmomentum': 2, 'ymomentum': 2, 'concentration': 2,