Ajout du TP HeatTransfert.
[GPU.git] / WCudaMSE / Student_Cuda_Image / src / cpp / core / 05_HeatTransfert / moo / host / HeatTransfert.cu
diff --git a/WCudaMSE/Student_Cuda_Image/src/cpp/core/05_HeatTransfert/moo/host/HeatTransfert.cu b/WCudaMSE/Student_Cuda_Image/src/cpp/core/05_HeatTransfert/moo/host/HeatTransfert.cu
new file mode 100755 (executable)
index 0000000..7aa7cf6
--- /dev/null
@@ -0,0 +1,119 @@
+#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