From 7d140d87c3b623c9a34a7e404f142ba0553a4387 Mon Sep 17 00:00:00 2001 From: Nicolas Fley <nicolas.fley@student.ecp.fr> Date: Fri, 17 Mar 2017 17:18:37 +0100 Subject: [PATCH] compiling and converging parallel conjuguate gradient done --- grad_conj/algebre.c | 39 ++++- grad_conj/algebre.h | 6 +- grad_conj/bin/Debug/grad_conj.exe | Bin 77274 -> 85995 bytes grad_conj/grad_conj.depend | 16 +- grad_conj/iterative_methods.c | 29 +++- grad_conj/iterative_methods.c.save-failed | 72 +++++++++ grad_conj/iterative_methods.h | 1 + grad_conj/main.c | 173 +++++++++++++++++++--- grad_conj/mathObject.c | 19 ++- grad_conj/mathObject.h | 3 + grad_conj/obj/Debug/algebre.o | Bin 6807 -> 8232 bytes grad_conj/obj/Debug/iterative_methods.o | Bin 3755 -> 4553 bytes grad_conj/obj/Debug/main.o | Bin 3607 -> 8397 bytes grad_conj/obj/Debug/mathObject.o | Bin 7532 -> 8249 bytes 14 files changed, 319 insertions(+), 39 deletions(-) create mode 100644 grad_conj/iterative_methods.c.save-failed diff --git a/grad_conj/algebre.c b/grad_conj/algebre.c index 37371db..8aa2588 100644 --- a/grad_conj/algebre.c +++ b/grad_conj/algebre.c @@ -21,6 +21,21 @@ void prod_mat_vec(Vector * vector_res, Matrix * matrix, Vector * vector){ } } } +// parallelisable +void prod_mat_vec_p(Vector * vector_res, Matrix * matrix, Vector * vector, int beg, int nbLigne){ + if(vector->t!=0) + exit(TRANSPOSED_VECTOR_USED); + if(matrix->width!=vector->size) + exit(UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION); + if(nbLigne>vector_res->size) + exit(CONTAINER_RES_DO_NOT_FIT); + for(int i=0; i!=nbLigne; i++){ + vector_res->c[i]=0; + for(int j=0; j!=matrix->width; j++){ + vector_res->c[i]+=matrix->c[beg+i][j]*vector->c[j]; + } + } +} /* VECTOR_t x MATRIX */ @@ -47,6 +62,14 @@ void sum_vec_alpha_vec(Vector * vector_res, Vector * vector1, float alpha, Vecto for(int i=0;i!=vector1->size;i++) vector_res->c[i]=vector1->c[i]+alpha*vector2->c[i]; } +// parallelisable +void sum_vec_alpha_vec_p(Vector * vector_res, Vector * vector1, float alpha, Vector * vector2, int beg, int nbLigne){ + if(vector_res->size<nbLigne) + exit(CONTAINER_RES_DO_NOT_FIT); + for(int i=0;i!=nbLigne;i++){ + vector_res->c[i]=vector1->c[beg+i]+alpha*vector2->c[beg+i]; + } +} /* VECTOR_t x MATRIX x VECTOR */ @@ -69,13 +92,9 @@ float norm_vec_2(Vector * vector){ return res; } -/* VECTOR_t x VECTOR */ +/* VECTOR_t . VECTOR */ float prod_vec_t_vec(Vector * vector_t, Vector * vector){ - if(vector_t->t!=1) - exit(NON_TRANSPOSED_VECTOR_USED); - if(vector->t!=0) - exit(TRANSPOSED_VECTOR_USED); if(vector->size!=vector_t->size) exit(UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION); float res=0; @@ -84,6 +103,16 @@ float prod_vec_t_vec(Vector * vector_t, Vector * vector){ return res; } +// parallelisable +float prod_vec_t_vec_p(Vector * vector_t, Vector * vector, int beg, int nbLigne){ + if(vector->size<beg+nbLigne) + exit(UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION); + float res=0; + for(int i=beg;i!=beg+nbLigne;i++) + res+=vector->c[i]*vector_t->c[i]; + return res; +} + /* VECTOR x Scal without creating new object */ void prod_vec_scal(Vector * vector_res, Vector * vector, float scal){ diff --git a/grad_conj/algebre.h b/grad_conj/algebre.h index b1a61f8..8ee4f9d 100644 --- a/grad_conj/algebre.h +++ b/grad_conj/algebre.h @@ -4,11 +4,15 @@ void prod_mat_vec(Vector * vector_res, Matrix * matrix, Vector * vector); void prod_vec_mat(Vector * vector_res, Vector * vector, Matrix * matrix); +void prod_mat_vec_p(Vector * vector_res, Matrix * matrix, Vector * vector, int beg, int nbLigne); + void sum_vec_alpha_vec(Vector * vector_res, Vector * vector1, float alpha, Vector * vector2); +void sum_vec_alpha_vec_p(Vector * vector_res, Vector * vector1, float alpha, Vector * vector2, int beg, int nbLigne); float prod_vec_t_mat_vec(Vector * vector, Matrix * matrix); -float prod_vec_t_vec(Vector * vector_t, Vector * vector); float norm_vec_2(Vector * vector); +float prod_vec_t_vec(Vector * vector_t, Vector * vector); +float prod_vec_t_vec_p(Vector * vector_t, Vector * vector, int beg, int nbLigne); void prod_vec_scal(Vector * vector_res, Vector * vector, float scal); diff --git a/grad_conj/bin/Debug/grad_conj.exe b/grad_conj/bin/Debug/grad_conj.exe index 9bf973f8c18faa718cf3d1a71920c3af1a2e7010..d331d272654698c2e7412c4f1c4f81e709f52501 100644 GIT binary patch delta 28231 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%0AeK!|ZZVhp>A=wXza+oe7Hmbgc&EtL1wS1aN*%#E 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 delta 20321 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 diff --git a/grad_conj/grad_conj.depend b/grad_conj/grad_conj.depend index cce5b3e..3a982e4 100644 --- a/grad_conj/grad_conj.depend +++ b/grad_conj/grad_conj.depend @@ -1,15 +1,15 @@ # depslib dependency file v1.0 -1489617942 source:b:\mes documents\progra\calcint\grad_conj\mathobject.c +1489764264 source:b:\mes documents\progra\calcint\grad_conj\mathobject.c <stdlib.h> <stdio.h> "mathObject.h" "customError.h" -1489612623 b:\mes documents\progra\calcint\grad_conj\mathobject.h +1489763407 b:\mes documents\progra\calcint\grad_conj\mathobject.h 1489596942 b:\mes documents\progra\calcint\grad_conj\customerror.h -1489619150 source:b:\mes documents\progra\calcint\grad_conj\main.c +1489766951 source:b:\mes documents\progra\calcint\grad_conj\main.c <stdio.h> <stdlib.h> <time.h> @@ -21,21 +21,23 @@ "algebre.h" "iterative_methods.h" -1489617314 source:b:\mes documents\progra\calcint\grad_conj\algebre.c +1489742437 source:b:\mes documents\progra\calcint\grad_conj\algebre.c <stdlib.h> <stdio.h> "mathObject.h" "customError.h" "algebre.h" -1489617252 b:\mes documents\progra\calcint\grad_conj\algebre.h +1489742440 b:\mes documents\progra\calcint\grad_conj\algebre.h -1489619088 source:b:\mes documents\progra\calcint\grad_conj\iterative_methods.c +1489762392 source:b:\mes documents\progra\calcint\grad_conj\iterative_methods.c <stdlib.h> <stdio.h> + <math.h> + <mpi.h> "mathObject.h" "customError.h" "algebre.h" -1489612728 b:\mes documents\progra\calcint\grad_conj\iterative_methods.h +1489681364 b:\mes documents\progra\calcint\grad_conj\iterative_methods.h diff --git a/grad_conj/iterative_methods.c b/grad_conj/iterative_methods.c index a2a62ae..d020f8f 100644 --- a/grad_conj/iterative_methods.c +++ b/grad_conj/iterative_methods.c @@ -1,5 +1,7 @@ #include <stdlib.h> #include <stdio.h> +#include <math.h> +#include <mpi.h> #include "mathObject.h" #include "customError.h" @@ -7,6 +9,21 @@ #define MAX_ITERATION 1000000 +void grad_conj_parallel(Vector * b, Matrix * A, Vector * x, float epsilon, int nbProc, int rank, MPI_Status * Status){ + + + //printf("nb_line_for_proc : \n"); + //printVector(nb_line_for_proc); + + + //printf("first_line_for_proc : \n"); + //printVector(first_line_for_proc); + + + + +} + void grad_conj(Vector * b, Matrix * A, Vector * x, float epsilon){ int size_vec=b->size; @@ -30,9 +47,16 @@ void grad_conj(Vector * b, Matrix * A, Vector * x, float epsilon){ norm_r=norm_vec_2(r); while(norm_r>epsilon && k < MAX_ITERATION){ alpha=norm_r/prod_vec_t_mat_vec(p,A); + printf("alpha : %f\n",alpha); sum_vec_alpha_vec(x,x,alpha,p); + printf("x : \n"); + printVector(x); prod_mat_vec(Ax,A,p); + printf("Ax : \n"); + printVector(Ax); sum_vec_alpha_vec(r_next,r,-1.0*alpha,Ax); + printf("r_next : \n"); + printVector(r_next); norm_r_next=norm_vec_2(r_next); if(norm_r_next>epsilon){ beta=norm_r_next/norm_r; @@ -42,10 +66,13 @@ void grad_conj(Vector * b, Matrix * A, Vector * x, float epsilon){ } norm_r=norm_r_next; moyenne_r+=(norm_r-moyenne_r)/k; + printf("p : \n"); + printVector(p); + /* if(min_r>norm_r){ printf("k : %d, ||r|| = %10.5f, m = %f\n",k,norm_r,moyenne_r); min_r=norm_r; - } + }*/ } if(k>=MAX_ITERATION) printf("Solution has not reached the asked precision : %f in %d step.",epsilon,MAX_ITERATION); diff --git a/grad_conj/iterative_methods.c.save-failed b/grad_conj/iterative_methods.c.save-failed new file mode 100644 index 0000000..c84b3b9 --- /dev/null +++ b/grad_conj/iterative_methods.c.save-failed @@ -0,0 +1,72 @@ +#include <stdlib.h> +#include <stdio.h> +#include <math.h> + +#include "mathObject.h" +#include "customError.h" +#include "algebre.h" + +#define MAX_ITERATION 1000000 + +void grad_conj_parallelisable(Vector * b, Matrix * A, Vector * x, float epsilon, int nbProc, int k){ + int nb_ss_matrix_tot = (int)pow(2.,(float)k); + Vector * nb_ss_matrix_par_pb = allocateVector(nbProc); + + for(int i=0;i!=nb_ss_matrix_par_pb->size;i++){ + nb_ss_matrix_par_pb[i]=nb_ss_matrix_tot/nbProc; + if(i<nb_ss_matrix_tot%nb_ss_matrix_par_pb) + h_prob+=1; + } + printVector(nb_ss_matrix_par_pb) +} + +void grad_conj(Vector * b, Matrix * A, Vector * x, float epsilon){ + int size_vec=b->size; + + Vector * r = allocateVector(size_vec); + Vector * r_next = allocateVector(size_vec); + Vector * p = allocateVector(size_vec); + Vector * Ax = allocateVector(size_vec); + + int k=0; + float alpha; + float norm_r; + float norm_r_next; + float beta; + float min_r=1000000.0; + float moyenne_r=0; + + prod_mat_vec(Ax,A,x); + sum_vec_alpha_vec(r,b,-1.0,Ax); + copyVector(r,p); + + norm_r=norm_vec_2(r); + while(norm_r>epsilon && k < MAX_ITERATION){ + alpha=norm_r/prod_vec_t_mat_vec(p,A); + sum_vec_alpha_vec(x,x,alpha,p); + prod_mat_vec(Ax,A,p); + sum_vec_alpha_vec(r_next,r,-1.0*alpha,Ax); + norm_r_next=norm_vec_2(r_next); + if(norm_r_next>epsilon){ + beta=norm_r_next/norm_r; + copyVector(r_next,r); + sum_vec_alpha_vec(p,r,beta,p); + k+=1; + } + norm_r=norm_r_next; + moyenne_r+=(norm_r-moyenne_r)/k; + if(min_r>norm_r){ + printf("k : %d, ||r|| = %10.5f, m = %f\n",k,norm_r,moyenne_r); + min_r=norm_r; + } + } + if(k>=MAX_ITERATION) + printf("Solution has not reached the asked precision : %f in %d step.",epsilon,MAX_ITERATION); + else + printf("Solution found with %d steps.\n",k); + + freeVector(r); + freeVector(r_next); + freeVector(p); + freeVector(Ax); +} diff --git a/grad_conj/iterative_methods.h b/grad_conj/iterative_methods.h index 3f37233..4925c6a 100644 --- a/grad_conj/iterative_methods.h +++ b/grad_conj/iterative_methods.h @@ -2,5 +2,6 @@ #define ITERATIVE_METHODS_H_INCLUDED void grad_conj(Vector * b, Matrix * A, Vector * x, float epsilon); +void grad_conj_parallel(Vector * b, Matrix * A, Vector * x, float epsilon, int nbProc, int rank, MPI_Status * Status); #endif // ITERATIVE_METHODS_H_INCLUDED diff --git a/grad_conj/main.c b/grad_conj/main.c index d291b55..eaf5353 100644 --- a/grad_conj/main.c +++ b/grad_conj/main.c @@ -10,38 +10,165 @@ #include "algebre.h" #include "iterative_methods.h" +/* +Commands : +cd 'B:\Mes Documents\progra\calcInt\' +C:\MPICH2\bin\mpiexec.exe -localonly 10 +*/ + int main (int argc, char *argv[]) { int rank, size; MPI_Status status; - int test=0; + 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; + + 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 */ srand(time(NULL)); - testMatrix(); - testVector(); + /* definition of the problem */ + int nbProc=size; + int nb_ligne_tot = sizeMatrix; + int * nb_line_for_proc = malloc(sizeof(int)*nbProc); + int * first_line_for_proc = malloc(sizeof(int)*nbProc); + + /* initialisation of the domains */ + 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; + for(int i=0;i!=nb_ligne_tot-nb_ligne_par_proc_default*nbProc;i++){ + nb_line_for_proc[i]+=1; + } + first_line_for_proc[0]=0; + for(int i=1;i!=nbProc;i++){ + first_line_for_proc[i]=first_line_for_proc[i-1]+nb_line_for_proc[i-1]; + } - testAlgebric(); + int nb_line_proc_in_use = nb_line_for_proc[rank]; - Vector * b = allocateVector(10000); - Matrix * A = allocateMatrix(10000,10000); - Vector * x = allocateVector(10000); + 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){ + 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; + } + //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++){ + MPI_Send(A_tot->c[i],sizeMatrix,MPI_FLOAT,p,0,MPI_COMM_WORLD); + } + } + for(int i=0;i!=nb_line_proc_in_use;i++){ + A->c[i]=A_tot->c[i]; + } + }else + for(int i=0;i!=nb_line_proc_in_use;i++) + 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); - initProbVector(b,5.0); + /** resolution of the conjugate gradient **/ + + /* initialisation - allocation */ + Vector * r = allocateVector(nb_line_proc_in_use); + Vector * p = allocateVector(nb_line_proc_in_use); + Vector * p_tot = allocateVector(sizeMatrix); + Vector * Ax = allocateVector(nb_line_proc_in_use); + Vector * x = allocateVector(nb_line_proc_in_use); fillVector(x,0); - initProbMatrixSymetric(A,5.0); - for(int i=0;i!=A->width;i++){ - A->c[i][i]+=A->width/15; + + int k=0; + float alpha; + float beta; + float pAp_in_use; + float pAp_reduced; + int done=0; + + double time_proc_in_use=MPI_Wtime(); + double time_reduced=0; + + 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); + 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; + while(!done && k<MAX_ITERATION_MAIN){ + 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); + 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); + alpha=norm_r_2_reduced/pAp_reduced; + //printf("pAp_reduc : %f\n",pAp_reduced); + sum_vec_alpha_vec_p(x,x,alpha,p,0,nb_line_proc_in_use); + /*printf("x :\n"); + printVector(x);*/ + sum_vec_alpha_vec_p(r,r,-1.0*alpha,Ax,0,nb_line_proc_in_use); + /*printf("r :\n"); + printVector(r);*/ + 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(norm_r_next_2_reduced<epsilon) + done=1; + else{ + beta=norm_r_next_2_reduced/norm_r_2_reduced; + sum_vec_alpha_vec_p(p,r,beta,p,0,nb_line_proc_in_use); + norm_r_2_reduced=norm_r_next_2_reduced; + k++; + } + /*if(rank==0){ + printf("p\n"); + printVector(p_tot); + printf("%f\n",norm_r_2_reduced); + }*/ } - /* - printf("\n\n########\nproblem : b-Ax=0 \n"); - printf("A : \n"); - printMatrix(A); - printf("b : \n"); - printVector(b);*/ - - printf("calculation : \n"); - grad_conj(b,A,x,0.000001); - - printf("grad conj result : \n"); - //printVector(x); + if(k==MAX_ITERATION_MAIN) + printf("failed to converge\n"); + 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); + time_proc_in_use=MPI_Wtime()-time_proc_in_use; + MPI_Reduce(&time_proc_in_use,&time_reduced,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD); + 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"); + printVector(x_tot); + printf("b = Ax : \n"); + prod_mat_vec(b_tot,A_tot,x_tot); + printVector(b_tot); + } + + 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); + } + + MPI_Finalize(); + + if(rank==0) + freeMatrix(A_tot); } diff --git a/grad_conj/mathObject.c b/grad_conj/mathObject.c index 5ff139a..16f2b52 100644 --- a/grad_conj/mathObject.c +++ b/grad_conj/mathObject.c @@ -59,7 +59,7 @@ void freeMatrix(Matrix * matrix){ void printMatrix(Matrix * matrix){ for(int i=0; i<matrix->height; i++){ for(int j=0; j<matrix->width; j++){ - printf("%5.2f, ",matrix->c[i][j]); + printf("%f, ",matrix->c[i][j]); } printf("\n"); } @@ -101,6 +101,7 @@ Vector * allocateVector(int size){ return vector; } void initProbVector(Vector * vector, int max_value){ + rand(); for(int i=0; i < vector->size; i++){ vector->c[i]=((float)rand())/32768.0*(float)max_value; } @@ -125,7 +126,7 @@ void freeVector(Vector * vector){ void printVector(Vector * vector){ for(int i=0; i<vector->size; i++){ - printf("%5.2f \n",vector->c[i]); + printf("%f \n",vector->c[i]); } if(vector->t) printf("is transposed\n"); @@ -147,3 +148,17 @@ void testVector(){ freeVector(vector); printf("Ok\nThis is a random (from 0 to 10) 8 sized generated vector, it works well !\n"); } + +void printSystem(Matrix * A,Vector * b){ + for(int i=0;i!=A->height;i++){ + for(int j=0;j!=A->width-1;j++) + printf("x%d*%f + ",(j+1),A->c[i][j]); + printf("x%d*%f = %f,\n",A->width,A->c[i][A->width-1],b->c[i]); + } +} + +/* OTHER FUNCTIONALITY */ + +int cInt(float a){ + return (int)(a+0.00001); +} diff --git a/grad_conj/mathObject.h b/grad_conj/mathObject.h index 2799838..2a5b47e 100644 --- a/grad_conj/mathObject.h +++ b/grad_conj/mathObject.h @@ -32,4 +32,7 @@ void freeVector(Vector *); void printVector(Vector *); void testVector(); +int cInt(float); +void printSystem(Matrix * A,Vector * b); + #endif // MATHOBJECT_H_INCLUDED diff --git a/grad_conj/obj/Debug/algebre.o b/grad_conj/obj/Debug/algebre.o index a15ad74ba1e829337ddc7b94d2ba14f5501ddca8..2d112836bdbd1b587e1ee47f88b4a33b19932dc5 100644 GIT binary patch delta 3849 zcmbPky263ihmo5B1k|J%81yFciVMDAXJ9zP$iR>z1`=jqFrH|d&9sGc;vywIeRc*0 z2QCJNED4B|1p@<v1A~B*zM&aJ07~jHGBD%|PW+_CHdly&VV2ZnIYv3I7mN%HdxaPn z)=5ovW0YevVqjocDl$2XQH|-k$mB_kN`eiH3=FSD7#Ma)L5$&^e3bDcdvNm`m2Ovo z$&9R0lixFnvoct_O4LpkU=mSy*}%ZS(Cy06?ZDC<`sLswCdLal-`$ir?)m|w|8@9e zM<!MFSdnhuFN`-QXE2$F&u@19!r1Nl#oASZzqRE5|Nj%3kEle)Zr;RH%*YF|hohUp z+EoT*zG#p$irI&{U3ow@#Y%t;Jou1_@x)DrZdVaZ!5h8;_YU5ag4-rjx)oy6WJMM; zrU!o~N3u+qEXJCx#?#Hv?JLk7D#Ccm@<J`oaTb-A%nS@KK+eDU?q=+lZdZX$*AJ7e zSPgkX1-e~D7%y16ekeV<xrEi2k*VtE<dtj|jKY&2v1u?)n9R+t$hdy8F1r*X(_{~J z8>Xb+liS$aCUbN2GHJ6<p2d;R^o)HnH|HltiOK&sH!!MCUe6`XC^7jomv?<`Vo7{i zYI1x51Eb_~1_p*V3=9m6bGVrq7&z5IOvxN31_q{y44fc`F-jJJc`TfuM8F7@<KRh3 zO=n<~oX-GK$-^lC)(7DUaG5YNFw9_JVBpSVU{rtz=5PfuGB9L;1naXH7?mKR84L^z z90f)BDPZ^HCYCTTYF%bzVE6<wZcYQ-MOrWyf!zS*u|V9X1#uq-mp&5%!(@;JnGB3Z z5c6}myqFjm(m;Y)42&ia!O4x>67|+cnHU&q!PfkMTVoBihNmnwxg@{Hkbw~@!ori7 zQ;?C!z-T>#5#(VGPI-`4s4NfHXC?*)ACN7X42*UVTXGl}IEqVi!5#x^2D1tn7@eG$ z85rs-K>FwOvB1LI3Bzir2;6EX6sw`KJdk*Bg4ihli3cc8ge#tzfguFyELVt<90ms7 zf};G%tUQACJ|Gi!F*7jafgSS+<QQ-O`#>E731A;c0JCrxmnMa!CNnVlL8NoIi&Bdj z7z073Fip&0;LFP|g80{nfiVIks=>m*5C}Hgm6d@3l7J#0ni;r@q(HhOLF$+$mT(!f zFfcem-5ND{J&#m<B1o!|g@GX(Y{V*%5$qslBGd?oflwX`#5E}(O-vJWxaJ|5mkRNF z2E^}>#0Jj-*&rQHSQr=zKxWU;Wn*CA1X)whn2ll&l*a-I@ob2Z9FP!)@^~O_$OD-O zasv-51A{ZvPx%lH8ORB~I5{zgfw3%vm4P7^Y<VBZa&R6j%c%!vJ7}ntL7c+E1Jwet zfrG1rm4U$uYC|Q&h8zY4{*u(<633kM)TE-!WCq5%jjRj|rc9trF3!%tAOMczdWeZR z0^pR~0O4hDLsEWxQED-3yeR`?<K&CHVs=ds*#uB7XJBlGq=y*p+{BWi%nBn0#ukW3 z1cP7%BLjmHI|G9dgK&Iiei8%IdvW&7s(h}Dyw5;k3Mx<-7#N;RF6ZB@V^=zV_x0WL zckkv<WME=po(LkCf(03vSQy#77?@a?*ycdkYzHbPYYTWuf;4~>K~&m9RkF2KOfC~p znLJNGLdr0mLwI*2NKG?{VA6uAIW>8!K#XL32}53zPiA^vDg(ryP|9espkPG30s{ks z4FdziYiN<k;K;|(%H+h$>e9^2^!TvjQ63f+83qQ11O^6%>(D|9u7>FyNSXm852~h4 zLQ5Bfd?i>OWXA#q1_n1~1_n?O0GD@Zu4iV-M_6)%fq`KkG;6{YF=c@b0a@~dfq_8> zn!OP6zHoUKMh1pjXx>4{r^Dq{7#SE|KodPgzTSzKl_>|Vz=e^4Ap)8(Aqqh9k#PAG zMh1qh&~yctXEtO4D*&Z16$S<d5e87T4`KN-Ffc$^42&?A6r5$iSPv6?0~cgxf{7`@ zS?}SjXl9t~Wo8BjRj_sPEDQ{4VAfO?m@G3Zj8y<<?PrDQI0s|ZGu(wS8Q#EI%xnw{ zpbRO(AO&X`urV-bfGu%mV_?t(v%=tFnQ*aAHc$vKFt9Oz^0gLN-ApzH25m6wFkJQo z8v}zDLp@0GWw`VQxb#;x1_m9l79n<!8jyjYd<+rOg^L-n!_-;A#q8KYMuT)^vBNAb zgv*w}Woy_O>KQ~BKt|7nD_p@23(U=M);>7vB%F1Hoq<6Y?7;hQ78?Tt11J@6GvqQb zFz|s*E@fZ<XAo|NR7M5{IZ(01umR4h2gNo-p%@cPS_RHBg0mc$U<QW5SzU0}Ot`w` zaMo5h>mr<WAFksIgjLVL#vsiMGg^xo<^&5k3zTUgt`32#%Y?J0!dXk;I<CN3kKnTW zEHFFdSYUSeu`n>yLyXRX3s%4tu7I<)!)1@cSuCtD1BF>(2I|AbqT#G8xNHTSH3cqv zs2<L|2$#MOXZ?n=#Mxlh*}+-9Y%q(X;j9X{>^wMYEnIdtob?^bs^?|^B^ppKgqs0W z(?HTfGd%f#%1)4&2!jJuOoSl?&T4_PmcUsj;4DxZ8={wk5#oFi1`RmN1H|G2r{D|_ zbMjx&<oa?31_n@Dl#xM!feBo3wK6a;fSQd65l|x+)SN?ztYu(e05z!)A_o~57(fjn zgveP21_n^O1|f16R4KABFd#(Ui!(4VfEoq}p??ev3>#S|9}tsb1y!cTlkbbw8uKuM zoyNe*z`(%F2<otbI%yCw7%2f&0}5VdM!m_3;=-U}l5z4faV29@s3Zs208pn5Dge{X zz`)=L6#}&fnHh~HI*Ky-Ocs<-77m9>fVz~-jGzu3_hfeoWzR&YI0HQF3Nb`#F+_SX zMCMN3ETPP}cJg%zWx-u2vd0)1Cf|_^pPVEq%n9$$OwN;37RJ)(p4=~K%?@qwP2Mkg F0{|HDOR)d| delta 2679 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 diff --git a/grad_conj/obj/Debug/iterative_methods.o b/grad_conj/obj/Debug/iterative_methods.o index 519f3eb08eb188be76b7fd5afa2ba6cef9faed4b..3425d61448d3975fda686a3bbf30bd29767d233a 100644 GIT binary patch literal 4553 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 delta 1992 zcmX@9yjqsmhmo5B1RS^-7!)S*iVGGnF)*BAWMFv12@+;tkeX<k&f3Djz+f|Rp|YM0 zGXui`76yh7To73n1_lNP1_391Lo<i~lw85U!0?BC;wLq>B^(S465NyJ80ENbGcYh5 z;b36U;hyZqC^ykhXmS~&6w`dp$&(nB>Ma-;7&db<FqlEy!@vkO*}x&R^J(*&jBZzs zZiY_RC*7`3I$2a+fNbe>eSpHdgTlLk!n<<Z^$SSPP1Xhm28NrlZ*IQ38T+E!RiM*F zg`?Y*r_-fgg{9l|3e0Q}(?x~n=8KyTZpMIAaCEwW6g)sExPc)8m%JH!q}%mKr|XB8 zT8s<~VB<lWZ@@I)bp3Ge<IUI$-L4=*cy790xET`!vIXQE7Lco;UW6!sI1pq4+<hP| z4`7Z2JMaO-Id@=obi3Y}oW!hMk0}nd^900WP<go9nq9vz-gG^4Gxozx*AF*RU)*;6 za_{F&*BAE=-i&>5)Ah|w*AF*O-g<fe!Mt*&*P1t7Uw{Sf#;6F~1-s)5$Q{R7R6wEq zf`Ng9fdQl-_RZvv%o2>dCUddKNh&ZfFo0w5wQ#p9Onm|a1H)t=7Bzj4ub|$aaPshk z3E2u(3aTkO3N<xFH8l#h3aW+%dZuYQ3b`P58rS6cEU8Qu%#+zzD;e`9H?V%HXD&-k zF3B%q;9+K&&&a^QQk+?p%D~LF667M5WCmt-uqaCj12YFmjDvxdWho;A0}~5NT26jq z2?JXgL_afE9wP$-b8ccuQDy}L4>QkakZI+aDJ2;U%zPlN3@jO`nduoN49xr>E(^$X zfqIZKkf9)J*nA<nnT7T+GBB{G7bT{|C+Fv7F))JjPaYEk1LGVCW(Ee1BnCz<5QAwV z1BW96BbOXA0|V1U7LE$II0r{+L2+hIejWoO7udlQc{o9Si!Vz}W?<w7xqxY63}<~2 z10yfQqzKNU_`KAL5(Y*-h(HKu0RtmHgdM=?Si!(30O9y>W-~AfL5#@ZOw1|BNMv9X zhS=i4nU`Ob8(+l0C;}14fC@m(7KMnqa3-aeBr-7ii9z@doVl5KAYI}RehO!9er0N2 zUMfgT0wR{cz{;|Yk%57g<tHNp16L9w1A{&@0|Pe$Pkd&65(CqF73Rq?oFQ&{jP{bu z99G=c-0G5oj6!S<64RU{8HE`bI9M4V;-11x5)2HSCMaAkMn+FzkTPyX1_lP6$<|z| z!k{1rr34VZ&cMLH#LzIgn9G0i6)u&@jNB4ToQ#v@xkZhhax^n333J#!oyeic@zf`s zL!U#KNm-b=AdP{Eg^}$E8?*3<i5z=44A!n)yOxQWfst`?DYr#E*mOrej#efoURLHT zrlUM8EDWLy3=9$s3=AR+%5at;oMjJZ`7<yufRY6pLjeN=gCtnTL<R;1DKKj>0|SFJ zn6-|9fk6h$I>*4kAPZ)F1FNeCS;Ef<(`?8H(`>^C(~{2!Go~Lddm9w^3=9lx3=bF? z805ePDl)+wqs9aiGlPp+!^PZ~7#QTiIs%y(>Y>aSxL`V*#m2zEz{dcJ+;Rp622j1h z#!%0|z#s$`6Jdghfz<JU#RTB$df_Zk*#Xik!l0LynUe~NMFs|jfBzX6(is^TCcoh| znQX)-#0rWBsmY#v>5MHC9Yu{Rpz2r|7#NrtZI~f;K?R`{sEPwILH08<u9)a3$~b8< zKff~nLXao}xF};_X1qPwkzbT??c{2HW&Ryd8BmSI%xD3UF+T(qV_;BVU;?u*fk_Yn z6L|pQfH6$u^W>}i%8cBTWd-Cxsf9rvRQthIXfrZQ{wokR`LuxC<i7&ulkEkIxYLSK IQ=tVF0Ot#&6aWAK diff --git a/grad_conj/obj/Debug/main.o b/grad_conj/obj/Debug/main.o index c5611a3ed116db893bfc856ffcd9d3680ac00b64..0afdbdb4f64a05b197a92d55d5aec4ff85645881 100644 GIT binary patch literal 8397 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 Hc$fhInM<8C delta 1582 zcmX@>I9-O<hmo5B1k|_~7}O{7iVK!7GBBKBWME+71PL=R2u(CiXVYL{U~pibxJXGa zfti6JgPDP02UMCJB*P%!q;F^jQ4b|wGcYimV4L_!jcqeK1H(Vg$#RTxTvr(w7%sCj zFbHu?c4JgxTEQ_ni&2efGsomfjB4t~IT#pZxFFgY!KNBGgmyj+ZhrEi`AxtJki>Bp z6_3gKOcM2A9)dW|q9UNqzyKELbWw3R?xMm15<nAoK;zqh)Uh%!Fm$`9xOB3pfc4*e zcQZzXrQ1ct1}1`}$^jx)&%kipMa2i?q}N&9E-DV)4jkPfDn17vF)?1~W`Ht#Wdv}_ zF<!U{veluRV^?QKM@Q$0@2`4UxDNhc?mX0a;@}T?%|o3RI$cy`Zo8<++&g$vy4gj= zhY@TVgSCrFy-#V^aTXPj{SY^^g4j1>RCvJdc2VH~DeZIt`vdN?<18xt4A4;80n*zY z`{(50<iwoh(wxMS%=|nBD+Px1qQn%1<ovuWg`(8r(wq{I7{gxkHq#hp1_l<8E(R9H z$s2f+m`WHYi|~Eq1|<Ln5#}1klZ=x+_){4ZC$HmI*OX^sU|=cEtV(5IVcQAP#gfdx z!VVT?DPdsY0Euxhu(GI5{>LvS@Q#szfjKv^q$sn3fro{sc(RIsYJD*i0|Q72NE4ec zM3P0whKYfJD>pGSkAaaFWC+M?P?BYwW5&$Dz@1o>o(z>?nh55WF);Fiq?jhM@DwHH zWiv4Hf%Nf!9S33a7MCQJlom5E@}Fd6U|=fI;4Milt}kI=6a=YcE;+%#o5a8<X~WFG zz+7^Kf!C3NQOXI-Il#bM!N4dDl3^;b;akJNz|g?Jz`&cyz^DMxdxn95ftAId5k%@S zfyhcG1_u66Mh1ppW(EcU2Eq8u{3HgZ_a4j)3=E8djH(>M+{_$;jFXE*mT59D@R~3% zb69a(b9)LiNiZ<*aWe`s3b8RT@G~-c3Ns2bFbF6zFfa&Cb`w?Q1BC-9JV5v&!{kcQ zc?LX;^J1Dg>>{J0K68|Q;jraU<gjI6Vqu;SBA8MI8JJiY*&^7OxpwVlQWN12nd~F( zQ4co9k&mO5$%&WMy_uOglkw<b9u^h`P*EYpz`!8FAkV<SAPr`zGcYj7fLS^W3=Fbh zmLUTJgB+LzDilC!MHrkI7#I}5Vo?kX3?N5~Fl52Sniv=ul)$o67(5vml)=mu3=9mQ zge}6L&&a?4DjL`rOc)s$RKc=VaIq*x1_m{-SR!034Ww@Je@SJ9Bu0>f85p=3PQh7| zLCKSWfq{)do_TVIR2M7A%R-aIrPCQTCOV1=M}mS76mtv=49tw6GLL=oa%p+S*ApE@ zC*P4aV!FyOSwN<5@)a4C$@65y>UTlagS^NDW*-BSAVPrwB60=90b`iR6EF`%z(l@) zIA9DDVF49|C?WzVBJl;KCB>8V<pc#ZP{fTHC-0G4t5T9$TmsEI@gR0sYH~?_5d)a* sn3JBGRFs)KxnEw1FEcN*B%mli38G-~dU>(QSLFq`K*d2ks5oE%06>N-EdT%j diff --git a/grad_conj/obj/Debug/mathObject.o b/grad_conj/obj/Debug/mathObject.o index 2b419c5fb1c3ebcf4acee0206d84d84d17ddf09d..6eaedbdc6b4f32cbde9bd2183c7d52a66f6eabda 100644 GIT binary patch delta 3082 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 aO6hLK(#@<gLX14|;ARD+qMytz69xe4U-2mb delta 2410 zcmdn#@WzVQhmo5B1a3(%Fz8O?6&Jk1%D`}jk%7TO1SHJBU@_4&ooxam1H%ILiHnr< z#Mu}a3^*AWD#Retx(o~q4h#ZL`i5o@0Vt`%$iU#vKk<_qTd@EGgO$W&IYv3IBa93T zlLZ(U{3Is3F)A^I3r)^qRAb5)nmmb7Nf0F2EX2SNAptRhck)rjKYSgG3=H>v-gf1= zck*WJo5=^*B`3dN>S64dT*~~PmxF<U;RQ(baTXP&$&D;Zj0ThS*~QJu{{8=doJGYI zCf)7&rISVFh5CQ6um_s(K8Wgs$sbv~8P`m<WzCwrhE<iZWAY`|Ka9U8pJ!9HWoCq0 zG~wjo(9WmLZ#0gxs0hLYLAJxpJkFv5c9rVC|NlE(zZ_>#0XvB!8e)m-WIuLUJ8hUw zsKYd|JM05Qj|EKigp-F=P4$c>&*X?^Verr9n(V--G+C0foEaoIfztves4)38rxp(= zT)_B&gYaZWu41MutedxSaj-CkOy19@7IT}Kfx(S|fq^HJfiYtd0|Nuo#2f|&fwat= zoUqj7lKdhD#vBb61_omW1_s7CT&xTXeC!}*P7(`9Edys+Vh#gi&TK{ykA+*0g@Hi} zYFzGQM}9G;g6PSS{4$yaaP_Il@yYoGl?;qfAr|gx76t}$sHWn{^Z3Q;%eS&HFeriS znKKD)WjWLc2Ht|A%)Anq^Xjg%FffFH)q)Z&#Cdg4wcK}+%&v#~kG~|f7;Zp^E-M4W za<BpaSs56(*clWV7#O=DCgd;(Ml&)naIrBk2r&r9XXYm{FuniJy7{hv03#nGqo**V zFav{-A_D`1@MLizRbG%2z`@PHz;Ix*r%*8C<hjDxOiaw1Ek&#u6+=LBj(i-gOisM4 zF3rqL-iIBJ^02VTFfcG^FfuUcOr9z#&lo>>tEfEV&dFCr<r!~J{wgY8ZwPfF157W| zVvsfl27U$x1~mo-1`!5BILn`bfk7QCRtgte2^YHzXT1bj3Rd@(fq?;(li3*NFfuS` zfW=lY!o--E>KPa`!GiKkFqRgamBj>8n9l@>eG!IECI$v=u#OdQ*|kgz3_4)3EpV}& za2?m-Vt3$T-(X_(48P%;d6{9>2{FU0Q-O<VGQ%t>fQyyF#k!bbp|uvyI?W6VtuM?l zzcaAF>?mge$<~7c_$Uj^?-$^#zi@?2tT4wYvcfd0vBDf<1{br2i#fr?+~Im-;bKW} zu^Lu}dT8u4!Zpu=E1VA(+Xxri2G@K7E_N2Kj*WqVL5hKaft#U#fq_AQfq{XIp@M;d zK@KdI!N|a%0A_85v+4zyU<w_WVA6hYu@*RMGF)~coOK*73yN8Yb*#)V^F)|o<|)Bh z25?zd2&<lfjUfxdWME^cgez=^i>-mPcEe>)!o}{vS<Eaji-lNV7MsDvLf~RmaIsDn z28Mb_fJ}!=FNI5=gtKnIWxv41Bv@hA1;SaSa8?T|%n1wOVjJLM``}`a>fy|faA{C1 zg6c?aa126%wGAGhAP0lQL>OG4Vj>JFa8?JLwF1sM0cU~gQixs-Mu_wEMHoOeIYiJ0 zDk#E`184QXS!+P7$%WFFGeOk`BZC416R6B%c*MZK5Y58CfDn1dz`y`1=Mf^m7#J8p zr8z=`osoe7R6IjO^h#1IO2DRp%wb?)W&{<t7LzZ^q%%&K+$bw*EX)XzW@P}$f?6q{ zmI*`*M#@9gfC7-2Q3s@tQFromS!Gols0^s;W@ZGnM4$pNtqcqd9+U6OD)R?JCAh%$ i2u^eq6^?@nff`Z}&AgK><+>R&HXoG}Vw`+JE))Qgol%1T -- GitLab