zoukankan      html  css  js  c++  java
  • CUDA Accelerated Heat Conduction

    做这个小程序最初的动机是,为了解决Blobby生成的空间函数系统不连续的问题。详细的推导过程可以结合Lipschitz条件进行。根据推测,AfterBurn应该是没有解决这个问题,当局部地区粒子数目很低的时候。这个问题还可以归结为是CurvatureFlow的问题,在这里就不多说了。假设我们需要散射2D空间内的一个标量场,那么非常直接的就是用数值法求解PDE(ODE),无论是Forward Euler还是RK等等都可以做。下面是散射一个标量场计算的结果,dt = 0.001,

    HeatCond

    测试表明这种需要大量迭代的计算过程可以方便的映射到GPU上去进行计算,由于显存带宽要比系统总线带宽大的多,所以复制状态就会非常的高效率。经过散射后的场将逐渐的填补不连续的地方,当然当迭代次数大到一定程度后就没什么意义了,所以迭代次数是由制作人员控制的,我就没必要插手了。这里是CUDA的核心代码和部分执行代码,其实就是一个简单的中心差分与前向欧拉法罢了。

    texture<float2, cudaReadModeElementType> Tex2DRef;

    __global__ 
    void HeatCond2D(float* Data, unsigned int Width, unsigned int Height)
    {
        
    int BlockSize = blockDim.x*blockDim.y;
        
    int GridOffset = blockIdx.x*BlockSize;
        
    int Idx = ( threadIdx.y*blockDim.x + threadIdx.x ) + GridOffset;

        
    //float2 ST = make_float2( float()+0.5, float()+0.5 );
        float X = Idx % Width;
        
    float Y = ( Idx - X ) / Width;

        
    //Four corners
        float2 CoordC = make_float2(X+0.5, Y+0.5);

        
    float C = tex2D( Tex2DRef, CoordC.x, CoordC.y );
        
    float L = tex2D( Tex2DRef, CoordC.x - 1.0, CoordC.y );
        
    float R = tex2D( Tex2DRef, CoordC.x + 1.0, CoordC.y );
        
    float U = tex2D( Tex2DRef, CoordC.x, CoordC.y + 1.0 );
        
    float D = tex2D( Tex2DRef, CoordC.x, CoordC.y - 1.0 );
        
        
    float Laplacian = -4.0*+ L + R + U + D;

        Data[Idx] 
    = C + Laplacian*0.01;
    }
  • 相关阅读:
    五大Java开源论坛
    mysql limit,offset 区别
    查询某个字段存在于哪几个表
    C++分享笔记:5X5单词字谜游戏设计
    Linux分享笔记:系统状态检测命令小结
    Linux分享笔记:查看帮助命令 & 常用系统工作命令
    数据结构(C语言)分享笔记:数据结构的逻辑层次、存储层次
    Linux分享笔记:shell终端的介绍
    Java开发学生管理系统
    JAVA使用JDBC连接,修改MySQL数据库(比较乱)
  • 原文地址:https://www.cnblogs.com/Jedimaster/p/1461378.html
Copyright © 2011-2022 走看看