Cleanage.
[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(int w, int h) :\r
14       calibreur(IntervalF(0, 1), IntervalF(0.7, 0)),\r
15       devImageHeaters(w, h),\r
16       devImageA(w, h),\r
17       devImageB(w, h),\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     const float tempCentre = 1.0;\r
96     const float tempCotes = 0.2;\r
97 \r
98     for (int x = 279; x <= 295; x++)\r
99         {\r
100         for (int y = 279; y <= 295; y++)\r
101             image.set(x, y, tempCotes);\r
102         for (int y = 505; y <= 521; y++)\r
103             image.set(x, y, tempCotes);\r
104         }\r
105 \r
106     for (int x = 505; x <= 521; x++)\r
107         {\r
108         for (int y = 279; y <= 295; y++)\r
109             image.set(x, y, tempCotes);\r
110         for (int y = 505; y <= 521; y++)\r
111             image.set(x, y, tempCotes);\r
112         }\r
113 \r
114     image.set(295, 400, tempCotes);\r
115     image.set(400, 295, tempCotes);\r
116     image.set(505, 400, tempCotes);\r
117     image.set(400, 505, tempCotes);\r
118 \r
119     for (int x = 300; x <= 500; x++)\r
120         for (int y = 300; y <= 500; y++)\r
121             image.set(x, y, tempCentre);\r
122     }\r