310 likes | 447 Vues
This paper presents an implementation of multigrid methods aimed at efficiently solving the Navier-Stokes equations for fluid dynamics simulations. It discusses the established algorithm, including both V-cycle and full multigrid approaches, alongside their performance. Various case studies, such as flow through channels with hidden obstacles and models depicting the Karman vortex, are detailed to illustrate the method's application. We also examine the challenges encountered during implementation and offer insights into performance optimization results, culminating in a conclusion highlighting the modular program structure and advanced debugging techniques. ###
E N D
Multigrid MethodsThe Implementation Wei E CSE@Technische Universität München. Ferien Akademie 19th Sep. 2005
Content • Introduction • Algorithm • Results & Performance • A Failing Example • Conclusion
Content • Introduction • Algorithm • Results & Performance • A Failing Example • Conclusion
Introduction • Fluid Dynamics • Solving PDEs • Computational Fluid Dynamics • Numerical Solution
The Navier-Stokes Equations (1) • Non-stationary incompressible viscous fluids • 2D Cartesian coordinates • system of partial differential equations • two momentum equations + continuity equation
Poisson Equation • Where f(x,y) is the right-hand side calculated by the quantities in the previous time step; • the unknown u is to be solved in the current time step.
Discretization (1) • Finite Difference Scheme:
Discretization (2) • The corresponding matrix representation is: where
Content • Introduction • Algorithm • Results & Performance • A Failing Example • Conclusion
Multigrid Implementation • The two classical schemes: V-Cycle Full Multigrid (FMG)
V-Cycle: The Algorithm grid = { double Ddim_array f // the right hand side double Ddim_array v // the current approximation } Grid = array of structure grid. for j = 0 to coarsest - 1 Grid[j].v <- relax(Grid[j].v, Grid[j].f, num_sweeps_down); Grid[j+1].f <-restrict(Grid[j].f- calculate_rhs(Grid[j].v)); endfor Grid[coarsest].v = direct_solve(Grid[coarsest].v, Grid[coarsest].f); for j = coarsest – 1 to 0 Grid[j].v <- Grid[j].v + interpolate(Grid[j+1].v); Grid[j].v <-relax(Grid[j].v, Grid[j].f, num_sweeps_up); endfor
V-Cycle: Comments (1) • a) Non-recursive structure; • b) Gauss-Seidel is used as the relaxation method; • c) calculate_rhs() is a function to calculate the right-hand side based on current approximation; • d) Several methods can be used to solve the small-size problem, we choose SOR (successive over relaxation);
V-Cycle: Comments (2) • e) For restriction, we take the mean value of the four neighbors as the result • f) For interpolation, we use the similar method as restriction: spreading the value into it’s four neighbors. restriction interpolation
FMG: The Algorithm Once we have the V-cycle, FMG would be rather easy to implement: for j = 0 to coarsest - 1 Grid[coarsest-j+1].v <- Grid[coarsest-j+1].v + interpolate_fine(Grid[coarsest-j].v); Grid[coarsest-j+1].v <- V-cycle(Grid[coarsest-j+1].v, Grid[coarsest-j+1].f); endfor
FMG: Comments • a) Initialization for all the approximations and right-hand sides should be made before executing the FMG main loop; • b) interpolate_fine() stands for a higher order interpolator. In practice, we use the interpolation matrix:
Content • Introduction • Algorithm • Results & Performance • A Failing Example • Conclusion
Model Problem (1): Hidden Step • Fluid flows with a constant velocity through a channel with a hidden obstacle on one side. No-slip conditions are imposed at the upper and lower walls.
Simulation result (1) • The Hidden Step:
Model Problem (2): Karman Vortex • The flow in a channel can meet a tilted plate. At the left boundary, the fluid inflow has a constant velocity profile, while at the upper and lower boundaries no-slip conditions are imposed.
Simulation result (2) • Von Karman Vortex
Performance (1) Testing platform: P4 2.4GHz, 1GB Memory, SUSE Linux 9.3
Content • Introduction • Algorithm • Results & Performance • A Failing Example • Conclusion
A Failing Example • Throttle :
Content • Introduction • Algorithm • Results & Performance • A Failing Example • Conclusion
Conclusion • An Optimal (i.e., O(N)) Solver. • Highly Modular Program Structure • Advanced Debugging Technique
Reference • [1] Practical Course – Scientific Computing and Visualization Worksheet, Lehrstuhl für Informatik mit Schwerpunkt Wissenschaftliches Rechnen, TU-Muenchen, 2005. • [2] Krzysztof J. Fidkowski, A High-Order Discontinuous Galerkin Multigrid Solver for Aerodynamic Applications, Master Thesis in Aerospace Engineering at the MASSACHUSETTS INSTITUTE OF TECHNOLOGY • [3] S. McCormick, B. Briggs, and V. Henson, "A Multigrid Tutorial”, second edition, SIAM,Philadelphia, June 2000.