|
15 | 15 | // forward_3D_variable_density
|
16 | 16 | double forward(f_type *grid, f_type *velocity, f_type *density, f_type *damp,
|
17 | 17 | f_type *wavelet, size_t wavelet_size,
|
18 |
| - f_type *coeff, size_t *boundary_conditions, |
| 18 | + f_type *coeff_order2, f_type *coeff_order1, size_t *boundary_conditions, |
19 | 19 | size_t *src_points_interval, size_t src_points_interval_size,
|
20 | 20 | f_type *src_points_values, size_t src_points_values_size,
|
21 | 21 | size_t *rec_points_interval, size_t rec_points_interval_size,
|
@@ -101,28 +101,56 @@ double forward(f_type *grid, f_type *velocity, f_type *density, f_type *damp,
|
101 | 101 | // index of the current point in the grid
|
102 | 102 | size_t current = (i * nx + j) * ny + k;
|
103 | 103 |
|
104 |
| - //neighbors in the Y direction |
105 |
| - f_type y1 = ((prev_snapshot[current + 1] - prev_snapshot[current]) * (density[current + 1] + density[current])) / density[current + 1]; |
106 |
| - f_type y2 = ((prev_snapshot[current] - prev_snapshot[current - 1]) * (density[current] + density[current - 1])) / density[current - 1]; |
107 |
| - f_type term_y = (y1 - y2) / (2 * dySquared); |
| 104 | + // stencil code to update grid |
| 105 | + f_type value = 0.0; |
108 | 106 |
|
109 |
| - //neighbors in the X direction |
110 |
| - f_type x1 = ((prev_snapshot[current + ny] - prev_snapshot[current]) * (density[current + ny] + density[current])) / density[current + ny]; |
111 |
| - f_type x2 = ((prev_snapshot[current] - prev_snapshot[current - ny]) * (density[current] + density[current - ny])) / density[current - ny]; |
112 |
| - f_type term_x = (x1 - x2) / (2 * dxSquared); |
| 107 | + // second derivative for pressure |
| 108 | + f_type sd_pressure_y = coeff_order2[0] * prev_snapshot[current]; |
| 109 | + f_type sd_pressure_x = coeff_order2[0] * prev_snapshot[current]; |
| 110 | + f_type sd_pressure_z = coeff_order2[0] * prev_snapshot[current]; |
113 | 111 |
|
114 |
| - //neighbors in the Z direction |
115 |
| - f_type z1 = ((prev_snapshot[current + (nx * ny)] - prev_snapshot[current]) * (density[current + (nx * ny)] + density[current])) / density[current + (nx * ny)]; |
116 |
| - f_type z2 = ((prev_snapshot[current] - prev_snapshot[current - (nx * ny)]) * (density[current] + density[current - (nx * ny)])) / density[current - (nx * ny)]; |
117 |
| - f_type term_z = (z1 - z2) / (2 * dzSquared); |
| 112 | + // first derivative for pressure |
| 113 | + f_type fd_pressure_y = 0.0; |
| 114 | + f_type fd_pressure_x = 0.0; |
| 115 | + f_type fd_pressure_z = 0.0; |
118 | 116 |
|
119 |
| - //nominator with damp coefficient |
| 117 | + // first derivative for density |
| 118 | + f_type fd_density_y = 0.0; |
| 119 | + f_type fd_density_x = 0.0; |
| 120 | + f_type fd_density_z = 0.0; |
| 121 | + |
| 122 | + // radius of the stencil |
| 123 | + for(int ir = 1; ir <= stencil_radius; ir++){ |
| 124 | + //neighbors in the Y direction |
| 125 | + sd_pressure_y += coeff_order2[ir] * (prev_snapshot[current + ir] + prev_snapshot[current - ir]); |
| 126 | + fd_pressure_y += coeff_order1[ir] * (prev_snapshot[current + ir] - prev_snapshot[current - ir]); |
| 127 | + fd_density_y += coeff_order1[ir] * (density[current + ir] - density[current - ir]); |
| 128 | + |
| 129 | + //neighbors in the X direction |
| 130 | + sd_pressure_x += coeff_order2[ir] * (prev_snapshot[current + (ir * ny)] + prev_snapshot[current - (ir * ny)]); |
| 131 | + fd_pressure_x += coeff_order1[ir] * (prev_snapshot[current + (ir * nx)] - prev_snapshot[current - (ir * nx)]); |
| 132 | + fd_density_x += coeff_order1[ir] * (density[current + (ir * nx)] - density[current - (ir * nx)]); |
| 133 | + |
| 134 | + //neighbors in the Z direction |
| 135 | + sd_pressure_z += coeff_order2[ir] * (prev_snapshot[current + (ir * nx * ny)] + prev_snapshot[current - (ir * nx * ny)]); |
| 136 | + fd_pressure_z += coeff_order1[ir] * (prev_snapshot[current + (ir * nx * ny)] - prev_snapshot[current - (ir * nx * ny)]); |
| 137 | + fd_density_z += coeff_order1[ir] * (density[current + (ir * nx * ny)] - density[current - (ir * nx * ny)]); |
| 138 | + } |
| 139 | + |
| 140 | + value += sd_pressure_y/dySquared + sd_pressure_x/dxSquared + sd_pressure_z/dzSquared; |
| 141 | + |
| 142 | + f_type term_y = (fd_pressure_y * fd_density_y) / (2 * dySquared); |
| 143 | + f_type term_x = (fd_pressure_x * fd_density_x) / (2 * dxSquared); |
| 144 | + f_type term_z = (fd_pressure_z * fd_density_z) / (2 * dzSquared); |
| 145 | + |
| 146 | + value -= (term_y + term_x + term_z) / density[current]; |
| 147 | + |
| 148 | + //denominator with damp coefficient |
120 | 149 | f_type denominator = (1.0 + damp[current] * dt);
|
121 | 150 |
|
122 |
| - f_type value = dtSquared * velocity[current] * velocity[current] * (term_z + term_x + term_y) / denominator; |
| 151 | + value *= (dtSquared * velocity[current] * velocity[current]) / denominator; |
123 | 152 |
|
124 | 153 | next_snapshot[current] = 2.0 / denominator * prev_snapshot[current] - ((1.0 - damp[current] * dt) / denominator) * next_snapshot[current] + value;
|
125 |
| - |
126 | 154 | }
|
127 | 155 | }
|
128 | 156 | }
|
|
0 commit comments