コード例 #1
0
ファイル: fluid.cpp プロジェクト: wenderen/btp
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
}
コード例 #2
0
ファイル: main.c プロジェクト: wolfviking0/webcl-translator
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 ();



}