@@ -272,6 +272,7 @@ def run_dem_simulation(dem_file: str,
272272 release_j : int = None ,
273273 release_radius : int = 10 ,
274274 release_height : float = 5.0 ,
275+ release_vertices : list = None ,
275276 animate_3d : bool = True ,
276277 export_video : bool = False ) -> None :
277278 """
@@ -284,6 +285,7 @@ def run_dem_simulation(dem_file: str,
284285 release_i, release_j: Release zone center (auto if None)
285286 release_radius: Release zone radius in cells
286287 release_height: Initial release height (m)
288+ release_vertices: List of (row, col) tuples for polygon release zone
287289 animate_3d: Show 3D animation
288290 export_video: Export animation to MP4
289291 """
@@ -298,12 +300,6 @@ def run_dem_simulation(dem_file: str,
298300 print (f" Cell size: { terrain .cell_size } m" )
299301 print (f" Elevation range: { terrain .elevation .min ():.1f} to { terrain .elevation .max ():.1f} m" )
300302
301- # Auto-detect release zone if not specified
302- if release_i is None :
303- release_i = terrain .rows // 5 # Upper portion
304- if release_j is None :
305- release_j = terrain .cols // 2 # Center
306-
307303 # Setup model
308304 print ("\n [2/6] Configuring flow model..." )
309305 params = FlowParameters (
@@ -319,9 +315,26 @@ def run_dem_simulation(dem_file: str,
319315 solver = NOCTVDSolver (terrain , model , solver_config )
320316
321317 # Initialize release
322- print (f"\n [3/6] Creating release zone at ( { release_i } , { release_j } ) ..." )
318+ print (f"\n [3/6] Creating release zone..." )
323319 state = FlowState .zeros ((terrain .rows , terrain .cols ))
324- release = terrain .create_release_zone (release_i , release_j , release_radius , release_height )
320+
321+ if release_vertices is not None and len (release_vertices ) >= 3 :
322+ # Polygon release zone
323+ release = terrain .create_polygon_release_zone (
324+ vertices = release_vertices ,
325+ height = release_height ,
326+ smooth = True
327+ )
328+ print (f" Polygon release with { len (release_vertices )} vertices" )
329+ else :
330+ # Circular release zone (original behavior)
331+ if release_i is None :
332+ release_i = terrain .rows // 5
333+ if release_j is None :
334+ release_j = terrain .cols // 2
335+ release = terrain .create_release_zone (release_i , release_j , release_radius , release_height )
336+ print (f" Circular release at ({ release_i } , { release_j } ), radius={ release_radius } " )
337+
325338 state .h_solid = release * 0.7
326339 state .h_fluid = release * 0.3
327340
@@ -457,7 +470,10 @@ def main():
457470 release_group .add_argument ('--release-radius' , type = int , default = 10 ,
458471 help = 'Release zone radius in cells (default: 10)' )
459472 release_group .add_argument ('--release-height' , type = float , default = 5.0 ,
460- help = 'Release zone height in meters (default: 5.0)' )
473+ help = 'Release zone height in meters (default: 5.0)' )
474+ release_group .add_argument ('--release-polygon' , type = str , metavar = 'VERTICES' ,
475+ help = 'Polygon release zone as comma-separated row,col pairs '
476+ '(e.g. "10,20,10,40,30,40,30,20")' )
461477
462478 # Visualization
463479 viz_group = parser .add_argument_group ('Visualization' )
@@ -485,6 +501,18 @@ def main():
485501
486502 # DEM simulation
487503 if args .dem_file :
504+ # Parse polygon vertices if provided
505+ release_vertices = None
506+ if args .release_polygon :
507+ coords = [int (x .strip ()) for x in args .release_polygon .split (',' )]
508+ if len (coords ) % 2 != 0 :
509+ print ("Error: --release-polygon must have even number of values (row,col pairs)" )
510+ sys .exit (1 )
511+ release_vertices = [(coords [i ], coords [i + 1 ]) for i in range (0 , len (coords ), 2 )]
512+ if len (release_vertices ) < 3 :
513+ print ("Error: --release-polygon requires at least 3 vertex pairs" )
514+ sys .exit (1 )
515+
488516 run_dem_simulation (
489517 dem_file = args .dem_file ,
490518 output_dir = args .output_dir ,
@@ -493,6 +521,7 @@ def main():
493521 release_j = args .release_col ,
494522 release_radius = args .release_radius ,
495523 release_height = args .release_height ,
524+ release_vertices = release_vertices ,
496525 animate_3d = args .animate_3d and not args .no_viz ,
497526 export_video = args .export_video
498527 )
0 commit comments