From 7cdce459933f5e3ad37b4ca9ef27ec6f1da06acf Mon Sep 17 00:00:00 2001 From: Nicolas Fley <nicolas.fley@student.ecp.fr> Date: Thu, 16 Mar 2017 00:21:26 +0100 Subject: [PATCH] convergence of iterative gradient conjugate --- grad_conj/algebre.c | 107 ++++++++++++++++++++++-- grad_conj/algebre.h | 13 ++- grad_conj/bin/Debug/grad_conj.exe | Bin 71699 -> 77274 bytes grad_conj/customError.h | 4 + grad_conj/grad_conj.depend | 17 ++-- grad_conj/iterative_methods.c | 52 ++++++++++++ grad_conj/iterative_methods.h | 2 +- grad_conj/main.c | 24 ++++++ grad_conj/mathObject.c | 20 ++++- grad_conj/mathObject.h | 3 + grad_conj/obj/Debug/algebre.o | Bin 3489 -> 6807 bytes grad_conj/obj/Debug/iterative_methods.o | Bin 1497 -> 3755 bytes grad_conj/obj/Debug/main.o | Bin 2576 -> 3607 bytes grad_conj/obj/Debug/mathObject.o | Bin 6808 -> 7532 bytes 14 files changed, 224 insertions(+), 18 deletions(-) diff --git a/grad_conj/algebre.c b/grad_conj/algebre.c index 6a1f08d..37371db 100644 --- a/grad_conj/algebre.c +++ b/grad_conj/algebre.c @@ -5,22 +5,100 @@ #include "customError.h" #include "algebre.h" -Vector * prod_mat_vec(Matrix * matrix, Vector * vector){ +/* MATRIX x VECTOR */ + +void prod_mat_vec(Vector * vector_res, Matrix * matrix, Vector * vector){ + if(vector->t!=0) + exit(TRANSPOSED_VECTOR_USED); if(matrix->width!=vector->size) exit(UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION); - Vector * vector_res = allocateVector(matrix->height); + if(vector_res->size!=matrix->height) + exit(CONTAINER_RES_DO_NOT_FIT); for(int i=0; i!=matrix->height; i++){ vector_res->c[i]=0; for(int j=0; j!=matrix->width; j++){ vector_res->c[i]+=matrix->c[i][j]*vector->c[j]; } } - return vector_res; +} + +/* VECTOR_t x MATRIX */ + +void prod_vec_mat(Vector * vector_res, Vector * vector, Matrix * matrix){ + if(vector->t!=1) + exit(NON_TRANSPOSED_VECTOR_USED); + if(matrix->height!=vector->size) + exit(UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION); + if(vector_res->size!=matrix->width) + exit(CONTAINER_RES_DO_NOT_FIT); + vector_res->t=1; + for(int i=0; i!=matrix->width; i++){ + vector_res->c[i]=0; + for(int j=0; j!=matrix->height; j++){ + vector_res->c[i]+=matrix->c[j][i]*vector->c[j]; + } + } +} + +/* VECTOR + alpha x VECTOR */ +void sum_vec_alpha_vec(Vector * vector_res, Vector * vector1, float alpha, Vector * vector2){ + if(vector_res->size!=vector1->size || vector1->size != vector2->size) + exit(UNCOMPATIBLE_ALGEBRIC_ADDITION); + for(int i=0;i!=vector1->size;i++) + vector_res->c[i]=vector1->c[i]+alpha*vector2->c[i]; +} + +/* VECTOR_t x MATRIX x VECTOR */ + +float prod_vec_t_mat_vec(Vector * vector, Matrix * matrix){ + vector->t=1; + Vector * subVec = allocateVector(matrix->width); + prod_vec_mat(subVec,vector,matrix); + vector->t=0; + float res = prod_vec_t_vec(subVec,vector); + freeVector(subVec); + return res; +} + +/* NORM */ + +float norm_vec_2(Vector * vector){ + float res=0; + for(int i=0;i!=vector->size;i++) + res+=vector->c[i]*vector->c[i]; + return res; +} + +/* VECTOR_t x 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; + for(int i=0;i!=vector->size;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){ + if(vector_res->size!=vector->size) + exit(CONTAINER_RES_DO_NOT_FIT); + for(int i=0; i!=vector->size; i++){ + vector_res->c[i]=vector->c[i]*scal; + } } void testAlgebric(){ Vector * vector = allocateVector(8); Vector * vector2 = allocateVector(8); + Vector * vector_res_5 = allocateVector(5); + Vector * vector_res_8 = allocateVector(8); Matrix * matrix = allocateMatrix(5,8); Matrix * matrix2 = allocateMatrix(8,8); initProbVector(vector,10); @@ -28,14 +106,31 @@ void testAlgebric(){ initProbVector(vector2,10); initProbMatrix(matrix2,10); - Vector * vector_res_prod_mat_vec = prod_mat_vec(matrix,vector); + prod_mat_vec(vector_res_5,matrix,vector); + printf("prod_mat_vec : \n"); + printVector(vector_res_5); + + vector->t=1; + prod_vec_mat(vector_res_8,vector,matrix2); + printf("prod_vec_mat : \n"); + printVector(vector_res_8); + + printf("prod_vec_t_vec : %f\n",prod_vec_t_vec(vector,vector2)); + printf("prod_vec_t_mat_vec : %f\n",prod_vec_t_mat_vec(vector,matrix2)); + printf("norm_vec_2 : %f\n",norm_vec_2(vector)); - printVector(vector_res_prod_mat_vec); + printf("sum_vec_alpha_vec : \n"); + sum_vec_alpha_vec(vector,vector,-1,vector); + printVector(vector); - freeVector(vector_res_prod_mat_vec); + printf("prod_vec_scal_u : \n"); + prod_vec_scal(vector_res_8,vector_res_8,10.0); + printVector(vector_res_8); freeVector(vector); freeVector(vector2); + freeVector(vector_res_5); + freeVector(vector_res_8); freeMatrix(matrix); freeMatrix(matrix2); } diff --git a/grad_conj/algebre.h b/grad_conj/algebre.h index 2482e95..b1a61f8 100644 --- a/grad_conj/algebre.h +++ b/grad_conj/algebre.h @@ -1,6 +1,17 @@ #ifndef ALGEBRE_H_INCLUDED #define ALGEBRE_H_INCLUDED -Vector * prod_mat_vec(Matrix * matrix, Vector * vector); +void prod_mat_vec(Vector * vector_res, Matrix * matrix, Vector * vector); +void prod_vec_mat(Vector * vector_res, Vector * vector, Matrix * matrix); + +void sum_vec_alpha_vec(Vector * vector_res, Vector * vector1, float alpha, Vector * vector2); + +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); + +void prod_vec_scal(Vector * vector_res, Vector * vector, float scal); + +void testAlgebric(); #endif // ALGEBRE_H_INCLUDED diff --git a/grad_conj/bin/Debug/grad_conj.exe b/grad_conj/bin/Debug/grad_conj.exe index 7be3e4cba3ea6c3c1c4ea50e36694bc24fde84b3..9bf973f8c18faa718cf3d1a71920c3af1a2e7010 100644 GIT binary patch delta 17875 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 T#wq-Wc~kJ@<#t|nMm9kJ0fASX delta 12813 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 diff --git a/grad_conj/customError.h b/grad_conj/customError.h index 5047c43..825e95d 100644 --- a/grad_conj/customError.h +++ b/grad_conj/customError.h @@ -4,5 +4,9 @@ #define ERROR_NO_MEMORY_LEFT 1000 #define UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION 1001 #define NON_SQUARE_MATRIX 1002 +#define NON_TRANSPOSED_VECTOR_USED 1003 +#define TRANSPOSED_VECTOR_USED 1004 +#define CONTAINER_RES_DO_NOT_FIT 1005 +#define UNCOMPATIBLE_ALGEBRIC_ADDITION 1006 #endif // CUSTOMERROR_H_INCLUDED diff --git a/grad_conj/grad_conj.depend b/grad_conj/grad_conj.depend index 9f7b888..cce5b3e 100644 --- a/grad_conj/grad_conj.depend +++ b/grad_conj/grad_conj.depend @@ -1,40 +1,41 @@ # depslib dependency file v1.0 -1489421217 source:b:\mes documents\progra\calcint\grad_conj\mathobject.c +1489617942 source:b:\mes documents\progra\calcint\grad_conj\mathobject.c <stdlib.h> <stdio.h> "mathObject.h" "customError.h" -1489420631 b:\mes documents\progra\calcint\grad_conj\mathobject.h +1489612623 b:\mes documents\progra\calcint\grad_conj\mathobject.h -1489421052 b:\mes documents\progra\calcint\grad_conj\customerror.h +1489596942 b:\mes documents\progra\calcint\grad_conj\customerror.h -1489420337 source:b:\mes documents\progra\calcint\grad_conj\main.c +1489619150 source:b:\mes documents\progra\calcint\grad_conj\main.c <stdio.h> <stdlib.h> <time.h> <mpi.h> <time.h> + <math.h> "customError.h" "mathObject.h" "algebre.h" "iterative_methods.h" -1489419800 source:b:\mes documents\progra\calcint\grad_conj\algebre.c +1489617314 source:b:\mes documents\progra\calcint\grad_conj\algebre.c <stdlib.h> <stdio.h> "mathObject.h" "customError.h" "algebre.h" -1489419451 b:\mes documents\progra\calcint\grad_conj\algebre.h +1489617252 b:\mes documents\progra\calcint\grad_conj\algebre.h -1489420232 source:b:\mes documents\progra\calcint\grad_conj\iterative_methods.c +1489619088 source:b:\mes documents\progra\calcint\grad_conj\iterative_methods.c <stdlib.h> <stdio.h> "mathObject.h" "customError.h" "algebre.h" -1489420308 b:\mes documents\progra\calcint\grad_conj\iterative_methods.h +1489612728 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 9666c0c..a2a62ae 100644 --- a/grad_conj/iterative_methods.c +++ b/grad_conj/iterative_methods.c @@ -5,3 +5,55 @@ #include "customError.h" #include "algebre.h" +#define MAX_ITERATION 1000000 + +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 4e6cc23..3f37233 100644 --- a/grad_conj/iterative_methods.h +++ b/grad_conj/iterative_methods.h @@ -1,6 +1,6 @@ #ifndef ITERATIVE_METHODS_H_INCLUDED #define ITERATIVE_METHODS_H_INCLUDED - +void grad_conj(Vector * b, Matrix * A, Vector * x, float epsilon); #endif // ITERATIVE_METHODS_H_INCLUDED diff --git a/grad_conj/main.c b/grad_conj/main.c index badc960..d291b55 100644 --- a/grad_conj/main.c +++ b/grad_conj/main.c @@ -3,6 +3,7 @@ #include <time.h> #include <mpi.h> #include <time.h> +#include <math.h> #include "customError.h" #include "mathObject.h" @@ -20,4 +21,27 @@ int main (int argc, char *argv[]) { testVector(); testAlgebric(); + + Vector * b = allocateVector(10000); + Matrix * A = allocateMatrix(10000,10000); + Vector * x = allocateVector(10000); + + initProbVector(b,5.0); + fillVector(x,0); + initProbMatrixSymetric(A,5.0); + for(int i=0;i!=A->width;i++){ + A->c[i][i]+=A->width/15; + } + /* + 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); } diff --git a/grad_conj/mathObject.c b/grad_conj/mathObject.c index 246086c..5ff139a 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.1f, ",matrix->c[i][j]); + printf("%5.2f, ",matrix->c[i][j]); } printf("\n"); } @@ -94,6 +94,7 @@ void testMatrix(){ Vector * allocateVector(int size){ Vector * vector = malloc(sizeof(Vector)); vector->size = size; + vector->t = 0; vector->c = (float *)malloc(size * sizeof(float)); if(vector->c == NULL) exit(ERROR_NO_MEMORY_LEFT); @@ -104,6 +105,17 @@ void initProbVector(Vector * vector, int max_value){ vector->c[i]=((float)rand())/32768.0*(float)max_value; } } +void fillVector(Vector * vector, float val){ + for(int i = 0;i!=vector->size;i++) + vector->c[i]=val; +} +void copyVector(Vector * vec_original, Vector * vec_copy){ + if(vec_original->size!=vec_copy->size) + exit(CONTAINER_RES_DO_NOT_FIT); + for(int i=0;i!=vec_original->size;i++){ + vec_copy->c[i]=vec_original->c[i]; + } +} void freeVector(Vector * vector){ free(vector->c); free(vector); @@ -113,8 +125,10 @@ void freeVector(Vector * vector){ void printVector(Vector * vector){ for(int i=0; i<vector->size; i++){ - printf("%5.1f \n",vector->c[i]); + printf("%5.2f \n",vector->c[i]); } + if(vector->t) + printf("is transposed\n"); } /* TEST BASIC FUNCTIONALITY */ @@ -126,6 +140,8 @@ void testVector(){ printf("OK\nInitialisation : "); initProbVector(vector,10); printf("OK\n"); + copyVector(vector,vector); + printf("Copy : OK\n"); printVector(vector); printf("Printing : OK\nFree : "); freeVector(vector); diff --git a/grad_conj/mathObject.h b/grad_conj/mathObject.h index 7a17847..2799838 100644 --- a/grad_conj/mathObject.h +++ b/grad_conj/mathObject.h @@ -5,6 +5,7 @@ typedef struct vector{ int size; float * c; + int t; }Vector; @@ -25,6 +26,8 @@ void testMatrix(); Vector * allocateVector(int); void initProbVector(Vector *, int); +void fillVector(Vector * vector, float val); +void copyVector(Vector *, Vector *); void freeVector(Vector *); void printVector(Vector *); void testVector(); diff --git a/grad_conj/obj/Debug/algebre.o b/grad_conj/obj/Debug/algebre.o index d7a488fe512475e6c801609a47c3cc1e17b198fb..a15ad74ba1e829337ddc7b94d2ba14f5501ddca8 100644 GIT binary patch literal 6807 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 Tf(8rVe3*OzC}xlif=U1YaL8Z7 delta 1805 zcmbPkx=@<ehmnf`1QfU!7!)V+iVGfLWMEjr$iQ%h10>AAATZH1+)m#F!hw-O%nS?} z%nS@UoDdOS1_lNP1_391Lo<i~lzhp+z);0D@sk=`GCKpqJI={+jB;G(7#J9u*%=s^ zxF)+X%CYe=FfasiOwM9dV~n4;P-OB_Mt-#j1_p*=4h9Auh~pTTz~&n`gmyk{exuRt z%F!**?aDLx1EZLv14}21$_tQvovv?=yM6(&URQU!zL_k|ET#XZ+kvG!^vl6VOpJ%R zUBNuxF9#noF`l@|05ZmbqZ`WaX6W|)Fgb-;S&pNd!P@mh>5^vGFN|O{EY_}H_*={V z|Njp%_6n=In2QPvD0q&usIW3HFu-h|tj{JU|Khld3Jb{D-L79?E<*^tnViC=s`COS z0aD|l!qV;f1|-t{@BjZ!*C*YsPe447N4i~~Oy0+C!ZG3G;RzEa@G(!G#gWf+ka03M z=eK$eW|j^{1_qYm%&JrdX14ht^(@H@%<N!M23D3nMg|5Z7M8S}{KOIlwy@OXlKdhD zX3i8w1_pMJVjgDhn;-+qGgC@37?^n>CS;^$re~BeF!O=9EFc5<L8>?ySi#n@`6iYW zWmYgS*9$IXWMJSZD9TTX&rK|eFH22kVC2XJ#S{Yr!$}4P2F5uc9yo<CauhQ$FfdJI z-~`zWQN}cpg{utgsQ9APVg^QTkZPuhDcpt(3=ESQ7#O%R85ns$u3(y&!|lVsz>o?O z%wk{!JFT8+Vg>^P11rmPMi6<Qk%57yB(=E2F(*AWsVFm<fl(CXh#z2w{9<BY;00SP z2C*dvYPAsqqc}t)1C)jt7$qPMP2tJ~`_qVlQ4%7O0M!9<Y<xjcz9y2l<snAIFz`iy z9K+1Oz|SBMpP8S;!1VqX(_~e?d~;7>K}I1q2Z?D;l8nL(44kYC%zRed*4&=LOcD$X zTqX?690)EqHzP<j0|U=w0e*2gUK13>e2k2q!XQKV6&V;91SY%ktMVOW1jQ%>pJJF? z!QaXznSOmYhwx-}0cCAlgY>6QInp`OIrPEMfWv3qy0vT9u4Q6oU}S{&lmQYKlVt=g z>p=m>;K;|(%H+h$%5?N74+{%}3<Cp$4FdziSq26MP@p2@zkubz3M3gA7(^Jf7#J9& zz^v<V)-yQkF9QREG+0)I5ysMDWB}_IVX$RnV5pY`O9#LOlNlKpAY#po3=DE$Sy1Yh z2eW1}GB7|`pmGbsTF=P9pa7QL1!u7_Fff23nVTUOlyDdr7}yv}85kG@85kJ28B!S; z7=*#BW%Y0-BNGDyD2KB#2r$8<<=`wwxNI1l)d^?KfUDa9XMvo+4You8?u2GI3*=ys zZR{cp4j{qFe?>!?PBKhBAST5MieQ1s_r*dd2Cx`|Tn&nA76t|eW=2q94DuI91c4i& zOpt-hj4vlTigNZth1e#q6_+-i2jzjX1v4Y4P)15aP`Oo58dTUZGxAMz6y@Iv6$0gJ zW=6q@j-tW`phBQhkC_ovb~8<Omr$-h1r-NH1*BZKg(30^L*y5R2p8O83gDW6fk7NY pL>WaypOJw<Z}L6KP#)y+Y4SPA(#if(j>6EgFg~p)H5FQ(0RXLwF|7aq diff --git a/grad_conj/obj/Debug/iterative_methods.o b/grad_conj/obj/Debug/iterative_methods.o index 797a45098251cbfc9931813348776a3bae0bd086..519f3eb08eb188be76b7fd5afa2ba6cef9faed4b 100644 GIT binary patch literal 3755 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 delta 724 zcmZ22dy|{jhmn&31U@k{FbGZL6`$xMGSMQ$PTvG1h`{ZP3=B1l3=CJ8A!1An3=9qo z0#5pdW)J}=nZv-qz|1`Hlai$b0|P@oGXuj5s18P$4ii(TS_oyyz`)QBRRb28?91pZ zb^uuftkb}unQ`(VmdeS_tkLz1mqHjB7+B&9N{Sd5uYlMLEb+;CB@B#L7cwv~u&~4@ zB^IYLFkS;maj?Xv<s_yvFkT1A@vy|FW#*(ZFx~+11X$veGZKrEO4Aq^Z-N9wSmKjP z(~2{z7#MGX_!2DfCAkG@d5O8H42-uy#>p_STC*HwU|?W#^Yn3LV7zmdfq{XEg(WQ~ zKe2>?J&KWmp^A}#frEiFJ~Kawf$@Dl$m@)PjH(>M+{_%4IXPVF85uo=8HE`bI20Ke z7&uKBm^rMtt+_pg?Imp_85kHuKqi6%g9S{&2vEo|G3YZeFfcOy=Hq2xWMl-J&A`Bz zY^9%@nU`L!pP84OQ<{>>z))P0l9{iU!2nX>?(A%(pyBQps;OYAXRN1W05Xw{fq{XG zfq{XWp`3w%fe*|AiE)5flkK_18T}_$bIVVD#4S8|Ew}r`02bq9kUmfVgQA%clqf(6 z0V)Wk@}V><SWV7EM^XM-s1V3>W=4t0_jyG5d!S<MU}csQ9YvLAK!rdll9^Eu%0p0# n85kyi=QW?ai&s=Qvm~`Bu_UuBH9j}BBqKkiSTA|<cV0&T>X>e8 diff --git a/grad_conj/obj/Debug/main.o b/grad_conj/obj/Debug/main.o index 4e88e17f0dd7d1fed42d8b72bd526874f303500f..c5611a3ed116db893bfc856ffcd9d3680ac00b64 100644 GIT binary patch delta 1812 zcmbOrGF^t(hmo5B1k|_~7}O{7iVK!7GBBKBWME+71PL=R2u(B%_tYy&Ni0c(2!Kcp z1_lNPW)KU39T*H8^i2?a5G#S1fgyvLfnf*KF!qUS#aUl7Ffg2$?8qoG@vbo2W_AXK zf1DG)$#Gp}U|_h+&cGnVHCc{PiD?DLWG6;7rp+9avlx}MZ5S9Bj&m?D$Z&y-Wnf?g zIe@{yA++;paPyN7&2Iu;fFzE)sCZ1?#;9I@oJB=Ioq+)?*y*C;a@<9Q1tfqb?tsR( z0jXnUU|{HWQE};HQ330}`R-<n3QM<(iVaKzNtFYVm=DMaud}*cRO%hN9XPr}RD2FT zVq(0|%>ZTg$_RA3s9=|4yl@j_t3x-(uFj5*j?NR`U-hzZ9sI%Ed8qTm!5{LPhdM8G zx~Rz9c2SYJckrfkvx|xkBiJ+sYZn!t(yrqyDj@s8POiVn3gX<1QQ-l*+eL)~q_ooo z><_rlj<cxnGeARW2S{^w?4Of|lM{22OLG!SGV}8ktP~j1ixN{5lJoPj6pB)dOLIy< zVhnrD+e~Aa85meVx)@j(-TgupoDB^XO!bWQ3>0)H|7Q$lDq-9l!c@Rm&%=_FpO>zX zl3$vXlghwcmYQ6WU&O$}!XnSaz`#<RS(VDb!nPA+5KA%x3p-eprG$Zn10=@5z{;Y^ z#K6GB!jhJgpIE}c76#GJ!u5`kfq^+Uv7{)of`NyHrx;{fd1gvU1_KKpNGk(NMrvky zMtunb3qOd@0y16zqzq&z$Qm|Zh;9}k8zu$@uH3}TJO)NykXn#yKskYNju|rp19xIk zdNNdoX(E_g#=yu6l46?3!c&x(m(9Qkwvz|!9SEDZxFoTpw78yuk^dwk0|Qfu25(7f zaR~#XAjk&hk`oNPNeqmVHp~nR%q2${cpVuSrJTT=0}Q+s42;qs8Kx2&zBLRC3=Iqn z47`~Pj0zCFXBZe5SXulTL8KlNh^%B{VBimBWMBwpW?&Ft5RA{vPhwzt@4-AdkL8#+ zH=`h<5E}ynKO>{3FrzR7gMcCf1B2k?2v${LkUv5G1>uVf3=B*ReUm4!HhAYImSp%R zWu+#U=w&c~G8_Xd6G#m+597R;W)8c^sHo2zrC&H~ITSf;8JJj@=Yt5QR6zzN7Dl!R zHfF9}yP4EPI7FCOC#$kq)hjSCFvu`K(hS&6M?Q{LCMRB2_hx41Ova;!d01E&K&6os z0|SEygFFKRgEW|>4%H~apu@nxAPW{VWME*B1GCH+7{F>p7@Qaw7(kYYFhnshFn~NL z!jJ_Qi*I6JU{C^UnZm%ppbTcMU|?VX<rEPHeMSZbP~pPHV8Y12pbD0?f{R5lGBBut z#S-CSX>fIH3=9l>lMk{9I}0%|FmN*@F@ih*Vx5AsCWDeE0|NsagFH0furYx2@ql#* zK*NQNVfJKR_FPs__y|p|XAc!dE_y+^jhRtnqNAvABq%08iGYEDfte9h&azK_%`V9f zGLo6`^+ZR}$qF1CjO>#&Ih0j7z=}WxEI1mWS|L;)gks>FT*#r!4hjKgMnRDF4ICWo zpx9t$w3)o0qqZKT?h1$iV+96qT3~nr=79*9$QKX?jA0@ya9d#_0w^N!1*Ij$U>zU= zrbYurjWHwRWIN7F@$rc{Ir+(nC8^M20M3VI<@n6J%#whj{3MusT4qiTj17~6s12^n TO)V+POlF7&6>;&PB8~w7MwLjx delta 796 zcmbO(GeLychmnf`1QggA8004MiVHe0Ffc4(WMF7u0|_%QuuU`#x6?O)aA0IF69dB& zMh1pGFhvXu3=RwePWpysFePC62Ll5`A<M*1YHXRT3=BWmCd)C(am{C7VCZCJVBle& z?8d0Xs4?-Q$mCi^VJ2g?$&(nBv@94H7~I(y7{u7YMldjf%{Fid?R?t&<U{itgBKw2 z<1Q*XlkYRCbM64~P9E-Lnw-U)!{orQ`37?VV?7H?T26jq2?JMdVrCu#BhOBdDzHHe z42*N~nHU(j6N}Q5p)yPp!Q3(iMjnt9(?k}YqQtyx21Z_xKAz&ts#GYOx40y+q_miU zk?$lU0|Qfu1aC=daR~#X07xNIi4Gr#>zJdRo|;sYnasc_1`_9IU|?nOXJlXy2n7W! z69a=FgHU{Cei8%I`%<RKN7;_4=rP($GILmQTXTB~+ek7n@Jlc-FbFU*dI~cNGcX7$ zGB7X*O<u&VDh!Gqs9zXnGcYhPG1N`I#oi#wz`)7`5@+USoDkE@VHX)SpNVPmQVy$n z83qOh5N3gTpTUujqm{{tm$l|74+}^TlmI~1i7?19Ffd3mFffQPs4*}wNP$_}3=9m? zV3q;YAQ1*r1_lOMuox)*c^DWNxEZn-7#KjNu`v{ZoDLRCVq{>@7XmX+F)}bfSYH@n z3PGAdmUA-*z%_SI7Us%j1^JR~aw}Kp!~hoKNRYpv3YZx|Ne`qEDhQ=gp)@N40|PVT zkBN?=oW)Qfw#mWV%Iu)T#LPH<axJ$kBgf>~+{%ocllOBgvxDqsX0(|6lDn4q3IoGr L8{V+Vw!GB<`MY(N diff --git a/grad_conj/obj/Debug/mathObject.o b/grad_conj/obj/Debug/mathObject.o index 65e0dc38b65d1f77b1afa3f54ffce01b019a3a9a..2b419c5fb1c3ebcf4acee0206d84d84d17ddf09d 100644 GIT binary patch delta 3151 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 delta 2435 zcmaE3HN%wGhmo5B1f0Ye7_=wyiVO0vGBBKBWMI$`0tquP7*8}!XRBajV7S3HagmZ< zA}a$!00#qung~Q%gMop;fkD7Y-_Q&q040SO85lP5PW+_Cc9@TWVVme=IYv3INsJ5( zkNFrFPKi!-V^m@)6_}jGsK(SQFnJQAl3)uX1H(cA28Ju55F@xJA7%W*STOkz(<a7( z&85tD7=<_(7#LoFWIJ8Ibi01(4&|8qkx^uFBda%K!Q`{7I+NSjqO>NQJRI8jwE2z3 zaTXP3MyQ74EGkMc&Bs|(zy@8KtiZ15@$cXN|HoNWTw$`^u3tJ?R9?jX2Mc?k39CSa z6=3F0IC*%&gbAvqdWMsiu>WE)OjF>Ryn#b{@?Unf$-g;FnPOQd8*vsfa!y{#`JIJ> znWcO30xr?|Zbk+M76w+9iHr;kOe`#EIr)ht3~XVk$tC$k49uMAj0_CyAaC+8bKe0e zEze9T$zWjST?7(j$w<vi&nRJF<^yqASdtl-`9Z2U7+6_A2DAAlmK0@HFfa?QU}Rw6 zNX*H}PfjdJg^DurMltb%jA3Bd#=yY9I45edH@7xp)Z}t*dDcga3=F)J^JK&&7-c}R zo53nxGBGglfwVBnL`^=$t;#rY@&|5zo*-tJuvXM$Z=Oh=$#4O~sL306%y?eI1+1ec zf8y~r5o2Ls-~yZE8O6lFz%(%j;XbJE8RH^Y7#M1p85sP)mPbr3<duv7iGftJvdjWG zF*7f-B%mli38p9Q6f*-u2w43_76t}BP~b79K{PS&f!xlR1_~^ui7ea~nHd<|7#J9M zG8q`tC-?D*)o07GFff2p2jiSOaNXHZ-3+`1MVWaeFq?`TSU~9=6mW8^Fq?{?YPsE5 z7#Pf<W*0*&%wb^QFG($i8&K82!obi8cB&^U0|OU3g8~BsV=csl90q}CMh1ouRt5$^ z2BG-O{3HgZ_nwoT`M>iqGI|O#3NtVWDl#xI2u)5BQ03)h1qCGp_idgc;LSMsfuOAX z^|cP^3`{J{6F~&WV+JM`Mm8_Dg%0VvcR$_Dp}*NzNQqGv6u1nId>pMzPQ0v4UPpOY zSU?V8U}0onI5)XRSea32@&{q*dJjeh1{bK8;p%I^${A!B7#K1b85mliK7z|LwL%my zFz_=lFsLvvFo-Z1!dd<d3=FDZu~N9$O1Ri%IO`<?14F$USm9SN$-uzIFo%(W0U`!U z+@Lauje&`Yfk7RtLLSc2g0r%iK-Pow<})!cfQl;-hE66122HSz6>!<LObiTKV6iQ5 zv7PmBE!W|Kci>{*;9|ewnt7RF)(J7gtW$xDX)?nsDS(TW!o|9nVWG7c%BmM(ILHhO zu2;-3zkh>k)?<PB-4f19V}Us#n+4{CPPkYf3(N^q;bODk>Ndc|wt~d!!2xm}E_em5 z`59d7HAo>?-CwvE6D!OTHU<U;2?hoRZiWH|NO{4=P{F_ePCVS;<Rb@`UCGG60AaB~ ziyJluGp2f&pbK2E3eEz>B1Fq{CYZXtaM??67ASH+WdIuk7c)$q1e~P?Eu`2Otl_K# z7^|KkAFi+#CdjY|&e{l<-47SL0%!e%vp85_7VCgY7zR*s^n!~Oz{Tp}V!dEiJt*L2 z!=?AbS?9pgAX!lGLwxrOF2(^Wn!uLmz**L;FeiYbL<}700`MqlgR>N%ED;7528I}L z!7sv)0vGInvsS=aC*Ukl<qUF+2m=QrB(_Bubl@x>I4cLlntWB_U^uAcW@J!cU;>w8 z*BBTWK&3H4<PoTS!NS0R5P8qQzyK;lAtHJusTCz)y&yFV49tw6V$pcApj0|z#pHuh zqQ<|WvY^tEnGw`}0TlvJK`6z}2w{MNhM7?aq>oW_@^vX?RTZcVsKvm{2x`DU1t1#0 yq`_o)X=Q$Es065jV`dbb=qM`e1{DG|v6vY_4IJ*tmD1ge0h3u}u223VQvm=Sh)~M_ -- GitLab