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"); 
		    } 
		}
    }
}
Beispiel #2
0
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"); */
}
Beispiel #3
0
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");
		}
	}

}