Ajout du TP HeatTransfert.
[GPU.git] / WCudaMSE / Student_Cuda_Image / src / cpp / core / 05_HeatTransfert / moo / host / HeatTransfert.cu
1 #include "HeatTransfert.h"\r
2 \r
3 #include <iostream>\r
4 #include <cstring>\r
5 #include <assert.h>\r
6 #include <stdio.h>\r
7 using namespace std;\r
8 \r
9 #include "Device.h"\r
10 \r
11 #include "HeatTransfertDevice.h"\r
12 \r
13 HeatTransfert::HeatTransfert() :\r
14       calibreur(IntervalF(0, 1), IntervalF(0.7, 0)),\r
15       devImageHeaters(800, 800),\r
16       devImageA(800, 800),\r
17       devImageB(800, 800),\r
18       t(0),\r
19       dg(8, 8, 1),\r
20       db(32, 32, 1),\r
21       title("Heat transfert")\r
22     {\r
23     const size_t IMAGE_SIZE = this->devImageA.getW() * this->devImageA.getH() * sizeof(float);\r
24     const int IMAGE_W = this->devImageA.getW();\r
25     const int IMAGE_H = this->devImageA.getH();\r
26 \r
27     // Définition des heaters.\r
28     HeatImage imageHeaters(IMAGE_W, IMAGE_H, new float[IMAGE_W * IMAGE_H]);\r
29     imageHeaters.clear();\r
30     setHeaters(imageHeaters);\r
31 \r
32     // Définition des températures initiales (toutes à zero).\r
33     HeatImage imageInit(IMAGE_W, IMAGE_H, new float[IMAGE_W * IMAGE_H]);\r
34     imageInit.clear();\r
35 \r
36     // Copie des heaters en GM.\r
37     HANDLE_ERROR(cudaMalloc(&this->devImageHeaters.getRaw(), IMAGE_SIZE));\r
38     HANDLE_ERROR(cudaMemcpy(this->devImageHeaters.getRaw(), imageHeaters.getRaw(), IMAGE_SIZE, cudaMemcpyHostToDevice));\r
39 \r
40     // Allocation de image A et image B.\r
41     HANDLE_ERROR(cudaMalloc(&this->devImageA.getRaw(), IMAGE_SIZE));\r
42     HANDLE_ERROR(cudaMemcpy(this->devImageA.getRaw(), imageInit.getRaw(), IMAGE_SIZE, cudaMemcpyHostToDevice));\r
43     HANDLE_ERROR(cudaMalloc(&this->devImageB.getRaw(), IMAGE_SIZE));\r
44     HANDLE_ERROR(cudaMemcpy(this->devImageB.getRaw(), imageInit.getRaw(), IMAGE_SIZE, cudaMemcpyHostToDevice));\r
45     }\r
46 \r
47 HeatTransfert::~HeatTransfert()\r
48     {\r
49     cudaFree(this->devImageHeaters.getRaw());\r
50     cudaFree(this->devImageA.getRaw());\r
51     cudaFree(this->devImageB.getRaw());\r
52     }\r
53 \r
54 void HeatTransfert::runGPU(uchar4* ptrDevPixels)\r
55     {\r
56     for (int i = 0; i < NB_ITERATION_AVEUGLE; i++)\r
57         {\r
58         copyHeaters<<<dg, db>>>(this->devImageHeaters, this->devImageA); // Copie les heaters dans l'image A.\r
59         diffuseMethode1<<<dg, db>>>(this->devImageA, this->devImageB); // Diffuse l'image A dans l'image B.\r
60         this->devImageA.swapWith(this->devImageB); // Swap l'image A et l'image B.\r
61         }\r
62 \r
63     display<<<dg, db>>>(this->devImageA, ptrDevPixels, this->calibreur); // Affiche l'image A (pour avoir les heaters intacts   ).\r
64 \r
65     //HANDLE_ERROR(cudaDeviceSynchronize()); // Pour flusher les 'printf' (pour le DEBUG).\r
66     }\r
67 \r
68 void HeatTransfert::animationStep()\r
69     {\r
70     this->t += NB_ITERATION_AVEUGLE;\r
71     }\r
72 \r
73 int HeatTransfert::getW()\r
74     {\r
75     return this->devImageA.getW();\r
76     }\r
77 \r
78 int HeatTransfert::getH()\r
79     {\r
80     return this->devImageA.getH();\r
81     }\r
82 \r
83 float HeatTransfert::getT()\r
84     {\r
85     return float(this->t);\r
86     }\r
87 \r
88 string HeatTransfert::getTitle()\r
89     {\r
90     return this->title;\r
91     }\r
92 \r
93 void HeatTransfert::setHeaters(HeatImage& image)\r
94     {\r
95     for (int x = 179; x <= 195; x++)\r
96         {\r
97         for (int y = 179; y <= 195; y++)\r
98             image.set(x, y, 0.2);\r
99         for (int y = 605; y <= 621; y++)\r
100             image.set(x, y, 0.2);\r
101         }\r
102 \r
103     for (int x = 605; x <= 621; x++)\r
104         {\r
105         for (int y = 179; y <= 195; y++)\r
106             image.set(x, y, 0.2);\r
107         for (int y = 605; y <= 621; y++)\r
108             image.set(x, y, 0.2);\r
109         }\r
110 \r
111     image.set(295, 400, 0.2);\r
112     image.set(400, 295, 0.2);\r
113     image.set(505, 400, 0.2);\r
114     image.set(400, 505, 0.2);\r
115 \r
116     for (int x = 300; x <= 500; x++)\r
117         for (int y = 300; y <= 500; y++)\r
118             image.set(x, y, 1);\r
119     }\r