Does anyone have a MATLAB code example for a staggered grid (for 1D/2D problems)?

62 visualizaciones (últimos 30 días)
Sajani
Sajani el 26 de Sept. de 2025 a las 20:02
Comentada: Sajani el 1 de Oct. de 2025 a las 6:15
I’m working on solving the shallow water equations using a staggered grid in MATLAB, and I’m looking for example codes or guidance for a staggered grid. Specifically, I want to understand how to set up the grid (interfaces and centers), apply boundary/initial conditions. These are my equations,
  2 comentarios
Torsten
Torsten el 26 de Sept. de 2025 a las 20:26
Editada: Torsten el 26 de Sept. de 2025 a las 20:27
I know the use of staggered grids to compute velocity and pressure for the Navier-Stokes equations.
Why do you think this is necessary for the shallow water equations ?
I suggest working with CLAWPACK because the equations are quite difficult to handle numerically:
Sajani
Sajani el 26 de Sept. de 2025 a las 21:06
@Torsten Thank you for your response. I’m using the staggered grid because many references have applied it previously, and I’m trying to implement a simple version in MATLAB before moving to more advanced. If you have a MATLAB code for staggered grids applied to the Navier–Stokes equations, could you please share it? I’ll also check out CLAWPACK as you suggested.

Iniciar sesión para comentar.

Respuestas (1)

William Rose
William Rose el 28 de Sept. de 2025 a las 1:23
Here is a start, just to show how the grids set up in 2D:
dx=0.1; Lx=1;
dy=0.1; Ly=1;
[PX,PY]=meshgrid(0:dx:Lx,0:dy:Ly);
[UX,UY]=meshgrid(dx/2:dx:Lx-dx/2,0:dy:Ly);
[VX,VY]=meshgrid(0:dx:Lx,dy/2:dy:Ly-dy/2);
Display the grids
figure;
plot(PX(:),PY(:),'r.',UX(:),UY(:),'g.',VX(:),VY(:),'b.')
legend('Pressure','U','V'); xlabel('X'); ylabel('Y'); title('Staggered Grids')
For 3D, add a grid for W (z-component of velocity) which is offset by dz/2.
Depending on your boundary conditions, you might want the U and V grid opoints to lie exactly on both boundaries. For example, in a tank, U and V are zero at the edges, so place the U and V grid points on the tank edges, where the respective velocities must be zero. The boundary conditions will include: {U=0 at X=0 and at X=Lx}; {V=0 at Y=0 and at Y=Ly}. One way to make such a grid is shown below.
[UX,UY]=meshgrid(0:dx:Lx,dy/2:dy:Ly-dy/2);
[VX,VY]=meshgrid(dx/2:dx:Lx-dx/2,0:dy:Ly);
[PX,PY]=meshgrid(dx/2:dx:Lx-dx/2,dy/2:dy:Ly-dy/2);
Display the grids
figure;
plot(PX(:),PY(:),'r.',UX(:),UY(:),'g.',VX(:),VY(:),'b.')
legend('Pressure','U','V'); xlabel('X'); ylabel('Y'); title('Staggered Grids')
For the specific equations on the staggered grids, consult the journal articles to which you referred.
  11 comentarios
William Rose
William Rose el 1 de Oct. de 2025 a las 5:28
I am attaching a script that is based on yours, but with significant modifications to how Q and eta are updated on each pass. I have attempted to implement the equations you provided. It produces plots that look plausible. See comments in the code for details.
My initial condition is not quite like yours. My inital condition is that there is a rectangular pulse of high water that extends for the first 5 spatial grid points, at t=0.
I mostly used your constants, but I used smaller values than you for dx and for dt. I integrate to t=2000 s.
The script displays Q(x) and eta(x) at every time point, like a video. It takes about 90-100 seconds to display all 2000 frames, on my machine.
The update to Q at each time requires η. Since the Q and eta grids ar offset, I compute eta (for udating Q) at the Q grid points, by interpolation. This probably cancels out any advantage of using staggered grids.
The update to Q also requires dQ/dx. I compute dQ/dx by centered differences, to get a good estimate at each Q grid point.
If you set Cd=0.0 instead of Cd=0.0022, you will see undamped wave propagation.
Sajani
Sajani el 1 de Oct. de 2025 a las 6:15
Thanks for the feedback. You’re right, I’ll correct the mistakes you mentioned. The equations you provided can also be rearranged into conservative form as follows.
total depth: and velocity:
The friction term:

Iniciar sesión para comentar.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by