void call_bi_cg_sparse(cs* matrixA, double* matrixB, double* matrixX,int size){ int i=0; if(found_dc_sweep==0){ bi_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; bi_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) { bi_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 solveSparse(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) { //LU decomposition S=cs_sqr(2,C_sparse,0); N=cs_lu(C_sparse,S,1); //cs_spfree(C_sparse); } B_sparse_temp = (double *)calloc(sizeB,sizeof(double)); //apothikeusi tou apotelesmatos tis LU solve gia to sweep kai to transient if(dc_sweep==0){ //An den exoume sweep for(i=0;i<sizeB;i++)B_sparse_temp[i]=B_sparse[i]; if (ITER == 0){ //LU solve cs_ipvec(N->pinv, B_sparse, x_sparse, sizeB); //seg fault gia choleskyNetlist!LA8OS TO N!ARA ANADROMIKA LA8OS TO C_sparse.Omws C_sparce swsto vash ths CG. cs_lsolve(N->L, x_sparse); cs_usolve(N->U, x_sparse); cs_ipvec(S->q, x_sparse, B_sparse, sizeB); //printf("\n ----- SPARSE LU decomposition ----- \n"); for(i=0;i<sizeB;i++){x_sparse[i]=B_sparse[i];} cs_nfree(N); cs_sfree(S); }else{ bi_conjugate_gradient_sparse(C_sparse,B_sparse, sizeB, x_sparse, itol_value); //printf("\n"); //printf("---- BI-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"); } for(i=0;i<sizeB;i++)B_sparse[i]=B_sparse_temp[i]; //epanafora tou B_sparse gia xrisi sto transient } else //DC_SWEEP != 0 { if(sweep_source!=-1){ //pigi tashs 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(N->pinv, B_sparse, x_sparse, sizeB); cs_lsolve(N->L, x_sparse); cs_usolve(N->U, x_sparse); cs_ipvec(S->q, x_sparse, B_sparse_temp, sizeB); }else{ bi_conjugate_gradient_sparse(C_sparse,B_sparse, sizeB, x_sparse, itol_value); } //Apothikeusi twn apotelesmatwn tis analysis gia tous komvous PLOT 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(N->pinv, B_sparse, x_sparse, sizeB); cs_lsolve(N->L, x_sparse); cs_usolve(N->U, x_sparse); cs_ipvec(S->q, x_sparse, B_sparse_temp,sizeB); }else{ bi_conjugate_gradient_sparse(C_sparse,B_sparse, sizeB, x_sparse, itol_value); } //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"); } } free(B_sparse_temp); }