From 47bc2b2bd63158fc15a9072cf31dcd7ab0e65bcb Mon Sep 17 00:00:00 2001
From: Nicolas Fley <nicolas.fley@student.ecp.fr>
Date: Fri, 17 Mar 2017 18:33:01 +0100
Subject: [PATCH] conjuguate gradient cleaned and commented

---
 grad_conj/bin/Debug/grad_conj.exe | Bin 85995 -> 85995 bytes
 grad_conj/grad_conj.depend        |   2 +-
 grad_conj/main.c                  | 104 ++++++++++++++++++------------
 grad_conj/obj/Debug/main.o        | Bin 8397 -> 8987 bytes
 4 files changed, 65 insertions(+), 41 deletions(-)

diff --git a/grad_conj/bin/Debug/grad_conj.exe b/grad_conj/bin/Debug/grad_conj.exe
index d331d272654698c2e7412c4f1c4f81e709f52501..1a0a7040d85ca72ac14c6265ffaeb0943bd13721 100644
GIT binary patch
delta 11723
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
HjGILPh%Jwn

delta 11353
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
bm^u9eNJGKQ=^|E)N=ykewp&;+ZWaXqBw+n`

diff --git a/grad_conj/grad_conj.depend b/grad_conj/grad_conj.depend
index 3a982e4..0734592 100644
--- a/grad_conj/grad_conj.depend
+++ b/grad_conj/grad_conj.depend
@@ -9,7 +9,7 @@
 
 1489596942 b:\mes documents\progra\calcint\grad_conj\customerror.h
 
-1489766951 source:b:\mes documents\progra\calcint\grad_conj\main.c
+1489771819 source:b:\mes documents\progra\calcint\grad_conj\main.c
 	<stdio.h>
 	<stdlib.h>
 	<time.h>
diff --git a/grad_conj/main.c b/grad_conj/main.c
index eaf5353..d48a216 100644
--- a/grad_conj/main.c
+++ b/grad_conj/main.c
@@ -17,15 +17,25 @@ C:\MPICH2\bin\mpiexec.exe -localonly 10
 */
 
 int main (int argc, char *argv[]) {
+    // MPI variable
     int rank, size;
     MPI_Status status;
 
-    int sizeMatrix=3;
+    // parameters of the problem
+    int sizeMatrix = 3;
     float epsilon = 0.0001;
 
-    float norm_r_2_in_use,norm_r_2_reduced;
-    float norm_r_next_2_in_use,norm_r_next_2_reduced;
+    // get user asked size of the problem
+    if(argc == 2){
+        int bufEntU=atoi(argv[1]);
+        if(bufEntU>0){
+            sizeMatrix=bufEntU;
+            if(rank==0)
+                printf("You have defined a %d sized problem.\n",sizeMatrix);
+        }
+    }
 
+    // initialisation of the MPI context
     MPI_Init (&argc, &argv); /* starts MPI */
     MPI_Comm_rank(MPI_COMM_WORLD, &rank); /* get current process id */
     MPI_Comm_size(MPI_COMM_WORLD, &size); /* get number of processes */
@@ -37,7 +47,8 @@ int main (int argc, char *argv[]) {
     int * nb_line_for_proc = malloc(sizeof(int)*nbProc);
     int * first_line_for_proc = malloc(sizeof(int)*nbProc);
 
-    /* initialisation of the domains */
+    /* initialisation of the domains according to his size
+        and the number of processus */
     int nb_ligne_par_proc_default=nb_ligne_tot/nbProc;
     for(int i=0;i!=nbProc;i++)
         nb_line_for_proc[i]=nb_ligne_par_proc_default;
@@ -51,24 +62,27 @@ int main (int argc, char *argv[]) {
 
     int nb_line_proc_in_use = nb_line_for_proc[rank];
 
+    /** Creating problem and scattering it to each processus **/
+
+    /* System's problem variables */
     Vector * b_tot = allocateVector(sizeMatrix);
     Vector * b = allocateVector(nb_line_proc_in_use);
     Matrix * A = allocateMatrix(nb_line_proc_in_use,sizeMatrix);
     Vector * x_tot = allocateVector(sizeMatrix);
     fillVector(x_tot,0);
     Matrix * A_tot;
-    if(rank==0){
+
+    if(rank==0){ // only the root create the problem
         A_tot = allocateMatrix(sizeMatrix,sizeMatrix);
         initProbVector(b_tot,1.0);
         initProbMatrixSymetric(A_tot,1.0);
         for(int i=1;i!=A_tot->width;i++){
-            A_tot->c[i][i]+=0;//A_tot->width;
+            A_tot->c[i][i]+=A_tot->width;
         }
-        //printMatrix(A_tot);
         for(int p=1;p!=nbProc;p++){
             for(int i=first_line_for_proc[p];
                 i!=first_line_for_proc[p]+nb_line_for_proc[p];
-                i++){
+                i++){ // Scattering of the Matrix
                 MPI_Send(A_tot->c[i],sizeMatrix,MPI_FLOAT,p,0,MPI_COMM_WORLD);
             }
         }
@@ -76,9 +90,9 @@ int main (int argc, char *argv[]) {
             A->c[i]=A_tot->c[i];
         }
     }else
-    for(int i=0;i!=nb_line_proc_in_use;i++)
+    for(int i=0;i!=nb_line_proc_in_use;i++) // receiving scattered matrix from the root
         MPI_Recv(A->c[i],sizeMatrix,MPI_FLOAT,0,0,MPI_COMM_WORLD,&status);
-   MPI_Scatterv(b_tot->c,nb_line_for_proc,first_line_for_proc,MPI_FLOAT,b->c,nb_line_proc_in_use,MPI_FLOAT,0,MPI_COMM_WORLD);
+    MPI_Scatterv(b_tot->c,nb_line_for_proc,first_line_for_proc,MPI_FLOAT,b->c,nb_line_proc_in_use,MPI_FLOAT,0,MPI_COMM_WORLD);
 
     /** resolution of the conjugate gradient **/
 
@@ -90,85 +104,95 @@ int main (int argc, char *argv[]) {
     Vector * x = allocateVector(nb_line_proc_in_use);
     fillVector(x,0);
 
+    /* intern problem's variables */
     int k=0;
     float alpha;
     float beta;
     float pAp_in_use;
     float pAp_reduced;
+    float norm_r_2_in_use,norm_r_2_reduced;
+    float norm_r_next_2_in_use,norm_r_next_2_reduced;
     int done=0;
 
     double time_proc_in_use=MPI_Wtime();
     double time_reduced=0;
 
+    //r0=b-Ax0
     prod_mat_vec_p(Ax,A,x_tot,0,nb_line_proc_in_use);
     sum_vec_alpha_vec_p(r,b,-1.0,Ax,0,nb_line_proc_in_use);
+    //p0=r0
     copyVector(r,p);
     norm_r_2_in_use = norm_vec_2(r);
     MPI_Allreduce(&norm_r_2_in_use,&norm_r_2_reduced,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
     const int MAX_ITERATION_MAIN=100;
+    k=0;
     while(!done && k<MAX_ITERATION_MAIN){
+        // get all p to be able to do A.p
         MPI_Allgatherv(p->c,nb_line_proc_in_use,MPI_FLOAT,p_tot->c,nb_line_for_proc,first_line_for_proc,MPI_FLOAT,MPI_COMM_WORLD);
+        /** alpha = <Rk,Rk>/<Pk,A.Pk> **/
+        /* <Pk,A.Pk> */
         prod_mat_vec_p(Ax,A,p_tot,0,nb_line_proc_in_use);
-        /*printf("Ax :\n");
-        printVector(Ax);
-        printf("p :\n");
-        printVector(p);*/
         pAp_in_use=prod_vec_t_vec_p(p,Ax,0,nb_line_proc_in_use);
-        //printf("pAp : %f\n",pAp_in_use);
         MPI_Allreduce(&pAp_in_use,&pAp_reduced,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
-        //printf("pAp_reduc : %f\n",pAp_reduced);
+        // <r,r> already done
         alpha=norm_r_2_reduced/pAp_reduced;
-        //printf("pAp_reduc : %f\n",pAp_reduced);
+        //Xk+1=Xk+alpha*Pk
         sum_vec_alpha_vec_p(x,x,alpha,p,0,nb_line_proc_in_use);
-        /*printf("x :\n");
-        printVector(x);*/
+        //Rk+1=Rk-alpha*A.Pk
         sum_vec_alpha_vec_p(r,r,-1.0*alpha,Ax,0,nb_line_proc_in_use);
-        /*printf("r :\n");
-        printVector(r);*/
+        // get <Rk+1,Rk+1> to check epsilon end condition
         norm_r_next_2_in_use = norm_vec_2(r);
         MPI_Allreduce(&norm_r_next_2_in_use,&norm_r_next_2_reduced,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
+        // if the norm less than epsilon, it's done
         if(norm_r_next_2_reduced<epsilon)
             done=1;
         else{
+            // Beta = <Rk+1,Rk+1>/<Rk,Rk> every thing is already calculated
             beta=norm_r_next_2_reduced/norm_r_2_reduced;
+            // Pk+1 = Rk+1 + Beta*Pk
             sum_vec_alpha_vec_p(p,r,beta,p,0,nb_line_proc_in_use);
+            // Rk = Rk+1 : avoiding some useless calcul
             norm_r_2_reduced=norm_r_next_2_reduced;
+            // k = k + 1
             k++;
         }
-        /*if(rank==0){
-            printf("p\n");
-            printVector(p_tot);
-            printf("%f\n",norm_r_2_reduced);
-        }*/
     }
     if(k==MAX_ITERATION_MAIN)
         printf("failed to converge\n");
+    // Reconstruct full x solution
     MPI_Allgatherv(x->c,nb_line_proc_in_use,MPI_FLOAT,x_tot->c,nb_line_for_proc,first_line_for_proc,MPI_FLOAT,MPI_COMM_WORLD);
+    // get effective execution time of the process
     time_proc_in_use=MPI_Wtime()-time_proc_in_use;
+    // reduce time's execution of each process
     MPI_Reduce(&time_proc_in_use,&time_reduced,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
+    /** Print some results information **/
     printf("time for proc %d : %f\n",rank,time_proc_in_use);
     if(rank==0){
         printSystem(A_tot,b_tot);
         printf("grad conj result : in %d step and %f s\n",k,time_reduced);
-        printf("x resultat : \n");
+        printf("x result : \n");
         printVector(x_tot);
-        printf("b = Ax : \n");
+        printf("recaculating b = Ax gives : \n");
         prod_mat_vec(b_tot,A_tot,x_tot);
         printVector(b_tot);
     }
+    // we may want to free some stuff isn'it ?
 
-    if(0){
-        fillVector(x_tot,0.);
-        printf("Iterative :\n");
-        grad_conj(b_tot,A_tot,x_tot,0.01);
-        printf("b : \n");
-        printVector(b_tot);
-        printf("x : \n");
-        printVector(x_tot);
+    if(rank==0){
+        freeMatrix(A_tot);
+        freeVector(b_tot);
+        freeVector(x_tot);
     }
-
+    freeMatrix(A);
+    freeVector(b_tot);
+    freeVector(b);
+    freeVector(x_tot);
+    freeVector(x);
+    freeVector(p_tot);
+    freeVector(p);
+    freeVector(r);
+    freeVector(Ax);
+
+    // let's finalize
     MPI_Finalize();
-
-    if(rank==0)
-        freeMatrix(A_tot);
 }
diff --git a/grad_conj/obj/Debug/main.o b/grad_conj/obj/Debug/main.o
index 0afdbdb4f64a05b197a92d55d5aec4ff85645881..eb05314bae3f5ef1a4492076ab97cde93f096c30 100644
GIT binary patch
literal 8987
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
InN_I_0CN2kF#rGn

literal 8397
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
Hc$fhInM<8C

-- 
GitLab