1 #include "HeatTransfert.h"
\r
11 #include "HeatTransfertDevice.h"
\r
13 HeatTransfert::HeatTransfert(int w, int h) :
\r
14 calibreur(IntervalF(0, 1), IntervalF(0.7, 0)),
\r
15 devImageHeaters(w, h),
\r
21 title("Heat transfert")
\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
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
32 // Définition des températures initiales (toutes à zero).
\r
33 HeatImage imageInit(IMAGE_W, IMAGE_H, new float[IMAGE_W * IMAGE_H]);
\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
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
47 HeatTransfert::~HeatTransfert()
\r
49 cudaFree(this->devImageHeaters.getRaw());
\r
50 cudaFree(this->devImageA.getRaw());
\r
51 cudaFree(this->devImageB.getRaw());
\r
54 void HeatTransfert::runGPU(uchar4* ptrDevPixels)
\r
56 for (int i = 0; i < NB_ITERATION_AVEUGLE; i++)
\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
63 display<<<dg, db>>>(this->devImageA, ptrDevPixels, this->calibreur); // Affiche l'image A (pour avoir les heaters intacts ).
\r
65 //HANDLE_ERROR(cudaDeviceSynchronize()); // Pour flusher les 'printf' (pour le DEBUG).
\r
68 void HeatTransfert::animationStep()
\r
70 this->t += NB_ITERATION_AVEUGLE;
\r
73 int HeatTransfert::getW()
\r
75 return this->devImageA.getW();
\r
78 int HeatTransfert::getH()
\r
80 return this->devImageA.getH();
\r
83 float HeatTransfert::getT()
\r
85 return float(this->t);
\r
88 string HeatTransfert::getTitle()
\r
93 void HeatTransfert::setHeaters(HeatImage& image)
\r
95 const float tempCentre = 1.0;
\r
96 const float tempCotes = 0.2;
\r
98 for (int x = 279; x <= 295; x++)
\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
106 for (int x = 505; x <= 521; x++)
\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
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
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