From b2d3d9f332daf8cb0e068338d408da289b1234f8 Mon Sep 17 00:00:00 2001
From: EdwardAJ <13517115@std.stei.itb.ac.id>
Date: Sun, 23 Feb 2020 09:59:12 +0700
Subject: [PATCH] Fix bug

---
 a                   | Bin 0 -> 8940 bytes
 a.out               | Bin 0 -> 8632 bytes
 dijkstra.c          | 152 --------------------------------------------
 mpi.c               |  48 ++++++++++----
 output.txt          |  10 +++
 prog                | Bin 9500 -> 13756 bytes
 reset.c             |  96 ----------------------------
 ser.c               |  98 ----------------------------
 sr.c                |  64 -------------------
 test/aingcupu/share |  10 +--
 10 files changed, 52 insertions(+), 426 deletions(-)
 create mode 100755 a
 create mode 100755 a.out
 delete mode 100644 dijkstra.c
 create mode 100644 output.txt
 delete mode 100644 reset.c
 delete mode 100644 ser.c
 delete mode 100644 sr.c

diff --git a/a b/a
new file mode 100755
index 0000000000000000000000000000000000000000..3240b4b80ce5cb727ef1cd6d34c9bdbbaa8c7f64
GIT binary patch
literal 8940
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
RyfShNNS2OQG%M<seFKAoplJXA

literal 0
HcmV?d00001

diff --git a/a.out b/a.out
new file mode 100755
index 0000000000000000000000000000000000000000..aa967d0561cbd75ce32e612948d14b97910abb8e
GIT binary patch
literal 8632
zcmeHMU1%It6h3Rx8f)8Zv`EzyC&ks&pClCvRZLAv2DezXHYo&4xXos_-G$vvn4QH2
zEJT9hvJIq&pl^K@6n$*p0u`blDt+=nOCD4bS)mjkL>AZYyL%@)JBfmi!aZ>2obTRq
z&%O7%GcYsf+dqH%>u!-)hseTRBGL_&9U||DLr)%rCZS558hy!q!#({PTiYep4!1?j
z^F0EUns6s4+C%jCczc@|jJ0t&S{b2~pSkGMYf3cVxxLs7x^9_%;!fjh(<uvKs8q=>
zr%Ibm(R{~12=nbX5djVcbeViRO+z!E%4YI&84qpIe3K^MQ4>#0-Zy2-`esVLmn&W{
z0nvQRCSR}VCk{(nZgePBF20#7rd6(Zepci5^Z3N%<C#;4qdA&A%`4CKs6N-R(TUMe
z56+Lg1?L#GJXhRvS{bHPF|SJVh16_b&G{bi_W3q%6F3|n2>B16vr_r#f6Es)>vK#3
z;&48$FE~?%D3vO;?h@km^$nSP{U#qxcs-hnP+#l0I(g#Nm))@w!874Rcmt+fGYPn^
zaIS-RZig7)h;+ep!3Os#pg6$1*Ct^{V0o78zv_tG13TF#at`)h=qV^AW|Vwz4}AXq
zNro_f*EXGa?8JfYh7OiX-e5kL8cfgU)4-I6p<KtW*FWpMb?3SFFW*<+d4Jyr?xSb}
zl_GnP75YSg*#-f>3mmt`2|~hoxKH+RkDbr_gr&z?b7TJT`I4V03>+W8I&vulK^}v0
zz7L%ye}@dd3T(wPU>UFsSOzQumI2FvW#GRva3)##Ik{MiA6}`felF`jB7=6mfwSt?
znXuyiv3RMzt9$7f0AfCcNiGfF(PmE-Z==bXGxbX6m1?<8ue$FFqTbdcf3Ldr#g$ma
zt#4dwG#bgJ9cLN8_(go`M)xCQB4&Qa%(b3pRK>l$>ei4z7BAH>@zZ*$;ma`9axGbP
zZzpG7sa5yAhk5v-UUAo}ZcWcq+xQ9@4zFMeXX-{H@in>|3GSwm_)cGM;wo}->A=S@
zqvMUlN3hFTHg5cav01*kZu~&+A$m9IJx=dSc;4AWddeAg5^22q_Rl#_!aL+VuQ7He
z!FOKR@_m=zxzEB<Uo_u<^!X0I8}Gq!{Z<dq{`sIA!k4W1{_~7|%h-2~4aZvFGGH07
z3|Iy%1C{~HfMvikU>UFsSOzQumVy5V13d@hy7JgF!s47RhN~3n!zf<A?#Z%v@tzSi
zhXS;Jo@hUiH(gBAci@)-&=26}3K?`XC8kg}>`;ZQ%3RFMl>H29;?qp~)P;<H8YyNA
zGE|t(73B#3Uv$V?FE0no@U`9r{_c=*=w1{ygZe6CyJNaSsQ+j@pmFp62M6>S%=#cP
zf2_dL)iQ`{7$1q?7b5t01f!^^>!GX-vlh#mD`X_v?w~@vb?>URccu3pP}?Nc(Agw%
L%Xzd04|wu7ZK6g>

literal 0
HcmV?d00001

diff --git a/dijkstra.c b/dijkstra.c
deleted file mode 100644
index e5e12d4..0000000
--- a/dijkstra.c
+++ /dev/null
@@ -1,152 +0,0 @@
-#include "mpi.h"
-#include <stdio.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <limits.h>
-
-int N = 10;
-
-long getVertexWithMinDistance(long dist[], bool pickedVertices[]) {
-    long minDistance = LONG_MAX;
-    int vertexWithMinDistance = -1;
-
-    for (int vertex = 0; vertex < N; vertex++) {
-        if (!pickedVertices[vertex] && dist[vertex] <= minDistance) {
-            minDistance = dist[vertex];
-            vertexWithMinDistance = vertex;
-        }
-    }
-    return vertexWithMinDistance;
-}
-
-long* dijkstra(int graph[N][N], int sourceVertex) {
-
-    // Distance from single source to all of the nodes
-    long *dist = (long*) malloc(sizeof(long) * N);
-    bool pickedVertices[N];
-
-    for (int vertex = 0; vertex < N; vertex++) {
-        if (vertex == sourceVertex) {
-            dist[vertex] = 0; 
-        } else {
-            // Initialize all distance to be infinity.
-            dist[vertex] = LONG_MAX;
-        }
-        pickedVertices[vertex] = false;
-    }
-
-    for (int iteration = 0; iteration < N - 1; iteration++) {
-        // Get minimum distance
-        int vertexWithMinDistance = getVertexWithMinDistance(dist, pickedVertices);
-
-        // Mark the vertice as picked
-        pickedVertices[vertexWithMinDistance] = true;
-
-        // Update distance value
-        for (int vertex = 0; vertex < N; vertex++) {
-            if ((!pickedVertices[vertex]) && 
-                (graph[vertexWithMinDistance][vertex]) && 
-                (dist[vertexWithMinDistance] != LONG_MAX) && 
-                (dist[vertexWithMinDistance] + graph[vertexWithMinDistance][vertex] < dist[vertex])) {
-                // Change dist[]
-                dist[vertex] = dist[vertexWithMinDistance] + graph[vertexWithMinDistance][vertex];
-            }
-        }
-    }
-
-    return dist;
-
-    // // Print solution
-    // for (int vertex = 0; vertex < N; vertex++) {
-    //     // printf("%d to %ld\n", vertex, dist[vertex]);
-    //     printf("%d to %d\n", vertex, graph[sourceVertex][vertex]);
-    // }
-}
-
-int main(int argc, char *argv[]) {
-
-    // Test function
-    
-    // for (int i = 0; i < N; i++) {
-    //     for (int j = 0; j < N; j++) {
-    //         scanf("%d", &graph[i][j]);
-    //     }
-    // }
-
-    // graph = { 0, 4, 0, 0, 0, 0, 0, 8, 0,
-    //                     4, 0, 8, 0, 0, 0, 0, 11, 0, 
-    //                     0, 8, 0, 7, 0, 4, 0, 0, 2, 
-    //                     0, 0, 7, 0, 9, 14, 0, 0, 0, 
-    //                     0, 0, 0, 9, 0, 10, 0, 0, 0, 
-    //                     0, 0, 4, 14, 10, 0, 2, 0, 0, 
-    //                     0, 0, 0, 0, 0, 2, 0, 1, 6, 
-    //                     8, 11, 0, 0, 0, 0, 1, 0, 7, 
-    //                     0, 0, 2, 0, 0, 0, 6, 7, 0 };
-
-    // dijkstra(graph, 1); 
-
-    // // Print function
-    // printf("Matrix: \n");
-    // for (int i = 0; i < N; i++) {
-    //     for (int j = 0; j < N; j++) {
-    //         printf("%d ", graph[i][j]);
-    //     }
-    //     printf("\n");
-    // }
-
-    // Get matrix size from argument vector in , convert to int
-    N = strtol(argv[1], NULL, 10);
-    
-    // Initialize matrix
-    int graph[N][N];
-
-    // Seed with NIM: Edward Alexander Jaya
-    srand(13517115);
-    // Fill the matrix with rand() function
-    for (int i = 0; i < N; i++) {
-        for (int j = 0; j < N; j++) {
-            // Mod by 100 so the result won't be too big.
-            graph[i][j] = rand() % 100;
-        }
-    }
-
-    MPI_Status Stat;
-    MPI_Init(&argc, &argv);
-    // rank is the id of processes,  numtasks is the number of processes
-    int rank, numtasks;
-    MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
-    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-
-    double start_time, end_time, total_time = 0.0;
-
-    int numOfTaskPerProcess = N / (numtasks - 1);
-    int destinationRank = 0;
-    int tag = 1;
-    int vertex = 0;
-
-    // for each thread, synchronize before start
-    MPI_Barrier(MPI_COMM_WORLD);
-        
-    // Do not count the initial synchronization time
-    start_time = MPI_Wtime();
-
-    if (rank == 0) {
-        long* dataRecv;
-        // Receive
-        MPI_Recv(&dataRecv, N, MPI_LONG, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &Stat);
-        printf("Received from process %d ", MPI_ANY_SOURCE);
-        // To do: store in the array
-        free(dataRecv);
-    } else {
-        for (int vertex = (rank - 1) * numOfTaskPerProcess; vertex < (rank - 1) * numOfTaskPerProcess + numOfTaskPerProcess; vertex++) {
-            long* dataSend = dijkstra(graph, vertex);
-            MPI_Send(dataSend, N, MPI_LONG, 0, tag, MPI_COMM_WORLD);
-        }
-    }
-
-    // Synchronize again and count the time
-    MPI_Barrier(MPI_COMM_WORLD);
-    end_time = MPI_Wtime();
-    total_time = end_time - start_time;
-    MPI_Finalize();
-} 
diff --git a/mpi.c b/mpi.c
index 861df39..77d3ef7 100644
--- a/mpi.c
+++ b/mpi.c
@@ -4,10 +4,10 @@
 #include <stdlib.h>
 #include <limits.h>
 
-int N = 1000;
+int N = 0;
 
 int getmin_index(long **graph, bool pickedVertices[N], int sourceVertex) {
-    int minDistance = CHAR_MAX;
+    int minDistance = INT_MAX;
     int min_index = -1;
 
     for (int j = 0; j < N; j++) {
@@ -70,6 +70,7 @@ int main(int argc, char *argv[]) {
     {
         graph[i] = (long*) malloc(sizeof(long) * N);
     }
+
     int numtasks, rank, dest, source, rc, count, tag=1;
     double start_time, end_time, total_time;
 
@@ -77,10 +78,11 @@ int main(int argc, char *argv[]) {
 	// Fill the matrix with rand() function
     for (int i = 0; i < N; i++) {
         for (int j = 0; j < N; j++) {
-            // Mod by 100 so the result won't be too big.
-            graph[i][j] = rand() % 100;
+            graph[i][j] = rand();
         }
     }
+
+    // Assign with infinity
     for (int i = 0; i < N; i++) {
         for (int j = 0; j < N; j++) {
             if (!(i == j || graph[i][j])){
@@ -96,6 +98,8 @@ int main(int argc, char *argv[]) {
         }
     }
 
+    // print(graph);
+    
     MPI_Status Stat;
     MPI_Init(&argc,&argv);
     MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
@@ -109,36 +113,58 @@ int main(int argc, char *argv[]) {
     count = 0;
     if (!rank){
         dataRecv = (long*) malloc(sizeof(long) * N*jobs);
-        while(count<numtasks-1){
+        while ( count < numtasks-1 ){
             MPI_Recv(dataRecv, N*jobs, MPI_LONG, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &Stat);
             printf("Received from process %d ", Stat.MPI_SOURCE);
-            for (int i = 0; i < N*jobs; ++i)
-            {
-                graph[Stat.MPI_SOURCE*jobs-jobs][i] = dataRecv[i];
+            for (int i = 0; i < jobs; ++i) {
+                for (int j = 0; j < N; ++j) {
+                    graph[Stat.MPI_SOURCE * jobs - jobs + i][j] = dataRecv[i * N + j];
+                }
             }
             count++;
         }
         free(dataRecv);
     }
     else{
+        long *dataSend = (long*) malloc(sizeof(long*) * N * jobs);
+        int count = 0;
         for (int i = rank*jobs-jobs; i < rank*jobs; ++i)
-        {
+        {   
             dijkstra(graph, i);
+            for (int j = 0; j < N; j++) {
+                dataSend[count * N + j] = graph[i][j];
+            }
+            count++;
             // printf("Print job %d from rank %d\n", i, rank);
         }
-        MPI_Send(graph[rank*jobs-jobs], N*jobs, MPI_LONG, destinationRank, tag, MPI_COMM_WORLD);
+        MPI_Send(dataSend, N*jobs, MPI_LONG, destinationRank, tag, MPI_COMM_WORLD);
+        free(dataSend);
     }
     
     MPI_Barrier(MPI_COMM_WORLD);
     end_time = MPI_Wtime();
     total_time = end_time - start_time;
-    MPI_Finalize();
+    
     if (rank == 0) {
         printf("%f\n", total_time);
+        // Write to file
+        FILE *f = fopen("output.txt", "w");
+        for (int i = 0; i < N; i++) {
+            for (int j = 0; j < N; j++) {
+                fprintf(f, "%ld ", graph[i][j]);
+            }
+            fprintf(f, "\n");
+        }
+        fclose(f);
     }
+
     for (int i = 0; i < N; ++i)
     {
         free(graph[i]);
     }
     free(graph);
+
+    MPI_Finalize();
+
+    return 0;
 }
\ No newline at end of file
diff --git a/output.txt b/output.txt
new file mode 100644
index 0000000..bfd51d0
--- /dev/null
+++ b/output.txt
@@ -0,0 +1,10 @@
+0 490424743 74565607 288096063 35073978 450365432 83869292 560553895 389130630 373297152 
+204263410 0 278829017 416166025 148143896 531037102 288132702 576185956 593394040 453968822 
+417319369 741907867 0 213530456 361199855 776491309 9303685 886679772 314565023 699423029 
+757254738 1092124427 638775151 0 792328716 1207620170 591784729 1129171046 664781583 1130551890 
+56119514 455350765 130685121 344215577 0 415291454 139988806 525479917 445250144 338223174 
+127671809 443930510 202237416 415767872 87521598 0 211541101 549356759 516802439 425744772 
+1403832888 1199569478 1478398495 1615735503 1347713374 1413543162 0 1642756475 772226634 1569358817 
+819484865 1269497844 894050472 971260270 854558843 1004784094 533832147 0 1208615495 927715814 
+631606254 427342844 706171861 843508869 575486740 958379946 715475546 870529841 0 881311666 
+204740089 520998790 279305696 492836152 164589878 77068280 288609381 187256743 593870719 0 
diff --git a/prog b/prog
index bc7444f0404da1a31988e24d3001a7225c403486..1494f0a73d5c8f86f2e87a916f10a9177b1d4b6a 100755
GIT binary patch
literal 13756
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

literal 9500
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

diff --git a/reset.c b/reset.c
deleted file mode 100644
index 971b136..0000000
--- a/reset.c
+++ /dev/null
@@ -1,96 +0,0 @@
-#include "mpi.h"
-#include <stdio.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <limits.h>
-
-int N = 10;
-
-int getVertexWithMinDistance(int dist[], bool pickedVertices[]) {
-    int minDistance = INT_MAX;
-    int vertexWithMinDistance = -1;
-
-    for (int vertex = 0; vertex < N; vertex++) {
-        if (!pickedVertices[vertex] && dist[vertex] <= minDistance) {
-            minDistance = dist[vertex];
-            vertexWithMinDistance = vertex;
-        }
-    }
-    return vertexWithMinDistance;
-}
-
-
-void dijkstra(int graph[N][N], int sourceVertex) {
-
-    // Distance from single source to all of the nodes
-    bool pickedVertices[N];
-
-    for (int vertex = 0; vertex < N; vertex++) {
-        pickedVertices[vertex] = false;
-    }
-
-    for (int i = 0; i < N - 1; i++) {
-        // Get minimum distance
-        int vertexWithMinDistance = getVertexWithMinDistance(graph[i], pickedVertices);
-
-        // Mark the vertice as picked
-        pickedVertices[vertexWithMinDistance] = true;
-
-        // Update distance value
-        for (int vertex = 0; vertex < N; vertex++) {
-            if ((!pickedVertices[vertex]) && 
-                (graph[vertexWithMinDistance][vertex]) && 
-                (graph[i][vertexWithMinDistance] + graph[vertexWithMinDistance][vertex] < graph[i][vertex])) {
-                
-                graph[i][vertex] = graph[i][vertexWithMinDistance] + graph[vertexWithMinDistance][vertex];
-            }
-        }
-    }
-    return;
-}
-
-int main(int argc, char *argv[]) {
-	int graph[N][N];
-    int rank, numtasks;
-    double start_time, end_time, total_time;
-	MPI_Status Stat;
-    MPI_Init(&argc, &argv);
-    MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
-    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-    start_time = MPI_Wtime();
-
-    srand(13517115);
-	// Fill the matrix with rand() function
-    for (int i = 0; i < N; i++) {
-        for (int j = 0; j < N; j++) {
-            // Mod by 100 so the result won't be too big.
-            graph[i][j] = rand() % 100;
-        }
-    }
-
-    // Print function
-    printf("Matrix: \n");
-    for (int i = 0; i < N; i++) {
-        for (int j = 0; j < N; j++) {
-            printf("%d ", graph[i][j]);
-        }
-        printf("\n");
-    }
-
-    MPI_Barrier(MPI_COMM_WORLD);
-	end_time = MPI_Wtime();
-    total_time = end_time - start_time;
-    MPI_Finalize();
-
-    if (rank == 0) {
-        MPI_Recv(&dataRecv, N, MPI_INT, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &Stat);
-    	printf("%f\n", total_time);
-	}
-
-    // long *data = dijkstra(graph, 0);
-    // for (int i = 0; i < N; ++i)
-    // {
-    // 	printf("%ld\n", data[i]);
-    // }
-    // free(data);
-}
\ No newline at end of file
diff --git a/ser.c b/ser.c
deleted file mode 100644
index 028dd9c..0000000
--- a/ser.c
+++ /dev/null
@@ -1,98 +0,0 @@
-#include "mpi.h"
-#include <stdio.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <limits.h>
-
-int N = 100;
-
-int getmin_index(short graph[N][N], bool pickedVertices[N], int sourceVertex) {
-    int minDistance = CHAR_MAX;
-    int min_index = -1;
-
-    for (int j = 0; j < N; j++) {
-        if (!pickedVertices[j] && graph[sourceVertex][j] <= minDistance) {
-            minDistance = graph[sourceVertex][j];
-            min_index = j;
-        }
-    }
-    return min_index;
-}
-
-void print(short graph[N][N]){
-    printf("Matrix: \n");
-    for (int i = 0; i < N; i++) {
-        for (int j = 0; j < N; j++) {
-            printf("%d ", graph[i][j]);
-        }
-        printf("\n");
-    }
-}
-
-void dijkstra(short graph[N][N], int sourceVertex) {
-
-    // Distance from single source to all of the nodes
-    bool pickedVertices[N];
-
-    for (int vertex = 0; vertex < N; vertex++) {
-        pickedVertices[vertex] = false;
-    }
-
-    for (int i = 0; i < N - 1; i++) {
-        // Get minimum distance
-        int min_index = getmin_index(graph, pickedVertices, sourceVertex);
-
-        // Mark the vertice as picked
-        pickedVertices[min_index] = true;
-
-        // Update distance value
-        for (int vertex = 0; vertex < N; vertex++) {
-            if ((!pickedVertices[vertex]) && 
-                (graph[min_index][vertex]) && 
-                (graph[sourceVertex][min_index] != INT_MAX) &&
-                (graph[sourceVertex][min_index] + graph[min_index][vertex] < graph[sourceVertex][vertex])) {
-                
-                graph[sourceVertex][vertex] = graph[sourceVertex][min_index] + graph[min_index][vertex];
-            }
-        }
-    }
-    return;
-}
-
-int main(int argc, char *argv[]) {
-	
-    // Get matrix size from argument vector in , convert to int
-    N = strtol(argv[1], NULL, 10);
-
-    short graph[N][N];
-
-    srand(13517115);
-	// Fill the matrix with rand() function
-    for (int i = 0; i < N; i++) {
-        for (int j = 0; j < N; j++) {
-            // Mod by 100 so the result won't be too big.
-            graph[i][j] = rand() % 100;
-        }
-    }
-    for (int i = 0; i < N; i++) {
-        for (int j = 0; j < N; j++) {
-            if (!(i == j || graph[i][j])){
-                graph[i][j] = CHAR_MAX;
-            }
-        }
-    }
-    for (int i = 0; i < N; i++) {
-        for (int j = 0; j < N; j++) {
-            if (i == j){
-                graph[i][j] = 0;
-            }
-        }
-    }
-
-    for (int i = 0; i < N; ++i)
-    {
-        dijkstra(graph, i);
-        printf("%d\n", i);
-    }
-    print(graph);
-}
\ No newline at end of file
diff --git a/sr.c b/sr.c
deleted file mode 100644
index d66d98a..0000000
--- a/sr.c
+++ /dev/null
@@ -1,64 +0,0 @@
-
-// Copyright www.computing.llnl.gov
-#include "mpi.h"
-#include <stdio.h>
-
-
-void clean(int arr[10][10]){
-	for (int i = 0; i < 10; ++i)
-	{
-		for (int j = 0; j < 10; ++j)
-		{
-			arr[i][j] = 99;
-		}
-	}
-}
-int main(int argc, char *argv[]) {
-int numtasks, rank, dest, source, rc, count, tag=1;
-int inmsg[10][10], outmsg[10][10];
-
-for (int i = 0; i < 10; i++)
-{
-	for (int j = 0; j < 10; j++)
-	{
-		outmsg[i][j] = 10*i+j;
-	}
-}
-
-MPI_Status Stat;
-MPI_Init(&argc,&argv);
-MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
-MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-if (rank == 0) {
-	dest = 1;
-	source = 1;
-	rc = MPI_Send(&outmsg[5], 50, MPI_INT, dest, tag, MPI_COMM_WORLD);
-	rc = MPI_Recv(&inmsg[5], 50, MPI_INT, source, tag, MPI_COMM_WORLD, &Stat);
-	for (int i = 5; i < 10; i++)
-	{
-		for (int j = 0; j < 10; j++)
-		{
-			printf("%d\n", inmsg[i][j]);
-		}
-	}
-}
-else if (rank == 1) {
-	dest = 0;
-	source = 0;
-	rc = MPI_Recv(&inmsg[5], 50, MPI_INT, source, tag, MPI_COMM_WORLD, &Stat);
-	printf("%s\n", "pass");
-	for (int i = 5; i < 10; i++)
-	{
-		for (int j = 0; j < 10; j++)
-		{
-			printf("%d\n", inmsg[i][j]);
-		}
-	}
-	clean(inmsg);
-	rc = MPI_Send(&inmsg[5], 50, MPI_INT, dest, tag, MPI_COMM_WORLD);
-}
-rc = MPI_Get_count(&Stat, MPI_INT, &count);
-printf("Task %d: Received %d char(s) from task %d with tag %d \n",
-rank, count, Stat.MPI_SOURCE, Stat.MPI_TAG);
-MPI_Finalize();
-}
diff --git a/test/aingcupu/share b/test/aingcupu/share
index 79186e8..b24918c 100644
--- a/test/aingcupu/share
+++ b/test/aingcupu/share
@@ -1,5 +1,5 @@
-scp asd 13517109@167.205.35.151:~
-scp asd 13517109@167.205.35.152:~
-scp asd 13517109@167.205.35.153:~
-scp asd 13517109@167.205.35.154:~
-scp asd 13517109@167.205.35.155:~
+scp asd 13517115@167.205.35.151:~
+scp asd 13517115@167.205.35.152:~
+scp asd 13517115@167.205.35.153:~
+scp asd 13517115@167.205.35.154:~
+scp asd 13517115@167.205.35.155:~
\ No newline at end of file
-- 
GitLab