- Timestamp:
- Jan 21, 2009, 5:28:57 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
anuga_core/source/anuga/abstract_2d_finite_volumes/domain.py
r6191 r6226 8 8 """ 9 9 10 import types 11 from time import time as walltime 12 10 13 from anuga.config import epsilon 11 14 from anuga.config import beta_euler, beta_rk2 12 13 15 from anuga.abstract_2d_finite_volumes.neighbour_mesh import Mesh 14 16 from anuga.abstract_2d_finite_volumes.generic_boundary_conditions\ … … 22 24 from anuga.abstract_2d_finite_volumes.generic_boundary_conditions\ 23 25 import Transmissive_boundary 24 25 26 from anuga.abstract_2d_finite_volumes.pmesh2domain import pmesh_to_domain 26 27 from anuga.abstract_2d_finite_volumes.region\ 27 28 import Set_region as region_set_region 28 29 29 from anuga.utilities.polygon import inside_polygon 30 30 from anuga.abstract_2d_finite_volumes.util import get_textual_float 31 32 31 from quantity import Quantity 33 32 34 import types35 from time import time as walltime36 37 33 import Numeric as num 38 34 39 35 40 36 ## 41 # @brief Basic Domain class37 # @brief Generic Domain class 42 38 class Domain: 43 39 … … 49 45 # @param conserved_quantities List of names of quantities to be conserved. 50 46 # @param other_quantities List of names of other quantities. 51 # @param tagged_elements 52 # @param geo_reference 53 # @param use_inscribed_circle 54 # @param mesh_filename 55 # @param use_cache 56 # @param verbose 57 # @param full_send_dict 58 # @param ghost_recv_dict 59 # @param processor 60 # @param numproc 61 # @param number_of_full_nodes 62 # @param number_of_full_triangles 47 # @param tagged_elements ?? 48 # @param geo_reference ?? 49 # @param use_inscribed_circle ?? 50 # @param mesh_filename ?? 51 # @param use_cache ?? 52 # @param verbose True if this method is to be verbose. 53 # @param full_send_dict ?? 54 # @param ghost_recv_dict ?? 55 # @param processor ?? 56 # @param numproc ?? 57 # @param number_of_full_nodes ?? 58 # @param number_of_full_triangles ?? 63 59 def __init__(self, source=None, 64 60 triangles=None, … … 119 115 number_of_full_triangles=number_of_full_triangles, 120 116 verbose=verbose) 121 117 122 118 # Expose Mesh attributes (FIXME: Maybe turn into methods) 123 119 self.centroid_coordinates = self.mesh.centroid_coordinates 124 self.vertex_coordinates = self.mesh.vertex_coordinates 120 self.vertex_coordinates = self.mesh.vertex_coordinates 125 121 self.boundary = self.mesh.boundary 126 122 self.neighbours = self.mesh.neighbours 127 self.surrogate_neighbours = self.mesh.surrogate_neighbours 123 self.surrogate_neighbours = self.mesh.surrogate_neighbours 128 124 self.neighbour_edges = self.mesh.neighbour_edges 129 125 self.normals = self.mesh.normals 130 self.edgelengths = self.mesh.edgelengths 131 self.radii = self.mesh.radii 132 self.areas = self.mesh.areas 133 134 self.number_of_boundaries = self.mesh.number_of_boundaries 126 self.edgelengths = self.mesh.edgelengths 127 self.radii = self.mesh.radii 128 self.areas = self.mesh.areas 129 130 self.number_of_boundaries = self.mesh.number_of_boundaries 135 131 self.number_of_full_nodes = self.mesh.number_of_full_nodes 136 self.number_of_full_triangles = self.mesh.number_of_full_triangles 132 self.number_of_full_triangles = self.mesh.number_of_full_triangles 137 133 self.number_of_triangles_per_node = self.mesh.number_of_triangles_per_node 138 134 139 135 self.vertex_value_indices = self.mesh.vertex_value_indices 140 self.number_of_triangles = self.mesh.number_of_triangles 136 self.number_of_triangles = self.mesh.number_of_triangles 141 137 142 138 self.geo_reference = self.mesh.geo_reference 143 139 144 140 if verbose: print 'Initialising Domain' 145 141 … … 276 272 277 273 if verbose: print 'Domain: Done' 278 279 280 274 275 ###### 281 276 # Expose underlying Mesh functionality 277 ###### 278 282 279 def __len__(self): 283 280 return len(self.mesh) … … 285 282 def get_centroid_coordinates(self, *args, **kwargs): 286 283 return self.mesh.get_centroid_coordinates(*args, **kwargs) 287 284 288 285 def get_radii(self, *args, **kwargs): 289 return self.mesh.get_radii(*args, **kwargs) 290 286 return self.mesh.get_radii(*args, **kwargs) 287 291 288 def get_areas(self, *args, **kwargs): 292 return self.mesh.get_areas(*args, **kwargs) 289 return self.mesh.get_areas(*args, **kwargs) 293 290 294 291 def get_area(self, *args, **kwargs): … … 296 293 297 294 def get_vertex_coordinates(self, *args, **kwargs): 298 return self.mesh.get_vertex_coordinates(*args, **kwargs) 295 return self.mesh.get_vertex_coordinates(*args, **kwargs) 299 296 300 297 def get_triangles(self, *args, **kwargs): 301 return self.mesh.get_triangles(*args, **kwargs) 302 298 return self.mesh.get_triangles(*args, **kwargs) 299 303 300 def get_nodes(self, *args, **kwargs): 304 301 return self.mesh.get_nodes(*args, **kwargs) 305 302 306 303 def get_number_of_nodes(self, *args, **kwargs): 307 304 return self.mesh.get_number_of_nodes(*args, **kwargs) 308 305 309 306 def get_normal(self, *args, **kwargs): 310 return self.mesh.get_normal(*args, **kwargs) 311 307 return self.mesh.get_normal(*args, **kwargs) 308 312 309 def get_intersecting_segments(self, *args, **kwargs): 313 310 return self.mesh.get_intersecting_segments(*args, **kwargs) 314 311 315 312 def get_disconnected_triangles(self, *args, **kwargs): 316 313 return self.mesh.get_disconnected_triangles(*args, **kwargs) 317 314 318 315 def get_boundary_tags(self, *args, **kwargs): 319 316 return self.mesh.get_boundary_tags(*args, **kwargs) … … 321 318 def get_boundary_polygon(self, *args, **kwargs): 322 319 return self.mesh.get_boundary_polygon(*args, **kwargs) 323 320 324 321 def get_number_of_triangles_per_node(self, *args, **kwargs): 325 322 return self.mesh.get_number_of_triangles_per_node(*args, **kwargs) 326 323 327 324 def get_triangles_and_vertices_per_node(self, *args, **kwargs): 328 325 return self.mesh.get_triangles_and_vertices_per_node(*args, **kwargs) 329 326 330 327 def get_interpolation_object(self, *args, **kwargs): 331 return self.mesh.get_interpolation_object(*args, **kwargs) 332 328 return self.mesh.get_interpolation_object(*args, **kwargs) 329 333 330 def get_tagged_elements(self, *args, **kwargs): 334 return self.mesh.get_tagged_elements(*args, **kwargs) 335 331 return self.mesh.get_tagged_elements(*args, **kwargs) 332 336 333 def get_lone_vertices(self, *args, **kwargs): 337 return self.mesh.get_lone_vertices(*args, **kwargs) 338 334 return self.mesh.get_lone_vertices(*args, **kwargs) 335 339 336 def get_unique_vertices(self, *args, **kwargs): 340 return self.mesh.get_unique_vertices(*args, **kwargs) 337 return self.mesh.get_unique_vertices(*args, **kwargs) 341 338 342 339 def get_georeference(self, *args, **kwargs): 343 340 return self.mesh.get_georeference(*args, **kwargs) 344 341 345 342 def set_georeference(self, *args, **kwargs): 346 self.mesh.set_georeference(*args, **kwargs) 347 343 self.mesh.set_georeference(*args, **kwargs) 344 348 345 def build_tagged_elements_dictionary(self, *args, **kwargs): 349 346 self.mesh.build_tagged_elements_dictionary(*args, **kwargs) 350 347 351 348 def statistics(self, *args, **kwargs): 352 return self.mesh.statistics(*args, **kwargs) 353 354 355 349 return self.mesh.statistics(*args, **kwargs) 350 356 351 ## 357 352 # @brief Get conserved quantities for a volume. … … 365 360 vertex=None, 366 361 edge=None): 367 """Get conserved quantities at volume vol_id 362 """Get conserved quantities at volume vol_id. 368 363 369 364 If vertex is specified use it as index for vertex values … … 397 392 # @param time The new model time (seconds). 398 393 def set_time(self, time=0.0): 399 """Set the model time (seconds)""" 394 """Set the model time (seconds).""" 395 400 396 # FIXME: this is setting the relative time 401 397 # Note that get_time and set_time are now not symmetric … … 407 403 # @return The absolute model time (seconds). 408 404 def get_time(self): 409 """Get the absolute model time (seconds) """405 """Get the absolute model time (seconds).""" 410 406 411 407 return self.time + self.starttime … … 415 411 # @param beta The new beta value. 416 412 def set_beta(self, beta): 417 """Set default beta for limiting """413 """Set default beta for limiting.""" 418 414 419 415 self.beta = beta 420 416 for name in self.quantities: 421 #print 'setting beta for quantity ',name422 417 Q = self.quantities[name] 423 418 Q.set_beta(beta) … … 427 422 # @return The beta value used for limiting. 428 423 def get_beta(self): 429 """Get default beta for limiting """424 """Get default beta for limiting.""" 430 425 431 426 return self.beta … … 436 431 # @note If 'n' is not 1 or 2, raise exception. 437 432 def set_default_order(self, n): 438 """Set default (spatial) order to either 1 or 2 """433 """Set default (spatial) order to either 1 or 2.""" 439 434 440 435 msg = 'Default order must be either 1 or 2. I got %s' % n … … 443 438 self.default_order = n 444 439 self._order_ = self.default_order 445 446 if self.default_order == 1:447 pass448 #self.set_timestepping_method('euler')449 #self.set_all_limiters(beta_euler)450 451 if self.default_order == 2:452 pass453 #self.set_timestepping_method('rk2')454 #self.set_all_limiters(beta_rk2)455 440 456 441 ## … … 681 666 ## 682 667 # @brief Set quantities based on a regional tag. 683 # @param args 684 # @param kwargs 668 # @param args 669 # @param kwargs 685 670 def set_region(self, *args, **kwargs): 686 671 """Set quantities based on a regional tag. … … 1228 1213 self.starttime = float(time) 1229 1214 1230 # --------------------------1215 ################################################################################ 1231 1216 # Main components of evolve 1232 # --------------------------1217 ################################################################################ 1233 1218 1234 1219 ## … … 1275 1260 'evolving system, ' 1276 1261 'e.g. using the method set_boundary.\n' 1277 'This system has the boundary tags %s ' ) \1278 % self.get_boundary_tags() 1262 'This system has the boundary tags %s ' 1263 % self.get_boundary_tags()) 1279 1264 assert hasattr(self, 'boundary_objects'), msg 1280 1265 … … 1287 1272 1288 1273 if finaltime is not None and duration is not None: 1289 # print 'F', finaltime, duration1290 1274 msg = 'Only one of finaltime and duration may be specified' 1291 1275 raise Exception, msg … … 1296 1280 self.finaltime = self.starttime + float(duration) 1297 1281 1298 N = len(self) # Number of triangles1299 self.yieldtime = 0.0 # Track time between 'yields'1282 N = len(self) # Number of triangles 1283 self.yieldtime = 0.0 # Track time between 'yields' 1300 1284 1301 1285 # Initialise interval of timestep sizes (for reporting only) … … 1322 1306 1323 1307 if skip_initial_step is False: 1324 yield(self.time) # Yield initial values1308 yield(self.time) # Yield initial values 1325 1309 1326 1310 while True: … … 1347 1331 if self.time > finaltime: 1348 1332 # FIXME (Ole, 30 April 2006): Do we need this check? 1349 # Probably not (Ole, 18 September 2008). Now changed to1350 # Exception1333 # Probably not (Ole, 18 September 2008). 1334 # Now changed to Exception. 1351 1335 msg = ('WARNING (domain.py): time overshot finaltime. ' 1352 1336 'Contact Ole.Nielsen@ga.gov.au') … … 1417 1401 self.backup_conserved_quantities() 1418 1402 1419 # --------------------------------------1403 ###### 1420 1404 # First euler step 1421 # --------------------------------------1405 ###### 1422 1406 1423 1407 # Compute fluxes across each element edge … … 1442 1426 self.update_boundary() 1443 1427 1444 # ------------------------------------1428 ###### 1445 1429 # Second Euler step 1446 # ------------------------------------1430 ###### 1447 1431 1448 1432 # Compute fluxes across each element edge … … 1452 1436 self.update_conserved_quantities() 1453 1437 1454 # ------------------------------------1438 ###### 1455 1439 # Combine initial and final values 1456 1440 # of conserved quantities and cleanup 1457 # ------------------------------------1441 ###### 1458 1442 1459 1443 # Combine steps … … 1484 1468 initial_time = self.time 1485 1469 1486 # --------------------------------------1470 ###### 1487 1471 # First euler step 1488 # --------------------------------------1472 ###### 1489 1473 1490 1474 # Compute fluxes across each element edge … … 1509 1493 self.update_boundary() 1510 1494 1511 # ------------------------------------1495 ###### 1512 1496 # Second Euler step 1513 # ------------------------------------1497 ###### 1514 1498 1515 1499 # Compute fluxes across each element edge … … 1519 1503 self.update_conserved_quantities() 1520 1504 1521 # ------------------------------------1522 # Combine steps to obtain intermediate1523 # solution at time t^n + 0.5 h1524 # ------------------------------------1505 ###### 1506 # Combine steps to obtain intermediate 1507 # solution at time t^n + 0.5 h 1508 ###### 1525 1509 1526 1510 # Combine steps … … 1539 1523 self.update_boundary() 1540 1524 1541 # ------------------------------------1525 ###### 1542 1526 # Third Euler step 1543 # ------------------------------------1527 ###### 1544 1528 1545 1529 # Compute fluxes across each element edge … … 1549 1533 self.update_conserved_quantities() 1550 1534 1551 # ------------------------------------1535 ###### 1552 1536 # Combine final and initial values 1553 1537 # and cleanup 1554 # ------------------------------------1538 ###### 1555 1539 1556 1540 # Combine steps … … 1631 1615 1632 1616 ## 1633 # @brief 1634 # @param yieldstep 1635 # @param finaltime 1617 # @brief 1618 # @param yieldstep 1619 # @param finaltime 1636 1620 def update_timestep(self, yieldstep, finaltime): 1637 1621 from anuga.config import min_timestep, max_timestep … … 1779 1763 elif self._order_ == 2: 1780 1764 Q.extrapolate_second_order() 1781 #Q.limit()1782 1765 else: 1783 1766 raise Exception, 'Unknown order' 1784 #Q.interpolate_from_vertices_to_edges()1785 1767 1786 1768 ## 1787 1769 # @brief Calculate the norm of the centroid values of a specific quantity, 1788 1770 # using normfunc. 1789 # @param quantity 1790 # @param normfunc 1771 # @param quantity 1772 # @param normfunc 1791 1773 def centroid_norm(self, quantity, normfunc): 1792 """Calculate the norm of the centroid values 1793 of a specific quantity,using normfunc.1774 """Calculate the norm of the centroid values of a specific quantity, 1775 using normfunc. 1794 1776 1795 1777 normfunc should take a list to a float. … … 1801 1783 1802 1784 1803 # ------------------1785 ###### 1804 1786 # Initialise module 1805 # ------------------1787 ###### 1806 1788 1807 1789 # Optimisation with psyco 1808 1790 from anuga.config import use_psyco 1791 1809 1792 if use_psyco: 1810 1793 try:
Note: See TracChangeset
for help on using the changeset viewer.