--- /dev/null
+#include "HeatTransfert.h"\r
+\r
+#include <iostream>\r
+#include <cstring>\r
+#include <assert.h>\r
+#include <stdio.h>\r
+using namespace std;\r
+\r
+#include "Device.h"\r
+\r
+#include "HeatTransfertDevice.h"\r
+\r
+HeatTransfert::HeatTransfert() :\r
+ calibreur(IntervalF(0, 1), IntervalF(0.7, 0)),\r
+ devImageHeaters(800, 800),\r
+ devImageA(800, 800),\r
+ devImageB(800, 800),\r
+ t(0),\r
+ dg(8, 8, 1),\r
+ db(32, 32, 1),\r
+ title("Heat transfert")\r
+ {\r
+ const size_t IMAGE_SIZE = this->devImageA.getW() * this->devImageA.getH() * sizeof(float);\r
+ const int IMAGE_W = this->devImageA.getW();\r
+ const int IMAGE_H = this->devImageA.getH();\r
+\r
+ // Définition des heaters.\r
+ HeatImage imageHeaters(IMAGE_W, IMAGE_H, new float[IMAGE_W * IMAGE_H]);\r
+ imageHeaters.clear();\r
+ setHeaters(imageHeaters);\r
+\r
+ // Définition des températures initiales (toutes à zero).\r
+ HeatImage imageInit(IMAGE_W, IMAGE_H, new float[IMAGE_W * IMAGE_H]);\r
+ imageInit.clear();\r
+\r
+ // Copie des heaters en GM.\r
+ HANDLE_ERROR(cudaMalloc(&this->devImageHeaters.getRaw(), IMAGE_SIZE));\r
+ HANDLE_ERROR(cudaMemcpy(this->devImageHeaters.getRaw(), imageHeaters.getRaw(), IMAGE_SIZE, cudaMemcpyHostToDevice));\r
+\r
+ // Allocation de image A et image B.\r
+ HANDLE_ERROR(cudaMalloc(&this->devImageA.getRaw(), IMAGE_SIZE));\r
+ HANDLE_ERROR(cudaMemcpy(this->devImageA.getRaw(), imageInit.getRaw(), IMAGE_SIZE, cudaMemcpyHostToDevice));\r
+ HANDLE_ERROR(cudaMalloc(&this->devImageB.getRaw(), IMAGE_SIZE));\r
+ HANDLE_ERROR(cudaMemcpy(this->devImageB.getRaw(), imageInit.getRaw(), IMAGE_SIZE, cudaMemcpyHostToDevice));\r
+ }\r
+\r
+HeatTransfert::~HeatTransfert()\r
+ {\r
+ cudaFree(this->devImageHeaters.getRaw());\r
+ cudaFree(this->devImageA.getRaw());\r
+ cudaFree(this->devImageB.getRaw());\r
+ }\r
+\r
+void HeatTransfert::runGPU(uchar4* ptrDevPixels)\r
+ {\r
+ for (int i = 0; i < NB_ITERATION_AVEUGLE; i++)\r
+ {\r
+ copyHeaters<<<dg, db>>>(this->devImageHeaters, this->devImageA); // Copie les heaters dans l'image A.\r
+ diffuseMethode1<<<dg, db>>>(this->devImageA, this->devImageB); // Diffuse l'image A dans l'image B.\r
+ this->devImageA.swapWith(this->devImageB); // Swap l'image A et l'image B.\r
+ }\r
+\r
+ display<<<dg, db>>>(this->devImageA, ptrDevPixels, this->calibreur); // Affiche l'image A (pour avoir les heaters intacts ).\r
+\r
+ //HANDLE_ERROR(cudaDeviceSynchronize()); // Pour flusher les 'printf' (pour le DEBUG).\r
+ }\r
+\r
+void HeatTransfert::animationStep()\r
+ {\r
+ this->t += NB_ITERATION_AVEUGLE;\r
+ }\r
+\r
+int HeatTransfert::getW()\r
+ {\r
+ return this->devImageA.getW();\r
+ }\r
+\r
+int HeatTransfert::getH()\r
+ {\r
+ return this->devImageA.getH();\r
+ }\r
+\r
+float HeatTransfert::getT()\r
+ {\r
+ return float(this->t);\r
+ }\r
+\r
+string HeatTransfert::getTitle()\r
+ {\r
+ return this->title;\r
+ }\r
+\r
+void HeatTransfert::setHeaters(HeatImage& image)\r
+ {\r
+ for (int x = 179; x <= 195; x++)\r
+ {\r
+ for (int y = 179; y <= 195; y++)\r
+ image.set(x, y, 0.2);\r
+ for (int y = 605; y <= 621; y++)\r
+ image.set(x, y, 0.2);\r
+ }\r
+\r
+ for (int x = 605; x <= 621; x++)\r
+ {\r
+ for (int y = 179; y <= 195; y++)\r
+ image.set(x, y, 0.2);\r
+ for (int y = 605; y <= 621; y++)\r
+ image.set(x, y, 0.2);\r
+ }\r
+\r
+ image.set(295, 400, 0.2);\r
+ image.set(400, 295, 0.2);\r
+ image.set(505, 400, 0.2);\r
+ image.set(400, 505, 0.2);\r
+\r
+ for (int x = 300; x <= 500; x++)\r
+ for (int y = 300; y <= 500; y++)\r
+ image.set(x, y, 1);\r
+ }\r