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

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

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

revision 3012 by artak, Tue Apr 27 05:10:46 2010 UTC revision 3013 by artak, Wed Apr 28 03:47:51 2010 UTC
# Line 94  void Paso_Solver_setPreconditioner(Paso_ Line 94  void Paso_Solver_setPreconditioner(Paso_
94                prec->type=PASO_GS;                prec->type=PASO_GS;
95                break;                break;
96              case PASO_AMG:              case PASO_AMG:
97            prec->amgSystem=MEMALLOC(1,Paso_Solver_AMG_System);                if (options->verbose) printf("AMG preconditioner is used.\n");
98                  prec->amg=Paso_Solver_getAMG(A->mainBlock,options->level_max,options);  
99              /*
100                  prec->amgSystem=MEMALLOC(1,Paso_Solver_AMG_System);
101            if (Paso_checkPtr(prec->amgSystem)) return;            if (Paso_checkPtr(prec->amgSystem)) return;
102            prec->amgSystem->block_size=A->row_block_size;            prec->amgSystem->block_size=A->row_block_size;
103            for (i=0;i<A->row_block_size;++i) {            for (i=0;i<A->row_block_size;++i) {
104          prec->amgSystem->amgblock[i]=NULL;          prec->amgSystem->amgblock[i]=NULL;
105          prec->amgSystem->block[i]=NULL;          prec->amgSystem->block[i]=NULL;
106            }            }
107                                  */
108                if (options->verbose) printf("AMG preconditioner is used.\n");                                    
109                /*For performace reasons we check if block_size is one. If yes, then we do not need to separate blocks.*/                /*For performace reasons we check if block_size is one. If yes, then we do not need to separate blocks.*/
110                if (A->row_block_size<4) {                /*if (A->row_block_size==1) {
111                  prec->amg=Paso_Solver_getAMG(A->mainBlock,options->level_max,options);                    prec->amg=Paso_Solver_getAMG(A->mainBlock,options->level_max,options);  
112                }                }
113                else {                else {
114                  for (i=0;i<A->row_block_size;++i) {                  for (i=0;i<A->row_block_size;++i) {
115                  prec->amgSystem->block[i]=Paso_SparseMatrix_getBlock(A->mainBlock,i+1);                  prec->amgSystem->block[i]=Paso_SparseMatrix_getBlock(A->mainBlock,i+1);
                 /*sprintf(filename,"ABlock%d",i);  
                 Paso_SparseMatrix_saveMM(prec->amgSystem->block[i],filename);  
                 */  
116                  prec->amgSystem->amgblock[i]=Paso_Solver_getAMG(prec->amgSystem->block[i],options->level_max,options);                  prec->amgSystem->amgblock[i]=Paso_Solver_getAMG(prec->amgSystem->block[i],options->level_max,options);
117                  }                  }
118                }                }
119                                */
120                                                        
121                prec->type=PASO_AMG;                prec->type=PASO_AMG;
122                break;                break;
# Line 220  void Paso_Solver_solvePreconditioner(Pas Line 220  void Paso_Solver_solvePreconditioner(Pas
220             }             }
221             break;             break;
222          case PASO_AMG:          case PASO_AMG:
223                Paso_Solver_solveAMG(prec->amg,x,b);
224    
225              /*For performace reasons we check if block_size is one. If yes, then we do not need to do unnecessary copying.*/              /*For performace reasons we check if block_size is one. If yes, then we do not need to do unnecessary copying.*/
226                /*
227              if (A->row_block_size<4) {              if (A->row_block_size<4) {
228                  Paso_Solver_solveAMG(prec->amg,x,b);                  Paso_Solver_solveAMG(prec->amg,x,b);
229              }              }
# Line 234  void Paso_Solver_solvePreconditioner(Pas Line 236  void Paso_Solver_solvePreconditioner(Pas
236                      if (Paso_checkPtr(xx[i]) && Paso_checkPtr(bb[i])) return;                      if (Paso_checkPtr(xx[i]) && Paso_checkPtr(bb[i])) return;
237                  }                  }
238                                    
                 /*#pragma omp parallel for private(i,j) schedule(static)*/  
239                  for (i=0;i<n;i++) {                  for (i=0;i<n;i++) {
240                      for (j=0;j<A->row_block_size;j++) {                      for (j=0;j<A->row_block_size;j++) {
241                       bb[j][i]=b[A->row_block_size*i+j];                       bb[j][i]=b[A->row_block_size*i+j];
# Line 246  void Paso_Solver_solvePreconditioner(Pas Line 247  void Paso_Solver_solvePreconditioner(Pas
247                  Paso_Solver_solveAMG(prec->amgSystem->amgblock[i],xx[i],bb[i]);                  Paso_Solver_solveAMG(prec->amgSystem->amgblock[i],xx[i],bb[i]);
248                  }                  }
249                                                                
                 /*#pragma omp parallel for private(i,j) schedule(static)*/  
250                  for (i=0;i<n;i++) {                  for (i=0;i<n;i++) {
251                      for (j=0;j<A->row_block_size;j++) {                      for (j=0;j<A->row_block_size;j++) {
252                      x[A->row_block_size*i+j]=xx[j][i];                      x[A->row_block_size*i+j]=xx[j][i];
# Line 257  void Paso_Solver_solvePreconditioner(Pas Line 257  void Paso_Solver_solvePreconditioner(Pas
257                  MEMFREE(xx[i]);                  MEMFREE(xx[i]);
258                  MEMFREE(bb[i]);                  MEMFREE(bb[i]);
259                  }                  }
                 
260              }              }
261                */
262          break;          break;
263          case PASO_AMLI:          case PASO_AMLI:
264                            

Legend:
Removed from v.3012  
changed lines
  Added in v.3013

  ViewVC Help
Powered by ViewVC 1.1.26