#include
#include
#include “datadef.h”
/* Given the boundary conditions defined by the flag matrix, update
* the u and v velocities. Also enforce the boundary conditions at the
* edges of the matrix.
*/
void apply_boundary_conditions(float **u, float **v, char **flag,
int imax, int jmax, float ui, float vi)
{
int i, j;
for (j=0; j<=jmax+1; j++) { /* Fluid freely flows in from the west */ u[0][j] = u[1][j]; v[0][j] = v[1][j]; /* Fluid freely flows out to the east */ u[imax][j] = u[imax-1][j]; v[imax+1][j] = v[imax][j]; } for (i=0; i<=imax+1; i++) { /* The vertical velocity approaches 0 at the north and south * boundaries, but fluid flows freely in the horizontal direction */ v[i][jmax] = 0.0; u[i][jmax+1] = u[i][jmax]; v[i][0] = 0.0; u[i][0] = u[i][1]; } /* Apply no-slip boundary conditions to cells that are adjacent to * internal obstacle cells. This forces the u and v velocity to * tend towards zero in these cells. */ for (i=1; i<=imax; i++) { for (j=1; j<=jmax; j++) { if (flag[i][j] & B_NSEW) { switch (flag[i][j]) { case B_N: v[i][j] = 0.0; u[i][j] = -u[i][j+1]; u[i-1][j] = -u[i-1][j+1]; break; case B_E: u[i][j] = 0.0; v[i][j] = -v[i+1][j]; v[i][j-1] = -v[i+1][j-1]; break; case B_S: v[i][j-1] = 0.0; u[i][j] = -u[i][j-1]; u[i-1][j] = -u[i-1][j-1]; break; case B_W: u[i-1][j] = 0.0; v[i][j] = -v[i-1][j]; v[i][j-1] = -v[i-1][j-1]; break; case B_NE: v[i][j] = 0.0; u[i][j] = 0.0; v[i][j-1] = -v[i+1][j-1]; u[i-1][j] = -u[i-1][j+1]; break; case B_SE: v[i][j-1] = 0.0; u[i][j] = 0.0; v[i][j] = -v[i+1][j]; u[i-1][j] = -u[i-1][j-1]; break; case B_SW: v[i][j-1] = 0.0; u[i-1][j] = 0.0; v[i][j] = -v[i-1][j]; u[i][j] = -u[i][j-1]; break; case B_NW: v[i][j] = 0.0; u[i-1][j] = 0.0; v[i][j-1] = -v[i-1][j-1]; u[i][j] = -u[i][j+1]; break; } } } } /* Finally, fix the horizontal velocity at the western edge to have * a continual flow of fluid into the simulation. */ v[0][0] = 2*vi-v[1][0]; for (j=1;j<=jmax;j++) { u[0][j] = ui; v[0][j] = 2*vi-v[1][j]; } }