void Fluid::vel_step(float dt) { add_source(su, u, dt); add_source(sv, v, dt); add_source(sw, w, dt); add_buoyancy(dt); vorticity_confinement(dt); #ifdef DIFFUSE SWAPFPTR(u0, u); SWAPFPTR(v0, v); SWAPFPTR(w0, w); diffuse(1, u0, u, viscosity, dt); diffuse(2, v0, v, viscosity, dt); diffuse(3, w0, w, viscosity, dt); project(); #endif #ifdef ADVECT SWAPFPTR(u0, u); SWAPFPTR(v0, v); SWAPFPTR(w0, w); advect(1, u0, u, u0, v0, w0, dt); advect(2, v0, v, u0, v0, w0, dt); advect(3, w0, w, u0, v0, w0, dt); project(); #endif }
static void idle_func ( void ) { //if(step) { get_from_UI ( g_dens_prev, g_u_prev, g_v_prev, g_heat,g_compressibility); //blur(g_u_prev,g_v_prev,g_w_prev, dt); #if USE_OPENCL transfer_buffers_to_gpu(); run_cl_advect_velocity(&clData, dt); flush_cl_queue(); run_cl_calculate_divergence(&clData, dt); run_cl_zero_pressure(&clData); if(useCG) { transfer_cl_float_buffer_from_device(&clData,clData.buf_pressure,g_pressure,clData.n,true); transfer_cl_float_buffer_from_device(&clData,clData.buf_divergence,g_divergence,clData.n,true); run_cl_cg_no_mtx(&clData,g_pressure, g_divergence, g_cg_r, g_cg_d, g_cg_q, clData.n, 10, 0.0001f); flush_cl_queue(); transfer_cl_float_buffer_to_device(&clData,clData.buf_pressure,g_pressure,clData.n,true); }else{ //This has to run the whole kernel and iterate at the cpu because // opencl only can sync at the workgroup level when we need // global synchronization for(int i = 0; i < 20; ++i) { run_cl_pressure_solve(&clData, dt); } } run_cl_pressure_apply(&clData, dt); flush_cl_queue(); run_cl_advect_density(&clData, dt); if(vorticity){ run_cl_vorticity_confinement(&clData, dt,0.5f); } transfer_buffers_to_cpu(); #else if(maccormack){ advect_velocity_maccormack(dt, g_u, g_v, g_w, g_u_prev, g_v_prev, g_w_prev); } else { //advect_velocity_forward_euler(dt, g_u, g_v, g_w, g_u_prev, g_v_prev, g_w_prev); advect_velocity_RK2(dt, g_u, g_v, g_w, g_u_prev, g_v_prev, g_w_prev); } //project(dt,g_u,g_v, g_w, g_divergence, g_pressure, g_pressure_prev); project(dt,g_u,g_v, g_w, g_divergence, g_pressure, g_pressure_prev, g_laplacian_matrix,g_cg_r, g_cg_d, g_cg_q,useCG); advectRK2(dt,g_dens,g_dens_prev, g_u, g_v, g_w); if(vorticity) { vorticity_confinement(dt, g_u, g_v, g_w, g_u_prev, g_v_prev, g_w_prev); } #endif SWAP(g_u,g_u_prev); SWAP(g_v,g_v_prev); SWAP(g_dens, g_dens_prev); //copy_grid(g_u,g_u_prev); //copy_grid(g_v,g_v_prev); //copy_grid(g_dens, g_dens_prev); step = 0; } //#ifndef __EMSCRIPTEN__ // glutSetWindow ( win_id ); //#endif glutPostRedisplay (); }