Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/ocean.c
| Show First 20 Lines • Show All 447 Lines • ▼ Show 20 Lines | for (j = 0; j <= o->_N / 2; j++) { | ||||
| mul_complex_c(exp_param1, o->_h0[i * o->_N + j], exp_param1); | mul_complex_c(exp_param1, o->_h0[i * o->_N + j], exp_param1); | ||||
| mul_complex_c(exp_param2, conj_param, exp_param2); | mul_complex_c(exp_param2, conj_param, exp_param2); | ||||
| add_comlex_c(o->_htilda[i * (1 + o->_N / 2) + j], exp_param1, exp_param2); | add_comlex_c(o->_htilda[i * (1 + o->_N / 2) + j], exp_param1, exp_param2); | ||||
| mul_complex_f(o->_fft_in[i * (1 + o->_N / 2) + j], o->_htilda[i * (1 + o->_N / 2) + j], scale); | mul_complex_f(o->_fft_in[i * (1 + o->_N / 2) + j], o->_htilda[i * (1 + o->_N / 2) + j], scale); | ||||
| } | } | ||||
| } | } | ||||
| static void ocean_compute_displacement_y(TaskPool *__restrict pool, | static void ocean_compute_displacement_y(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| void *UNUSED(taskdata), | |||||
| int UNUSED(threadid)) | |||||
| { | { | ||||
| OceanSimulateData *osd = BLI_task_pool_user_data(pool); | OceanSimulateData *osd = BLI_task_pool_user_data(pool); | ||||
| const Ocean *o = osd->o; | const Ocean *o = osd->o; | ||||
| fftw_execute(o->_disp_y_plan); | fftw_execute(o->_disp_y_plan); | ||||
| } | } | ||||
| static void ocean_compute_displacement_x(TaskPool *__restrict pool, | static void ocean_compute_displacement_x(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| void *UNUSED(taskdata), | |||||
| int UNUSED(threadid)) | |||||
| { | { | ||||
| OceanSimulateData *osd = BLI_task_pool_user_data(pool); | OceanSimulateData *osd = BLI_task_pool_user_data(pool); | ||||
| const Ocean *o = osd->o; | const Ocean *o = osd->o; | ||||
| const float scale = osd->scale; | const float scale = osd->scale; | ||||
| const float chop_amount = osd->chop_amount; | const float chop_amount = osd->chop_amount; | ||||
| int i, j; | int i, j; | ||||
| for (i = 0; i < o->_M; i++) { | for (i = 0; i < o->_M; i++) { | ||||
| Show All 12 Lines | for (j = 0; j <= o->_N / 2; j++) { | ||||
| 0.0f : | 0.0f : | ||||
| o->_kx[i] / o->_k[i * (1 + o->_N / 2) + j])); | o->_kx[i] / o->_k[i * (1 + o->_N / 2) + j])); | ||||
| init_complex(o->_fft_in_x[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | init_complex(o->_fft_in_x[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | ||||
| } | } | ||||
| } | } | ||||
| fftw_execute(o->_disp_x_plan); | fftw_execute(o->_disp_x_plan); | ||||
| } | } | ||||
| static void ocean_compute_displacement_z(TaskPool *__restrict pool, | static void ocean_compute_displacement_z(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| void *UNUSED(taskdata), | |||||
| int UNUSED(threadid)) | |||||
| { | { | ||||
| OceanSimulateData *osd = BLI_task_pool_user_data(pool); | OceanSimulateData *osd = BLI_task_pool_user_data(pool); | ||||
| const Ocean *o = osd->o; | const Ocean *o = osd->o; | ||||
| const float scale = osd->scale; | const float scale = osd->scale; | ||||
| const float chop_amount = osd->chop_amount; | const float chop_amount = osd->chop_amount; | ||||
| int i, j; | int i, j; | ||||
| for (i = 0; i < o->_M; i++) { | for (i = 0; i < o->_M; i++) { | ||||
| Show All 12 Lines | for (j = 0; j <= o->_N / 2; j++) { | ||||
| 0.0f : | 0.0f : | ||||
| o->_kz[j] / o->_k[i * (1 + o->_N / 2) + j])); | o->_kz[j] / o->_k[i * (1 + o->_N / 2) + j])); | ||||
| init_complex(o->_fft_in_z[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | init_complex(o->_fft_in_z[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | ||||
| } | } | ||||
| } | } | ||||
| fftw_execute(o->_disp_z_plan); | fftw_execute(o->_disp_z_plan); | ||||
| } | } | ||||
| static void ocean_compute_jacobian_jxx(TaskPool *__restrict pool, | static void ocean_compute_jacobian_jxx(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| void *UNUSED(taskdata), | |||||
| int UNUSED(threadid)) | |||||
| { | { | ||||
| OceanSimulateData *osd = BLI_task_pool_user_data(pool); | OceanSimulateData *osd = BLI_task_pool_user_data(pool); | ||||
| const Ocean *o = osd->o; | const Ocean *o = osd->o; | ||||
| const float chop_amount = osd->chop_amount; | const float chop_amount = osd->chop_amount; | ||||
| int i, j; | int i, j; | ||||
| for (i = 0; i < o->_M; i++) { | for (i = 0; i < o->_M; i++) { | ||||
| for (j = 0; j <= o->_N / 2; j++) { | for (j = 0; j <= o->_N / 2; j++) { | ||||
| Show All 16 Lines | static void ocean_compute_jacobian_jxx(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| for (i = 0; i < o->_M; i++) { | for (i = 0; i < o->_M; i++) { | ||||
| for (j = 0; j < o->_N; j++) { | for (j = 0; j < o->_N; j++) { | ||||
| o->_Jxx[i * o->_N + j] += 1.0; | o->_Jxx[i * o->_N + j] += 1.0; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void ocean_compute_jacobian_jzz(TaskPool *__restrict pool, | static void ocean_compute_jacobian_jzz(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| void *UNUSED(taskdata), | |||||
| int UNUSED(threadid)) | |||||
| { | { | ||||
| OceanSimulateData *osd = BLI_task_pool_user_data(pool); | OceanSimulateData *osd = BLI_task_pool_user_data(pool); | ||||
| const Ocean *o = osd->o; | const Ocean *o = osd->o; | ||||
| const float chop_amount = osd->chop_amount; | const float chop_amount = osd->chop_amount; | ||||
| int i, j; | int i, j; | ||||
| for (i = 0; i < o->_M; i++) { | for (i = 0; i < o->_M; i++) { | ||||
| for (j = 0; j <= o->_N / 2; j++) { | for (j = 0; j <= o->_N / 2; j++) { | ||||
| Show All 16 Lines | static void ocean_compute_jacobian_jzz(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| for (i = 0; i < o->_M; i++) { | for (i = 0; i < o->_M; i++) { | ||||
| for (j = 0; j < o->_N; j++) { | for (j = 0; j < o->_N; j++) { | ||||
| o->_Jzz[i * o->_N + j] += 1.0; | o->_Jzz[i * o->_N + j] += 1.0; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void ocean_compute_jacobian_jxz(TaskPool *__restrict pool, | static void ocean_compute_jacobian_jxz(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| void *UNUSED(taskdata), | |||||
| int UNUSED(threadid)) | |||||
| { | { | ||||
| OceanSimulateData *osd = BLI_task_pool_user_data(pool); | OceanSimulateData *osd = BLI_task_pool_user_data(pool); | ||||
| const Ocean *o = osd->o; | const Ocean *o = osd->o; | ||||
| const float chop_amount = osd->chop_amount; | const float chop_amount = osd->chop_amount; | ||||
| int i, j; | int i, j; | ||||
| for (i = 0; i < o->_M; i++) { | for (i = 0; i < o->_M; i++) { | ||||
| for (j = 0; j <= o->_N / 2; j++) { | for (j = 0; j <= o->_N / 2; j++) { | ||||
| Show All 10 Lines | for (j = 0; j <= o->_N / 2; j++) { | ||||
| 0.0f : | 0.0f : | ||||
| o->_kx[i] * o->_kz[j] / o->_k[i * (1 + o->_N / 2) + j])); | o->_kx[i] * o->_kz[j] / o->_k[i * (1 + o->_N / 2) + j])); | ||||
| init_complex(o->_fft_in_jxz[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | init_complex(o->_fft_in_jxz[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | ||||
| } | } | ||||
| } | } | ||||
| fftw_execute(o->_Jxz_plan); | fftw_execute(o->_Jxz_plan); | ||||
| } | } | ||||
| static void ocean_compute_normal_x(TaskPool *__restrict pool, | static void ocean_compute_normal_x(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| void *UNUSED(taskdata), | |||||
| int UNUSED(threadid)) | |||||
| { | { | ||||
| OceanSimulateData *osd = BLI_task_pool_user_data(pool); | OceanSimulateData *osd = BLI_task_pool_user_data(pool); | ||||
| const Ocean *o = osd->o; | const Ocean *o = osd->o; | ||||
| int i, j; | int i, j; | ||||
| for (i = 0; i < o->_M; i++) { | for (i = 0; i < o->_M; i++) { | ||||
| for (j = 0; j <= o->_N / 2; j++) { | for (j = 0; j <= o->_N / 2; j++) { | ||||
| fftw_complex mul_param; | fftw_complex mul_param; | ||||
| init_complex(mul_param, 0.0, -1.0); | init_complex(mul_param, 0.0, -1.0); | ||||
| mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]); | mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]); | ||||
| mul_complex_f(mul_param, mul_param, o->_kx[i]); | mul_complex_f(mul_param, mul_param, o->_kx[i]); | ||||
| init_complex(o->_fft_in_nx[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | init_complex(o->_fft_in_nx[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | ||||
| } | } | ||||
| } | } | ||||
| fftw_execute(o->_N_x_plan); | fftw_execute(o->_N_x_plan); | ||||
| } | } | ||||
| static void ocean_compute_normal_z(TaskPool *__restrict pool, | static void ocean_compute_normal_z(TaskPool *__restrict pool, void *UNUSED(taskdata)) | ||||
| void *UNUSED(taskdata), | |||||
| int UNUSED(threadid)) | |||||
| { | { | ||||
| OceanSimulateData *osd = BLI_task_pool_user_data(pool); | OceanSimulateData *osd = BLI_task_pool_user_data(pool); | ||||
| const Ocean *o = osd->o; | const Ocean *o = osd->o; | ||||
| int i, j; | int i, j; | ||||
| for (i = 0; i < o->_M; i++) { | for (i = 0; i < o->_M; i++) { | ||||
| for (j = 0; j <= o->_N / 2; j++) { | for (j = 0; j <= o->_N / 2; j++) { | ||||
| fftw_complex mul_param; | fftw_complex mul_param; | ||||
| init_complex(mul_param, 0.0, -1.0); | init_complex(mul_param, 0.0, -1.0); | ||||
| mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]); | mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]); | ||||
| mul_complex_f(mul_param, mul_param, o->_kz[i]); | mul_complex_f(mul_param, mul_param, o->_kz[i]); | ||||
| init_complex(o->_fft_in_nz[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | init_complex(o->_fft_in_nz[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param)); | ||||
| } | } | ||||
| } | } | ||||
| fftw_execute(o->_N_z_plan); | fftw_execute(o->_N_z_plan); | ||||
| } | } | ||||
| void BKE_ocean_simulate(struct Ocean *o, float t, float scale, float chop_amount) | void BKE_ocean_simulate(struct Ocean *o, float t, float scale, float chop_amount) | ||||
| { | { | ||||
| TaskScheduler *scheduler = BLI_task_scheduler_get(); | |||||
| TaskPool *pool; | TaskPool *pool; | ||||
| OceanSimulateData osd; | OceanSimulateData osd; | ||||
| scale *= o->normalize_factor; | scale *= o->normalize_factor; | ||||
| osd.o = o; | osd.o = o; | ||||
| osd.t = t; | osd.t = t; | ||||
| osd.scale = scale; | osd.scale = scale; | ||||
| osd.chop_amount = chop_amount; | osd.chop_amount = chop_amount; | ||||
| pool = BLI_task_pool_create(scheduler, &osd, TASK_PRIORITY_HIGH); | pool = BLI_task_pool_create(&osd, TASK_PRIORITY_HIGH); | ||||
| BLI_rw_mutex_lock(&o->oceanmutex, THREAD_LOCK_WRITE); | BLI_rw_mutex_lock(&o->oceanmutex, THREAD_LOCK_WRITE); | ||||
| /* Note about multi-threading here: we have to run a first set of computations (htilda one) | /* Note about multi-threading here: we have to run a first set of computations (htilda one) | ||||
| * before we can run all others, since they all depend on it. | * before we can run all others, since they all depend on it. | ||||
| * So we make a first parallelized forloop run for htilda, | * So we make a first parallelized forloop run for htilda, | ||||
| * and then pack all other computations into a set of parallel tasks. | * and then pack all other computations into a set of parallel tasks. | ||||
| * This is not optimal in all cases, | * This is not optimal in all cases, | ||||
| ▲ Show 20 Lines • Show All 947 Lines • Show Last 20 Lines | |||||