/[escript]/trunk/paso/src/Solver_AMG.c
ViewVC logotype

Diff of /trunk/paso/src/Solver_AMG.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2177 by artak, Thu Dec 4 06:09:50 2008 UTC revision 2178 by artak, Thu Dec 18 00:08:58 2008 UTC
# Line 71  to Line 71  to
71     then AMG is applied to S again until S becomes empty     then AMG is applied to S again until S becomes empty
72    
73  */  */
74  Paso_Solver_AMG* Paso_Solver_getAMG(Paso_SparseMatrix *A_p,bool_t verbose,dim_t level) {  Paso_Solver_AMG* Paso_Solver_getAMG(Paso_SparseMatrix *A_p,bool_t verbose,dim_t level, double couplingParam) {
75    Paso_Solver_AMG* out=NULL;    Paso_Solver_AMG* out=NULL;
76    dim_t n=A_p->numRows;    dim_t n=A_p->numRows;
77    dim_t n_block=A_p->row_block_size;    dim_t n_block=A_p->row_block_size;
# Line 114  Paso_Solver_AMG* Paso_Solver_getAMG(Paso Line 114  Paso_Solver_AMG* Paso_Solver_getAMG(Paso
114       for (i=0;i<n;++i) mis_marker[i]=-1;       for (i=0;i<n;++i) mis_marker[i]=-1;
115       /*Paso_Pattern_RS(A_p,mis_marker,0.25);*/       /*Paso_Pattern_RS(A_p,mis_marker,0.25);*/
116       /*Paso_Pattern_Aggregiation(A_p,mis_marker,0.5);*/       /*Paso_Pattern_Aggregiation(A_p,mis_marker,0.5);*/
117       Paso_Pattern_coup(A_p,mis_marker,0.05);       Paso_Pattern_coup(A_p,mis_marker,couplingParam);
118       if (Paso_noError()) {       if (Paso_noError()) {
119          #pragma omp parallel for private(i) schedule(static)          #pragma omp parallel for private(i) schedule(static)
120          for (i = 0; i < n; ++i) counter[i]=mis_marker[i];          for (i = 0; i < n; ++i) counter[i]=mis_marker[i];
# Line 154  Paso_Solver_AMG* Paso_Solver_getAMG(Paso Line 154  Paso_Solver_AMG* Paso_Solver_getAMG(Paso
154             if( Paso_noError()) {             if( Paso_noError()) {
155                /* if there are no nodes in the coarse level there is no more work to do */                /* if there are no nodes in the coarse level there is no more work to do */
156                out->n_C=n-out->n_F;                out->n_C=n-out->n_F;
157                if (level<5) {                if (level<3) {
158                 /*if (out->n_F>500) {*/                 /*if (out->n_F>500) {*/
159                     out->rows_in_C=MEMALLOC(out->n_C,index_t);                     out->rows_in_C=MEMALLOC(out->n_C,index_t);
160                     out->mask_C=MEMALLOC(n,index_t);                     out->mask_C=MEMALLOC(n,index_t);
# Line 186  Paso_Solver_AMG* Paso_Solver_getAMG(Paso Line 186  Paso_Solver_AMG* Paso_Solver_getAMG(Paso
186    
187                              schur_withFillIn=Paso_SparseMatrix_alloc(A_p->type,Paso_Pattern_binop(PATTERN_FORMAT_DEFAULT, schur->pattern, Paso_Pattern_multiply(PATTERN_FORMAT_DEFAULT,out->A_CF->pattern,out->A_FC->pattern)),1,1);                              schur_withFillIn=Paso_SparseMatrix_alloc(A_p->type,Paso_Pattern_binop(PATTERN_FORMAT_DEFAULT, schur->pattern, Paso_Pattern_multiply(PATTERN_FORMAT_DEFAULT,out->A_CF->pattern,out->A_FC->pattern)),1,1);
188                                                            
189                              /*fprintf(stderr,"Sparsity of Schure: %dx%d LEN %d Percentage %f\n",schur_withFillIn->pattern->numOutput,schur_withFillIn->pattern->numInput,schur_withFillIn->len,schur_withFillIn->len/(1.*schur_withFillIn->pattern->numOutput*schur_withFillIn->pattern->numInput));*/                              fprintf(stderr,"Sparsity of Schure: %dx%d LEN %d Percentage %f\n",schur_withFillIn->pattern->numOutput,schur_withFillIn->pattern->numInput,schur_withFillIn->len,schur_withFillIn->len/(1.*schur_withFillIn->pattern->numOutput*schur_withFillIn->pattern->numInput));
190                                                            
191                              /* copy values over*/                              /* copy values over*/
192                              #pragma omp parallel for private(i,iPtr,j,iPtr_s,index,where_p) schedule(static)                              #pragma omp parallel for private(i,iPtr,j,iPtr_s,index,where_p) schedule(static)
# Line 209  Paso_Solver_AMG* Paso_Solver_getAMG(Paso Line 209  Paso_Solver_AMG* Paso_Solver_getAMG(Paso
209                                                                    
210                              if (Paso_noError()) {                              if (Paso_noError()) {
211                                  Paso_Solver_updateIncompleteSchurComplement(schur_withFillIn,out->A_CF,out->inv_A_FF,out->A_FF_pivot,out->A_FC);                                  Paso_Solver_updateIncompleteSchurComplement(schur_withFillIn,out->A_CF,out->inv_A_FF,out->A_FF_pivot,out->A_FC);
212                                  out->AMG_of_Schur=Paso_Solver_getAMG(schur_withFillIn,verbose,level+1);                                  out->AMG_of_Schur=Paso_Solver_getAMG(schur_withFillIn,verbose,level+1,couplingParam);
213                                  Paso_SparseMatrix_free(schur);                                  Paso_SparseMatrix_free(schur);
214                              }                              }
215                              /* allocate work arrays for AMG application */                              /* allocate work arrays for AMG application */
# Line 249  Paso_Solver_AMG* Paso_Solver_getAMG(Paso Line 249  Paso_Solver_AMG* Paso_Solver_getAMG(Paso
249    if (Paso_noError()) {    if (Paso_noError()) {
250        if (verbose) {        if (verbose) {
251           printf("AMG: %d unknowns eliminated. %d left.\n",out->n_F,n-out->n_F);           printf("AMG: %d unknowns eliminated. %d left.\n",out->n_F,n-out->n_F);
252           if (level<5) {           if (level<3) {
253           /*if (out->n_F<500) {*/           /*if (out->n_F<500) {*/
254              printf("timing: AMG: MIS/reordering/elemination : %e/%e/%e\n",time2,time0,time1);              printf("timing: AMG: MIS/reordering/elemination : %e/%e/%e\n",time2,time0,time1);
255           } else {           } else {
# Line 294  void Paso_Solver_solveAMG(Paso_Solver_AM Line 294  void Paso_Solver_solveAMG(Paso_Solver_AM
294       double *x0=MEMALLOC(amg->n,double);       double *x0=MEMALLOC(amg->n,double);
295       double time0=0;       double time0=0;
296            
297       if (amg->level==5) {       if (amg->level==3) {
298       /*if (amg->n_F<=500) {*/       /*if (amg->n_F<=500) {*/
299        time0=Paso_timer();        time0=Paso_timer();
300                    

Legend:
Removed from v.2177  
changed lines
  Added in v.2178

  ViewVC Help
Powered by ViewVC 1.1.26