SHOW:
|
|
- or go back to the newest paste.
1 | /// <summary> | |
2 | /// Update the fluid. Part 3.2 in the paper. | |
3 | /// </summary> | |
4 | /// <param name="dt">delta time</param> | |
5 | /// <param name="dx">delta x. Distance between middles of grid-cells.</param> | |
6 | /// <param name="lowerLayersHeight">The total heights of the layers under this one. Basically this is the ground under the water.</param> | |
7 | public override void DoUpdate(float dt, float dx, float[][] lowerLayersHeight) { | |
8 | _fluidTimer.Start(); | |
9 | ||
10 | int x, y; | |
11 | float totalHeight, dhL, dhR, dhT, dhB; | |
12 | float dt_A_g_l = dt * _A * g / dx; //all constants for equation 2 | |
13 | float K; // scaling factor for the outflow flux | |
14 | float dV; | |
15 | ||
16 | for (x=1 ; x <= N ; x++ ) { | |
17 | for (y=1 ; y <= N ; y++ ) { | |
18 | // | |
19 | // 3.2.1 Outflow Flux Computation | |
20 | // -------------------------------------------------------------- | |
21 | totalHeight = lowerLayersHeight[x][y] + _height[x][y]; | |
22 | dhL = totalHeight - lowerLayersHeight[x-1][y] - _height[x-1][y]; //(3) | |
23 | dhR = totalHeight - lowerLayersHeight[x+1][y] - _height[x+1][y]; | |
24 | dhT = totalHeight - lowerLayersHeight[x][y+1] - _height[x][y+1]; | |
25 | dhB = totalHeight - lowerLayersHeight[x][y-1] - _height[x][y-1]; | |
26 | ||
27 | _tempFlux[x][y].left = Mathf.Max(0.0f, _flux[x][y].left + dt_A_g_l * dhL ); //(2) | |
28 | _tempFlux[x][y].right = Mathf.Max(0.0f, _flux[x][y].right + dt_A_g_l * dhR ); | |
29 | _tempFlux[x][y].top = Mathf.Max(0.0f, _flux[x][y].top + dt_A_g_l * dhT ); | |
30 | - | _tempFlux[x][y].bottom = Mathf.Max(0.0f, _flux[x][y].bottom + dt_A_g_l * dhB ); |
30 | + | _tempFlux[x][y].bottom = Mathf.Max(0.0f, _flux[x][y].bottom + dt_A_g_l * dhB ); |
31 | ||
32 | float totalFlux = _tempFlux[x][y].left + _tempFlux[x][y].right + _tempFlux[x][y].top + _tempFlux[x][y].bottom; | |
33 | if (totalFlux > 0) { | |
34 | K = Mathf.Min(1.0f, _height[x][y] * dx * dx / totalFlux / dt); //(4) | |
35 | ||
36 | _tempFlux[x][y].left = K * _tempFlux[x][y].left; //(5) | |
37 | _tempFlux[x][y].right = K * _tempFlux[x][y].right; | |
38 | _tempFlux[x][y].top = K * _tempFlux[x][y].top; | |
39 | _tempFlux[x][y].bottom = K * _tempFlux[x][y].bottom; | |
40 | } | |
41 | //swap temp and the real one after the for-loops | |
42 | ||
43 | // | |
44 | // 3.2.2 Water Surface and Velocity Field Update | |
45 | // ---------------------------------------------------------------------------------------- | |
46 | dV = dt * ( | |
47 | //sum in | |
48 | _tempFlux[x-1][y].right + _tempFlux[x][y-1].top + _tempFlux[x+1][y].left + _tempFlux[x][y+1].bottom | |
49 | //minus sum out | |
50 | - _tempFlux[x][y].right - _tempFlux[x][y].top - _tempFlux[x][y].left - _tempFlux[x][y].bottom | |
51 | ); //(6) | |
52 | _tempHeight[x][y] = _height[x][y] + dV / (dx*dx); //(7) | |
53 | //swap temp and the real one after the for-loops | |
54 | } | |
55 | } | |
56 | Helpers.Swap(ref _tempFlux, ref _flux); | |
57 | Helpers.Swap(ref _tempHeight, ref _height); | |
58 | ||
59 | _fluidTimer.Stop(); | |
60 | } |