void call_cg_sparse(cs* matrixA, double* matrixB, double* matrixX, int size){ int i=0; if (found_dc_sweep==0) { conjugate_gradient_sparse(matrixA,matrixB, matrixX,size,itol_value); printf("Matrix X:\n"); for(i=0;i<size;i++){ printf(" %.6lf ",matrixX[i]); } printf("\n"); } else { double value; double *matrixB_temp = (double *)calloc(size,sizeof(double)); if (source > -1) { for (value=start_value;value<=end_value;value=value+step){ matrixB[source-1]=value; conjugate_gradient_sparse(matrixA,matrixB,matrixX,size,itol_value); printf("value= %lf Matrix X: \n",value); for(i=0;i<size;i++){ printf(" %.6lf ",matrixX[i]); } printf("\n"); } } else { if (sweep_node1!=0){ matrixB[sweep_node1-1]+=sweep_value-start_value; } if(sweep_node2!=0){ matrixB[sweep_node2-1]-=sweep_value-start_value; } for (value=start_value;value<=end_value;value=value+step) { conjugate_gradient_sparse(matrixA,matrixB,matrixX,size,itol_value); if (sweep_node1!=0){ matrixB[sweep_node1-1]-=step; } if(sweep_node2!=0){ matrixB[sweep_node2-1]+=step; } printf("value= %lf Matrix X: \n",value); for(i=0;i<size;i++){ printf(" %.6lf ",matrixX[i]); } printf("\n"); } } } }
void solve(sparse_matrix* matrix, sparse_vector* vector, gsl_vector* x,int vector_size) { //char method; gsl_vector* x_gsl; sparse_vector* x_sparse; sparse_vector* x_sol; gsl_vector* vector_gsl; int i; int itol_value=1e-3; x_sparse = (sparse_vector*)safe_malloc(vector_size * sizeof(double)); conjugate_gradient_sparse(matrix, vector, vector_size, x_sparse,itol_value); print_vector_to_file(x_sparse,vector_size,"solution_cg_gary"); /* Added by hriskons */ /* conversion of a double into a gsl safe_gsl_vector_calloc(&x_gsl, vector_size); safe_gsl_vector_calloc(&vector_gsl, vector_size); sparse_to_gsl_vector(vector,vector_gsl,vector_size); if( !sparse_solve_cg( matrix,vector_gsl,x_gsl) ){ fprintf(stderr, "Solving Method Sparse LU failed\n" ); } print_gsl_vector_to_file(x_gsl,"solution_cg_hriskons"); */ }
void solve_spdSparse(double time){ int i; double current_value; double *B_sparse_temp; //Adeiasma twn arxeiwn sta opoia tha apothikeutoun ta apotelesmata tis analysis gia tous komvous PLOT if(TRAN==0)initPlotFiles("Sparse"); if(ITER==0){ //cholesky decomposition S=cs_schol(1, C_sparse); N=cs_chol(C_sparse, S); //cs_spfree(C_sparse); } if(dc_sweep==0){ //An den exoume sweep if(ITER==0){ cs_ipvec(S->pinv, B_sparse, x_sparse, sizeB); cs_lsolve(N->L, x_sparse); //seg fault gia choleskyNetlist!LA8OS TO N!ARA ANADROMIKA LA8OS TO C_sparse.Omws C_sparce swsto vash ths CG. cs_ltsolve(N->L, x_sparse); cs_pvec(S->pinv, x_sparse, B_sparse, sizeB); //solve cholesky for(i=0;i<sizeB;i++){ x_sparse[i]=B_sparse[i]; } //printf("\n ----- SPARSE Cholesky decomposition ----- \n"); } else{ conjugate_gradient_sparse(C_sparse,B_sparse, sizeB, x_sparse, itol_value); //solve with Conjugated Gradient //printf("\n"); //printf("---- CG SPARSE ----\n"); } /* printf("X = \n"); for(i=0;i<sizeB;i++){ printf(" %.6lf \n",x_sparse[i]); } printf("----------------------\n"); printf("\n"); */ if(TRAN==0){ plotFiles("Sparse", x_sparse, -1.0, "Analysis: DC"); }else{ plotFiles("Sparse", x_sparse, time, "Analysis: TRAN"); } }else{ //An exoume sweep B_sparse_temp = (double *)calloc(sizeB,sizeof(double)); //Proswrini apothikeusi tou apotelesmatos anamesa sta loop if(sweep_source!=-1){ //pigi tasis ginetai sweep for(current_value=start_value;current_value<=end_value+EPS;current_value+=sweep_step){ B_sparse[sweep_source-1]=current_value; if(ITER==0){ cs_ipvec(S->pinv, B_sparse, x_sparse, sizeB); cs_lsolve(N->L, x_sparse); cs_ltsolve(N->L, x_sparse); cs_pvec(S->pinv, x_sparse, B_sparse_temp, sizeB); //solve cholesky } else{ conjugate_gradient_sparse(C_sparse,B_sparse, sizeB, x_sparse, itol_value); } //Apothikeusi twn apotelesmatwn tis analysis gia tous komvous PLOT se arxeia plotFiles("Sparse", (ITER ? x_sparse:B_sparse_temp), current_value, "Sweep source voltage at"); } }else{ //pigi reumatos ginetai sweep //Anairesi twn praksewn + kai - apo tin arxiki timi tis pigis ston pinaka B //kai praksi + kai - me to start_value if(sweep_posNode!=0){ B_sparse[sweep_posNode-1]+=sweep_value_I-start_value; } if(sweep_negNode!=0){ B_sparse[sweep_negNode-1]-=sweep_value_I-start_value; } for(current_value=start_value;current_value<=end_value+EPS;current_value+=sweep_step){ if(ITER==0){ cs_ipvec(S->pinv, B_sparse, x_sparse, sizeB); cs_lsolve(N->L, x_sparse); cs_ltsolve(N->L, x_sparse); cs_pvec(S->pinv, x_sparse, B_sparse_temp, sizeB); //solve cholesky } else{ conjugate_gradient_sparse(C_sparse,B_sparse, sizeB, x_sparse, itol_value); //Arxiki proseggish h lush ths prohgoumenhs } //Allagi twn timwn ston pinaka B gia to epomeno vima tou sweep if(sweep_posNode!=0){ B_sparse[sweep_posNode-1]-=sweep_step; } if(sweep_negNode!=0){ B_sparse[sweep_negNode-1]+=sweep_step; } //Apothikeusi twn apotelesmatwn tis analysis gia tous komvous PLOT se arxeia plotFiles("Sparse", (ITER ? x_sparse:B_sparse_temp), current_value, "Sweep source current at"); } printf("\n"); } } }