CUDA Accelerated Heat Conduction

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

HeatCond

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

texture < float 2 , 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 ;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值