61 const float Divider = 1.0f / (2.0f * pTotalElementCount);
64 #pragma omp parallel for schedule (static)
65 for (
size_t i = 0; i < pTotalElementCount; i++)
67 pMatrixData[i] = dt_rho0_sg[i] * (pMatrixData[i] * Divider);
84 const float Divider = 1.0f / (2.0f * pTotalElementCount) * dt_rho_0_sgx;
87 #pragma omp parallel for schedule (static)
88 for (
size_t i = 0; i < pTotalElementCount; i++)
90 pMatrixData[i] = pMatrixData[i] * Divider;
104 (
const float dt_rho_0_sgx,
110 const float Divider = 1.0f / (2.0f * pTotalElementCount) * dt_rho_0_sgx;
113 #pragma omp for schedule (static)
114 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
116 register size_t i = z * pDimensionSizes.Y * pDimensionSizes.X;
117 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
119 for (
size_t x = 0; x < pDimensionSizes.X; x++)
121 pMatrixData[i] = pMatrixData[i] * Divider * dxudxn_sgx[x];
138 (
const float dt_rho_0_sgy,
144 const float Divider = 1.0f / (2.0f * pTotalElementCount) * dt_rho_0_sgy;
147 #pragma omp for schedule (static)
148 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
150 register size_t i = z * pDimensionSizes.Y * pDimensionSizes.X;
151 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
153 const float dyudyn_sgy_data = dyudyn_sgy[y] * Divider;
154 for (
size_t x = 0; x < pDimensionSizes.X; x++)
156 pMatrixData[i] = pMatrixData[i] * dyudyn_sgy_data;
172 (
const float dt_rho_0_sgz,
178 const float Divider = 1.0f / (2.0f * pTotalElementCount) * dt_rho_0_sgz;
181 #pragma omp for schedule (static)
182 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
184 register size_t i = z * pDimensionSizes.Y * pDimensionSizes.X;
185 const float dzudzn_sgz_data = dzudzn_sgz[z] * Divider;
187 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
189 for (
size_t x = 0; x < pDimensionSizes.X; x++)
191 pMatrixData[i] = pMatrixData[i] * dzudzn_sgz_data;
213 const float Divider = 1.0f / pTotalElementCount;
215 #pragma omp for schedule (static)
216 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
218 register size_t i = z * p2DDataSliceSize;
219 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
221 for (
size_t x = 0; x < pDimensionSizes.X; x++)
223 register float pMatrixElement = pMatrixData[i];
226 const float FFT_p_el = Divider * FFT_p[i] * dt_rho0[i];
229 pMatrixElement *= pml[x];
232 pMatrixElement -= FFT_p_el;
235 pMatrixData[i] = pMatrixElement * pml[x];
255 const float Divider = dt_rho0 / pTotalElementCount;
257 #pragma omp for schedule (static)
258 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
260 register size_t i = z * p2DDataSliceSize;
261 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
263 for (
size_t x = 0; x < pDimensionSizes.X; x++)
265 register float pMatrixElement = pMatrixData[i];
268 const float FFT_p_el = Divider * FFT_p[i];
271 pMatrixElement *= pml[x];
274 pMatrixElement -= FFT_p_el;
277 pMatrixData[i] = pMatrixElement * pml[x];
300 const float Divider = dt_rho0 / pTotalElementCount;
302 #pragma omp for schedule (static)
303 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
305 register size_t i = z * p2DDataSliceSize;
306 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
308 for (
size_t x = 0; x < pDimensionSizes.X; x++)
310 register float pMatrixElement = pMatrixData[i];
313 const float FFT_p_el = (Divider * dxudxn_sgx[x]) * FFT_p[i];
316 pMatrixElement *= pml[x];
319 pMatrixElement -= FFT_p_el;
322 pMatrixData[i] = pMatrixElement * pml[x];
344 const float Divider = 1.0f / pTotalElementCount;
346 #pragma omp for schedule (static)
347 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
349 size_t i = z * p2DDataSliceSize;
350 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
352 const float pml_y = pml[y];
353 for (
size_t x = 0; x < pDimensionSizes.X; x++)
355 register float pMatrixElement = pMatrixData[i];
358 const float FFT_p_el = Divider * FFT_p[i] * dt_rho0[i];
361 pMatrixElement *= pml_y;
364 pMatrixElement -= FFT_p_el;
367 pMatrixData[i] = pMatrixElement * pml_y;
388 const float Divider = dt_rho0 / pTotalElementCount;
390 #pragma omp for schedule (static)
391 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
393 size_t i = z * p2DDataSliceSize;
394 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
396 const float pml_y = pml[y];
397 for (
size_t x = 0; x < pDimensionSizes.X; x++)
399 register float pMatrixElement = pMatrixData[i];
402 const float FFT_p_el = Divider * FFT_p[i];
405 pMatrixElement *= pml_y;
408 pMatrixElement -= FFT_p_el;
411 pMatrixData[i] = pMatrixElement * pml_y;
434 const float Divider = dt_rho0 / pTotalElementCount;
436 #pragma omp for schedule (static)
437 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
439 size_t i = z * p2DDataSliceSize;
440 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
442 const float pml_y = pml[y];
443 const float dyudyn_sgy_data = dyudyn_sgy[y];
444 for (
size_t x = 0; x < pDimensionSizes.X; x++)
446 register float pMatrixElement = pMatrixData[i];
449 const float FFT_p_el = (Divider * dyudyn_sgy_data) * FFT_p[i];
452 pMatrixElement *= pml_y;
455 pMatrixElement -= FFT_p_el;
458 pMatrixData[i] = pMatrixElement * pml_y;
480 const float Divider = 1.0f / pTotalElementCount;
482 #pragma omp for schedule (static)
483 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
485 size_t i = z * p2DDataSliceSize;
486 const float pml_z = pml[z];
487 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
489 for (
size_t x = 0; x < pDimensionSizes.X; x++)
491 register float pMatrixElement = pMatrixData[i];
494 const float FFT_p_el = Divider * FFT_p[i] * dt_rho0[i];
497 pMatrixElement *= pml_z;
500 pMatrixElement -= FFT_p_el;
503 pMatrixData[i] = pMatrixElement * pml_z;
524 const float Divider = dt_rho0 / pTotalElementCount;
526 #pragma omp for schedule (static)
527 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
529 size_t i = z* p2DDataSliceSize;
530 const float pml_z = pml[z];
531 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
533 for (
size_t x = 0; x < pDimensionSizes.X; x++)
535 register float pMatrixElement = pMatrixData[i];
538 const float FFT_p_el = Divider * FFT_p[i];
541 pMatrixElement *= pml_z;
544 pMatrixElement -= FFT_p_el;
548 pMatrixData[i] = pMatrixElement * pml_z;
571 const float Divider = dt_rho0 / pTotalElementCount;
573 #pragma omp for schedule (static)
574 for (
size_t z = 0; z < pDimensionSizes.Z; z++)
576 size_t i = z * p2DDataSliceSize;
577 const float pml_z = pml[z];
578 const float dzudzn_sgz_data = dzudzn_sgz[z];
580 for (
size_t y = 0; y < pDimensionSizes.Y; y++)
582 for (
size_t x = 0; x < pDimensionSizes.X; x++)
584 register float pMatrixElement = pMatrixData[i];
587 const float FFT_p_el = (Divider * dzudzn_sgz_data) * FFT_p[i];
590 pMatrixElement *= pml_z;
593 pMatrixElement -= FFT_p_el;
597 pMatrixData[i] = pMatrixElement * pml_z;
617 #pragma omp parallel for schedule (static) if (u_source_index.GetTotalElementCount() > 1e5)
620 pMatrixData[u_source_index[i]] += transducer_signal[delay_mask[i]];
641 const size_t t_index,
642 const size_t u_source_mode,
643 const size_t u_source_many)
645 size_t index2D = t_index;
646 if (u_source_many != 0)
651 if (u_source_mode == 0)
655 pMatrixData[u_source_index[i]] = u_source_input[index2D];
657 if (u_source_many != 0) index2D++;
661 if (u_source_mode == 1)
665 pMatrixData[u_source_index[i]] += u_source_input[index2D];
667 if (u_source_many != 0) index2D++;
void Compute_dt_rho_sg_mul_ifft_div_2(const TRealMatrix &dt_rho_0_sgx, TFFTWComplexMatrix &FFT)
Compute dt ./ rho0_sgx .* ifft (FFT).
void Compute_uz_sgz_normalize(const TRealMatrix &FFT_p, const TRealMatrix &dt_rho0, const TRealMatrix &pml)
Compute a new value for uz_sgz, default case.
void Compute_ux_sgx_normalize_scalar_nonuniform(const TRealMatrix &FFT_p, const float dt_rho0, const TRealMatrix &dxudxn_sgx, const TRealMatrix &pml)
Compute a new value of ux_sgx, scalar, non-uniform case.
void Compute_uy_sgy_normalize(const TRealMatrix &FFT_p, const TRealMatrix &dt_rho0, const TRealMatrix &pml)
Compute a new value of uy_sgy, default case.
The header file containing the particle velocity matrix.
void Add_u_source(const TRealMatrix &u_source_input, const TIndexMatrix &u_source_index, const size_t t_index, const size_t u_source_mode, const size_t u_source_many)
Add in velocity source terms.
void Compute_uz_sgz_normalize_scalar_uniform(const TRealMatrix &FFT_p, const float dt_rho0, const TRealMatrix &pml)
Compute a new value for uz_sgz, scalar, uniform case.
virtual size_t GetTotalElementCount() const
Get total element count of the matrix.
void AddTransducerSource(const TIndexMatrix &u_source_index, TIndexMatrix &delay_mask, const TRealMatrix &transducer_signal)
Add transducer data source to X component.
Class implementing 3D Real-To-Complex and Complex-To-Real transforms using FFTW interface.
void Compute_dt_rho_sg_mul_ifft_div_2_scalar_nonuniform_x(const float dt_rho_0_sgx, const TRealMatrix &dxudxn_sgx, TFFTWComplexMatrix &FFT)
Compute dt ./ rho0_sgx .* ifft (FFT), if rho0_sgx is scalar, non uniform grid, x component.
void Compute_FFT_3D_C2R(TRealMatrix &OutMatrix)
Compute 3D out-of-place Complex-to-Real FFT.
void Compute_uy_sgy_normalize_scalar_nonuniform(const TRealMatrix &FFT_p, const float dt_rho0, const TRealMatrix &dyudyn_sgy, const TRealMatrix &pml)
Compute a new value of uy_sgy, scalar, non-uniform case.
void Compute_uz_sgz_normalize_scalar_nonuniform(const TRealMatrix &FFT_p, const float dt_rho0, const TRealMatrix &dzudzn_sgz, const TRealMatrix &pml)
Compute a new value for uz_sgz, scalar, non-uniform case.
The class for real matrices.
The class for 64b unsigned integers (indices). It is used for sensor_mask_index or sensor_corners_mas...
void Compute_uy_sgy_normalize_scalar_uniform(const TRealMatrix &FFT_p, const float dt_rho0, const TRealMatrix &pml)
Compute a new value of uy_sgy, scalar, uniform case.
void Compute_dt_rho_sg_mul_ifft_div_2_scalar_nonuniform_z(const float dt_rho_0_sgz, const TRealMatrix &dzudzn_sgz, TFFTWComplexMatrix &FFT)
Compute dt./rho0_sgx .* ifft (FFT), if rho0_sgx is scalar, non uniform grid, z component.
void Compute_ux_sgx_normalize_scalar_uniform(const TRealMatrix &FFT_p, const float dt_rho0, const TRealMatrix &pml)
Compute a new value of ux_sgx, scalar, uniform case.
void Compute_dt_rho_sg_mul_ifft_div_2_scalar_nonuniform_y(const float dt_rho_0_sgy, const TRealMatrix &dyudyn_sgy, TFFTWComplexMatrix &FFT)
Compute dt./rho0_sgx .* ifft (FFT), if rho0_sgx is scalar, non uniform grid, y component.
void Compute_ux_sgx_normalize(const TRealMatrix &FFT_p, const TRealMatrix &dt_rho0, const TRealMatrix &pml)
Compute a new value of ux_sgx, default case.
The header file containing the class that implements 3D FFT using the FFTW interface.