5 3 解決二維拉普拉斯方程 heat 2d

2021-08-27 05:56:51 字數 3274 閱讀 9954

main.cpp

#include "interactions.h"

#include //載入合適的標頭檔案

#include #include "kernel.h"

#ifdef _win32

#define windows_lean_and_mean

#define nominmax

#include #endif // _win32

#include #else

#include #include #define iters_per_render 50 //雅克比迭代次數

gluint pbo = 0;

gluint tex = 0;

struct cudagraphicsresource *cuda_pbo_resource;

void render()//創造屬於自己的cuda/opengl互操作應用程式時,唯一需要改變的就是render函式

cudagraphicsunmapresources(1, &cuda_pbo_resource, 0);

char title[128];

sprintf(title, "temperature visualizer - iterations=%4d, " "t_s=%3.0f, t_a=%3.0f, t_g=%3.0f", iterationcount, bc.t_s, bc.t_a, bc.t_g);

glutsetwindowtitle(title);

}void drawtexture()

void display()//視窗中顯示的內容

void initglut(int *argc, char **argv)

void initpixelbuffer()//初始化畫素緩衝區

void exitfunc()

cudafree(d_temp);

}int main(int argc, char** argv)

kernel.h

#pragma once

#ifndef kernel_h

#define kernel_h

struct uchar4;//防止nvcc啟動c++編譯器產生錯誤,而宣告

typedef struct //包含了所有的邊界條件資訊(包括管道的座標和半徑)

bc;void kernellauncher(uchar4 *d_out, float *d_temp, int w, int h, bc bc);

void resettemperature(float *d_temp, int w, int h, bc bc);

#endif // !kernel_h

interactions.h

#pragma once

#ifndef interactions_h

#define interactions_h

#include "kernel.h"

#include #else

#define max(x,y) (((x)>(y))?(x):(y))

#define w 640

#define h 640

#define dt 1.f

float *d_temp = 0;

int iterationcount = 0;

bc bc = ;

void keyboard(unsigned char key, int x, int y)

void mouse(int button, int state, int x, int y)

void idle(void)

void printinstructions()

#endif // !interactions_h

kernel.cu

#include "kernel.h"

#define tx 32//執行緒數

#define ty 32

#define rad 1

int divup(int a, int b) //用來計算可以覆蓋乙個計算網格的特定大小執行緒塊的數量

//確保顏色值在【0,255】範圍內

__device__ unsigned char clip(int n)

//避免超出範圍的取樣值。idxclip(i,n)返回乙個在[0,n-1]區間內的int型別值(例如乙個長度為n的陣列的合法索引)。

__device__ int idxclip(int idx, int idxmax)

__device__ int flatten(int col, int row, int width, int height)

__global__ void resetkernel(float *d_temp, int w, int h, bc bc)

//給所有點賦初始顏色黑色(完全不透明),然後將一塊(包括必要的重疊單元)已經存在的溫度值載入到共享記憶體中。

__global__ void tempkernel(uchar4 *d_out, float *d_temp, int w, int h, bc bc)

if (row == h - 1)

__syncthreads();

float temp = 0.25f*(s_in[flatten(s_col - 1, s_row, s_w, s_h)] +

s_in[flatten(s_col + 1, s_row, s_w, s_h)] +

s_in[flatten(s_col, s_row - 1, s_w, s_h)] +

s_in[flatten(s_col, s_row + 1, s_w, s_h)]);

d_temp[idx] = temp;

const unsigned char intensity = clip((int)temp);

d_out[idx].x = intensity;

d_out[idx].z = 255 - intensity;

}void kernellauncher(uchar4 *d_out, float *d_temp, int w, int h, bc bc)

void resettemperature(float *d_temp, int w, int h, bc bc)

執行結果如下:

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...

二維陣列與二維指標

一.指標與二維陣列 以martix 3 4 為例 1.二維陣列的本質 int martix 3 4 int martix 3 4 int 4 martix 3 令int 4 為type,type martix 3 為含有三個元素的陣列,每乙個元素型別為int 4 int 4 是乙個擁有4個int型別...