System Preprocessors
pcstuff.c
Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include "petscpc.h"
00003 #include "petscksp.h"
00004 #include "anamod.h"
00005 #include "linpc.h"
00006 
00007 /*!
00008  * Set the parameter value for a pc;
00009  * this routine is only called for parametrised pcs
00010  */
00011 #undef __FUNCT__
00012 #define __FUNCT__ "set_blocked_sub_pc"
00013 static PetscErrorCode set_blocked_sub_pc(int pcv)
00014 {
00015   const char *opt,*val = new char[5]; int ierr;
00016   PetscFunctionBegin;
00017 
00018   if (pcv>0) {
00019     ierr = PetscOptionsSetValue("-sub_ksp_type","preonly"); CHKERRQ(ierr);
00020     ierr = PetscOptionsSetValue("-ana_sub_ksp_type","preonly"); CHKERRQ(ierr);
00021     ierr = PetscOptionsSetValue("-sub_pc_type","ilu"); CHKERRQ(ierr);
00022     ierr = PetscOptionsSetValue("-ana_sub_pc_type","ilu"); CHKERRQ(ierr);
00023     opt = "-sub_pc_factor_levels";
00024     sprintf((char*)val,"%d",pcv-1);
00025     ierr = PetscOptionsSetValue(opt,val); CHKERRQ(ierr);
00026     opt = "-ana_sub_pc_factor_levels";
00027     sprintf((char*)val,"%d",pcv-1);
00028     ierr = PetscOptionsSetValue(opt,val); CHKERRQ(ierr);
00029     ierr = PetscOptionsSetValue
00030       ("-sub_pc_factor_shift_positive_definite",PETSC_NULL); CHKERRQ(ierr);
00031     ierr = PetscOptionsSetValue
00032       ("-ana_sub_pc_factor_shift_positive_definite",PETSC_NULL); CHKERRQ(ierr);
00033   } else if (pcv==-1) {
00034     ierr = PetscOptionsSetValue("-sub_ksp_type","preonly"); CHKERRQ(ierr);
00035     ierr = PetscOptionsSetValue("-ana_sub_ksp_type","preonly"); CHKERRQ(ierr);
00036     ierr = PetscOptionsSetValue("-sub_pc_type","lu"); CHKERRQ(ierr);
00037     ierr = PetscOptionsSetValue("-ana_sub_pc_type","lu"); CHKERRQ(ierr);
00038     ierr = PetscOptionsSetValue
00039       ("-sub_pc_factor_shift_positive_definite",PETSC_NULL); CHKERRQ(ierr);
00040     ierr = PetscOptionsSetValue
00041       ("-ana_sub_pc_factor_shift_positive_definite",PETSC_NULL); CHKERRQ(ierr);
00042   } else if (pcv<-1) {
00043     ierr = PetscOptionsSetValue("-sub_ksp_type","gmres"); CHKERRQ(ierr);
00044     ierr = PetscOptionsSetValue("-ana_sub_ksp_type","gmres"); CHKERRQ(ierr);
00045     sprintf((char*)val,"%d",-pcv-1);
00046     ierr = PetscOptionsSetValue("-sub_ksp_max_it",val); CHKERRQ(ierr);
00047     ierr = PetscOptionsSetValue("-ana_sub_ksp_max_it",val); CHKERRQ(ierr);
00048     ierr = PetscOptionsSetValue("-sub_pc_type","jacobi"); CHKERRQ(ierr);
00049     ierr = PetscOptionsSetValue("-ana_sub_pc_type","jacobi"); CHKERRQ(ierr);
00050     ierr = PetscOptionsSetValue
00051       ("-sub_pc_factor_shift_positive_definite",PETSC_NULL); CHKERRQ(ierr);
00052     ierr = PetscOptionsSetValue
00053       ("-ana_sub_pc_factor_shift_positive_definite",PETSC_NULL); CHKERRQ(ierr);
00054   } else SETERRQ1(PETSC_COMM_SELF,1,"No idea what pcv=%d means",pcv);
00055 
00056   PetscFunctionReturn(0);
00057 }
00058 
00059 #undef __FUNCT__
00060 #define __FUNCT__ "pc_string"
00061 PetscErrorCode pc_string(KSPType pct,int pcv,int pcvv,char **s)
00062 {
00063   PetscBool flg; char *ss; int ierr;
00064   PetscFunctionBegin;
00065   ierr = PetscMalloc(250*sizeof(char),&ss); CHKERRQ(ierr);
00066 
00067   /* block jacobi */
00068   ierr = PetscStrcmp(pct,PCBJACOBI,&flg); CHKERRQ(ierr);
00069   if (!flg) {
00070     ierr = PetscStrcmp(pct,PCASM,&flg); CHKERRQ(ierr);
00071   }
00072   if (flg) {
00073     char *j;
00074     ierr = PetscMalloc(100*sizeof(char),&j); CHKERRQ(ierr);
00075     if (pcv>0)
00076       sprintf(j,"local method ILU(%d)",pcv-1);
00077     else if (pcv<-1)
00078       sprintf(j,"local CG, epslog=%d",-pcv-1);
00079     else if (pcv==-1)
00080       sprintf(j,"local method full LU");
00081     else SETERRQ(PETSC_COMM_SELF,1,"No idea what this pcv==0 means for blocked pc");
00082     sprintf(ss,"%s (%s; over %d procs)",pct,j,pcvv);
00083     ierr = PetscFree(j); CHKERRQ(ierr);
00084     goto exit;
00085   }
00086 
00087   /* ilu */
00088   ierr = PetscStrcmp(pct,PCILU,&flg); CHKERRQ(ierr);
00089   if (flg) {
00090     sprintf(ss,"%s (levels %d)",pct,pcv-1);
00091     goto exit;
00092   }
00093 
00094 #if defined(PETSC_HAVE_SPAI)
00095   /* spai */
00096   ierr = PetscStrcmp(pct,PCSPAI,&flg); CHKERRQ(ierr);
00097   if (flg) {
00098     sprintf(ss,"%s (blocksize %d)",pct,pcv);
00099     goto exit;
00100   }
00101 #endif
00102 
00103   sprintf(ss,"%s",pct);
00104  exit:
00105   *s = ss;
00106   PetscFunctionReturn(0);
00107 }
00108 
00109 #undef __FUNCT__
00110 #define __FUNCT__ "pc_short_string"
00111 PetscErrorCode pc_short_string(KSPType pct,int pcv,int pcvv,char **s)
00112 {
00113   PetscBool flg; char *ss; int ierr;
00114   PetscFunctionBegin;
00115   ierr = PetscMalloc(250*sizeof(char),&ss); CHKERRQ(ierr);
00116 
00117   /* block jacobi */
00118   ierr = PetscStrcmp(pct,PCBJACOBI,&flg); CHKERRQ(ierr);
00119   if (!flg) {
00120     ierr = PetscStrcmp(pct,PCASM,&flg); CHKERRQ(ierr);
00121   }
00122   if (flg) {
00123     char *j;
00124     ierr = PetscMalloc(100*sizeof(char),&j); CHKERRQ(ierr);
00125     if (pcv>0)
00126       sprintf(j,"ilu%d",pcv-1);
00127     else if (pcv<-1)
00128       sprintf(j,"cg%d",-pcv-1);
00129     else if (pcv==-1)
00130       sprintf(j,"lu");
00131     else SETERRQ(PETSC_COMM_SELF,1,"No idea what this pcv==0 means for blocked pc");
00132     sprintf(ss,"%s-%s",pct,j);
00133     ierr = PetscFree(j); CHKERRQ(ierr);
00134     goto exit;
00135   }
00136 
00137   /* ilu */
00138   ierr = PetscStrcmp(pct,PCILU,&flg); CHKERRQ(ierr);
00139   if (flg) {
00140     sprintf(ss,"%s%d",pct,pcv-1);
00141     goto exit;
00142   }
00143 
00144 #if defined(PETSC_HAVE_SPAI)
00145   /* spai */
00146   ierr = PetscStrcmp(pct,PCSPAI,&flg); CHKERRQ(ierr);
00147   if (flg) {
00148     sprintf(ss,"%s%d",pct,pcv);
00149     goto exit;
00150   }
00151 #endif
00152 
00153   /* pcs without pcv : bs95, jacobi, none */
00154   ierr = PetscStrcmp(pct,PCBS95,&flg); CHKERRQ(ierr);
00155   if (flg) {
00156     sprintf(ss,"%s",pct);
00157     goto exit;
00158   }
00159   ierr = PetscStrcmp(pct,PCJACOBI,&flg); CHKERRQ(ierr);
00160   if (flg) {
00161     sprintf(ss,"%s",pct);
00162     goto exit;
00163   }
00164   ierr = PetscStrcmp(pct,PCNONE,&flg); CHKERRQ(ierr);
00165   if (flg) {
00166     sprintf(ss,"%s",pct);
00167     goto exit;
00168   }
00169 
00170   /* any remaining cases */
00171   sprintf(ss,"%s%d",pct,pcv);
00172  exit:
00173   *s = ss;
00174   PetscFunctionReturn(0);
00175 }
00176 
00177 #if 0
00178 /*
00179  * PC extra setup and statistics gathering
00180  */
00181 static PetscErrorCode set_total_blocks(PC pc,PCType pct,int n,IS structure)
00182 {
00183   PetscBool flg; int ierr;
00184   PetscFunctionBegin;
00185 
00186   ierr = PetscStrcmp(pct,PCBJACOBI,&flg); CHKERRQ(ierr);
00187   if (flg) {
00188     int i,nsplits,*lengths; const PetscInt *splits;
00189     if ((int)structure) {
00190       ierr = ISGetSize(structure,&nsplits); CHKERRQ(ierr);
00191       ierr = ISGetIndices(structure,&splits); CHKERRQ(ierr);
00192       ierr = PetscMalloc((nsplits-1)*sizeof(int),&lengths); CHKERRQ(ierr);
00193       for (i=0; i<nsplits-1; i++) lengths[i] = splits[i+1]-splits[i];
00194       ierr = ISRestoreIndices(structure,&splits); CHKERRQ(ierr);
00195       ierr = PCBJacobiSetTotalBlocks(pc,nsplits-1,lengths); CHKERRQ(ierr);
00196       ierr = PetscFree(lengths); CHKERRQ(ierr);
00197     } else {
00198       ierr = PCBJacobiSetTotalBlocks(pc,n,PETSC_NULL); CHKERRQ(ierr);
00199     }
00200   }
00201 
00202   ierr = PetscStrcmp(pct,PCASM,&flg); CHKERRQ(ierr);
00203   if (flg) {
00204     if ((long int)structure!=0) {
00205       IS *isses; int i,nsplits; const PetscInt *splits;
00206       ierr = ISGetSize(structure,&nsplits); CHKERRQ(ierr);
00207       ierr = ISGetIndices(structure,&splits); CHKERRQ(ierr);
00208       ierr = PetscMalloc((nsplits-1)*sizeof(IS),&isses); CHKERRQ(ierr);
00209       for (i=0; i<nsplits-1; i++) {
00210         ierr = ISCreateStride
00211           (MPI_COMM_SELF,
00212            splits[i+1]-splits[i],splits[i],1,isses+i); CHKERRQ(ierr);
00213       }
00214       ierr = ISRestoreIndices(structure,&splits); CHKERRQ(ierr);
00215       ierr = PCASMSetLocalSubdomains(pc,nsplits-1,isses); CHKERRQ(ierr);
00216     } else {
00217       ierr = PCASMSetLocalSubdomains(pc,n,PETSC_NULL); CHKERRQ(ierr);
00218     }
00219   }
00220   PetscFunctionReturn(0);
00221 }
00222 #endif
00223 
00224 #undef __FUNCT__
00225 #define __FUNCT__ "ilu_stats_function"
00226 static PetscErrorCode ilu_stats_function(PC pc,void *ctx)
00227 {
00228   /*
00229   sans_info_block info = (sans_info_block)ctx;
00230   PetscErrorCode ierr;
00231   */
00232   PetscFunctionBegin;
00233   /*
00234   ierr = PCILUGetShift(pc,&fraction); CHKERRQ(ierr);
00235   ierr = matrix_statistics_set_manteuffel_fraction
00236   (stats,fraction); CHKERRQ(ierr);
00237   */
00238   PetscFunctionReturn(0);
00239 }
00240 
00241 #undef __FUNCT__
00242 #define __FUNCT__ "get_pc_stats_function"
00243 PetscErrorCode get_pc_stats_function(PCType pct,int(**f)(PC,void*))
00244 {
00245   PetscBool flg; int ierr;
00246 
00247   PetscFunctionBegin;
00248   *f = 0;
00249   ierr = PetscStrcmp(pct,PCILU,&flg); CHKERRQ(ierr);
00250   if (flg) {
00251     *f = &ilu_stats_function;}
00252   PetscFunctionReturn(0);
00253 }
00254 
00255 #undef __FUNCT__
00256 #define __FUNCT__ "set_preconditioner_base_matrix"
00257 PetscErrorCode set_preconditioner_base_matrix
00258 (PCType pct,Mat B,Mat *Buse)
00259 {
00260   PetscBool flg; PetscErrorCode ierr;
00261 
00262   PetscFunctionBegin;
00263   *Buse = B;
00264 
00265   /*
00266    * For a bunch of preconditioners, we need to convert the B matrix
00267    */
00268   ierr = PetscStrcmp(pct,PCBS95,&flg); CHKERRQ(ierr);
00269   if (flg) {
00270     ierr = MatConvert
00271       (B,MATMPIAIJ,MAT_INITIAL_MATRIX,Buse); CHKERRQ(ierr);
00272     goto done;
00273   }
00274   ierr = PetscStrcmp(pct,PCMUMPS,&flg); CHKERRQ(ierr);
00275   if (flg) {
00276     ierr = MatConvert
00277       (B,"mumps",MAT_INITIAL_MATRIX,Buse); CHKERRQ(ierr);
00278     goto done;
00279   }
00280   ierr = PetscStrcmp(pct,PCSPOOLES,&flg); CHKERRQ(ierr);
00281   if (flg) {
00282     ierr = MatConvert
00283       (B,"spooles",MAT_INITIAL_MATRIX,Buse); CHKERRQ(ierr);
00284     goto done;
00285   }
00286   ierr = PetscStrcmp(pct,PCSUPERLU,&flg); CHKERRQ(ierr);
00287   if (flg) {
00288     ierr = MatConvert
00289       (B,"superlu_dist",MAT_INITIAL_MATRIX,Buse); CHKERRQ(ierr);
00290     goto done;
00291   }
00292   ierr = PetscStrcmp(pct,PCUMFPACK,&flg); CHKERRQ(ierr);
00293   if (flg) {
00294     ierr = MatConvert
00295       (B,"umfpack",MAT_INITIAL_MATRIX,Buse); CHKERRQ(ierr);
00296     goto done;
00297   }
00298  done:
00299   PetscFunctionReturn(0);
00300 }
00301 
00302 #undef __FUNCT__
00303 #define __FUNCT__ "SetPetscOptionsForPC"
00304 PetscErrorCode SetPetscOptionsForPC(PC pc,PCType pct0, int pcv,int pcvv)
00305 {
00306   const PCType pct = pct0; PetscBool f,no_pcv; PetscErrorCode ierr;
00307   PetscFunctionBegin;
00308 
00309   /*
00310    * set pc type
00311    */
00312   no_pcv = PETSC_FALSE;
00313 
00314   ierr = PetscStrcmp(pct,PCLU,&f); CHKERRQ(ierr);
00315   if (f) {
00316     ierr = PetscOptionsSetValue("-pc_factor_shift_positive_definite",PETSC_NULL); CHKERRQ(ierr);
00317     ierr = PetscOptionsSetValue("-ana_pc_factor_shift_positive_definite",PETSC_NULL); CHKERRQ(ierr);
00318     goto set;
00319   }
00320 
00321   ierr = PetscStrcmp(pct,PCSILU,&f); CHKERRQ(ierr);
00322   if (f) {
00323     pct = PCILU; char levels[5];
00324     ierr = PetscOptionsSetValue("-mat_no_inode",PETSC_NULL); CHKERRQ(ierr);
00325     ierr = PetscOptionsSetValue("-ana_mat_no_inode",PETSC_NULL); CHKERRQ(ierr);
00326     sprintf(levels,"%d",pcv-1);
00327     ierr = PetscOptionsClearValue("-pc_factor_levels"); CHKERRQ(ierr);
00328     ierr = PetscOptionsClearValue("-ana_pc_factor_levels"); CHKERRQ(ierr);
00329     ierr = PetscOptionsSetValue("-pc_factor_levels",levels); CHKERRQ(ierr);
00330     ierr = PetscOptionsSetValue("-ana_pc_factor_levels",levels); CHKERRQ(ierr);
00331     ierr = PetscOptionsSetValue("-pc_factor_shift_positive_definite","1"); CHKERRQ(ierr);
00332     ierr = PetscOptionsSetValue("-ana_pc_factor_shift_positive_definite","1"); CHKERRQ(ierr);
00333     goto set;
00334   }
00335 
00336   ierr = PetscStrcmp(pct,PCILU,&f); CHKERRQ(ierr);
00337   if (f) {
00338     char levels[5];
00339     ierr = PetscOptionsSetValue("-mat_no_inode",PETSC_NULL); CHKERRQ(ierr);
00340     ierr = PetscOptionsSetValue("-ana_mat_no_inode",PETSC_NULL); CHKERRQ(ierr);
00341     sprintf(levels,"%d",pcv-1);
00342     ierr = PetscOptionsClearValue("-pc_factor_levels"); CHKERRQ(ierr);
00343     ierr = PetscOptionsClearValue("-ana_pc_factor_levels"); CHKERRQ(ierr);
00344     ierr = PetscOptionsSetValue("-pc_factor_levels",levels); CHKERRQ(ierr);
00345     ierr = PetscOptionsSetValue("-ana_pc_factor_levels",levels); CHKERRQ(ierr);
00346     ierr = PetscOptionsSetValue("-pc_factor_shift_nonzero",".000000001"); CHKERRQ(ierr);
00347     ierr = PetscOptionsSetValue("-ana_pc_factor_shift_nonzero",".000000001"); CHKERRQ(ierr);
00348     /*
00349     ierr = PetscOptionsSetValue("-pc_factor_shift_positive_definite","0"); CHKERRQ(ierr);
00350     ierr = PetscOptionsSetValue("-ana_pc_factor_shift_positive_definite","0"); CHKERRQ(ierr);
00351     */
00352     goto set;
00353   }
00354 
00355 #if defined(PETSC_HAVE_SPAI)
00356   ierr = PetscStrcmp(pct,PCSPAI,&f); CHKERRQ(ierr);
00357   if (f) {
00358     char val[5];
00359     sprintf(val,"%d",pcv);
00360     ierr = PetscOptionsSetValue("-pc_spai_block_size",val); CHKERRQ(ierr);
00361     ierr = PetscOptionsSetValue("-ana_pc_spai_block_size",val); CHKERRQ(ierr);
00362     goto set;
00363   }
00364 #endif
00365 
00366   ierr = PetscStrcmp(pct,PCBS95,&f); CHKERRQ(ierr);
00367   if (f) {
00368     pct = PCILU; /* presumably the matrix has been converted elsewhere */
00369     no_pcv = PETSC_TRUE;
00370     ierr = PetscOptionsClearValue("-pc_factor_levels"); CHKERRQ(ierr);
00371     ierr = PetscOptionsClearValue("-ana_pc_factor_levels"); CHKERRQ(ierr);
00372     goto set;
00373   }
00374 
00375   ierr = PetscStrcmp(pct,PCBJACOBI,&f); CHKERRQ(ierr);
00376   if (f) {
00377     ierr = PetscOptionsSetValue("-pc_bjacobi_blocks","6"); CHKERRQ(ierr);
00378     ierr = PetscOptionsSetValue("-ana_pc_bjacobi_blocks","6"); CHKERRQ(ierr);
00379     ierr = set_blocked_sub_pc(pcv); CHKERRQ(ierr);
00380     goto set;
00381   }
00382 
00383   ierr = PetscStrcmp(pct,PCASM,&f); CHKERRQ(ierr);
00384   if (f) {
00385     ierr = PetscOptionsSetValue("-pc_asm_type","basic"); CHKERRQ(ierr);
00386     ierr = PetscOptionsSetValue("-ana_pc_asm_type","basic"); CHKERRQ(ierr);
00387     ierr = PetscOptionsSetValue("-pc_asm_blocks","6"); CHKERRQ(ierr);
00388     ierr = PetscOptionsSetValue("-ana_pc_asm_blocks","6"); CHKERRQ(ierr);
00389     ierr = set_blocked_sub_pc(pcv); CHKERRQ(ierr);
00390     goto set;
00391   }
00392 
00393   ierr = PetscStrcmp(pct,PCRASM,&f); CHKERRQ(ierr);
00394   if (f) {
00395     pct = PCASM; /* restricted asm is asm with the restrict option */
00396     ierr = PetscOptionsSetValue("-pc_asm_type","restrict"); CHKERRQ(ierr);
00397     ierr = PetscOptionsSetValue("-ana_pc_asm_type","restrict"); CHKERRQ(ierr);
00398     ierr = PetscOptionsSetValue("-pc_asm_blocks","6"); CHKERRQ(ierr);
00399     ierr = PetscOptionsSetValue("-ana_pc_asm_blocks","6"); CHKERRQ(ierr);
00400     ierr = set_blocked_sub_pc(pcv); CHKERRQ(ierr);
00401     goto set;
00402   }
00403 
00404   /*
00405    * Hypre variants
00406    */
00407   ierr = PetscStrcmp(pct,PCBOOMERAMG,&f); CHKERRQ(ierr);
00408   if (f) {
00409     pct = PCHYPRE;
00410     no_pcv = PETSC_TRUE;
00411     ierr = PetscOptionsSetValue
00412       ("-pc_hypre_type","boomeramg"); CHKERRQ(ierr);
00413     ierr = PetscOptionsSetValue
00414       ("-ana_pc_hypre_type","boomeramg"); CHKERRQ(ierr);
00415     ierr = PetscOptionsSetValue
00416       ("-pc_hypre_boomeramg_tol","0.0"); CHKERRQ(ierr);
00417     ierr = PetscOptionsSetValue
00418       ("-ana_pc_hypre_boomeramg_tol","0.0"); CHKERRQ(ierr);
00419     ierr = PetscOptionsSetValue
00420       ("-pc_hypre_boomeramg_max_iter","1"); CHKERRQ(ierr);
00421     ierr = PetscOptionsSetValue
00422       ("-ana_pc_hypre_boomeramg_max_iter","1"); CHKERRQ(ierr);
00423     ierr = PetscOptionsSetValue
00424       ("-pc_hypre_boomeramg_relax_type_coarse","Gaussian-elimination"); CHKERRQ(ierr);
00425     ierr = PetscOptionsSetValue
00426       ("-ana_pc_hypre_boomeramg_relax_type_coarse","Gaussian-elimination"); CHKERRQ(ierr);
00427     goto set;
00428   }
00429 
00430   ierr = PetscStrcmp(pct,PCEUCLID,&f); CHKERRQ(ierr);
00431   if (f) {
00432     char n[3];
00433     pct = PCHYPRE;
00434     no_pcv = PETSC_TRUE;
00435     ierr = PetscOptionsSetValue
00436       ("-pc_hypre_type","euclid"); CHKERRQ(ierr);
00437     ierr = PetscOptionsSetValue
00438       ("-ana_pc_hypre_type","euclid"); CHKERRQ(ierr);
00439     ierr = PetscMemzero(n,3*sizeof(char)); CHKERRQ(ierr);
00440     sprintf(n,"%d",pcv);
00441     ierr = PetscOptionsSetValue
00442       ("-pc_hypre_euclid_levels",n); CHKERRQ(ierr);
00443     ierr = PetscOptionsSetValue
00444       ("-ana_pc_hypre_euclid_levels",n); CHKERRQ(ierr);
00445     goto set;
00446   }
00447 
00448   ierr = PetscStrcmp(pct,PCPARASAILS,&f); CHKERRQ(ierr);
00449   if (f) {
00450     char n[3];
00451     pct = PCHYPRE;
00452     no_pcv = PETSC_TRUE;
00453     ierr = PetscOptionsSetValue
00454       ("-pc_hypre_type","parasails"); CHKERRQ(ierr);
00455     ierr = PetscOptionsSetValue
00456       ("-ana_pc_hypre_type","parasails"); CHKERRQ(ierr);
00457     ierr = PetscMemzero(n,3*sizeof(char)); CHKERRQ(ierr);
00458     sprintf(n,"%d",pcv);
00459     ierr = PetscOptionsSetValue
00460       ("-pc_hypre_parasails_nlevels",n); CHKERRQ(ierr);
00461     ierr = PetscOptionsSetValue
00462       ("-ana_pc_hypre_parasails_nlevels",n); CHKERRQ(ierr);
00463     goto set;
00464   }
00465 
00466   ierr = PetscStrcmp(pct,PCPILUT,&f); CHKERRQ(ierr);
00467   if (f) {
00468     pct = PCHYPRE;
00469     no_pcv = PETSC_TRUE;
00470     ierr = PetscOptionsSetValue("-pc_hypre_type","pilut"); CHKERRQ(ierr);
00471     ierr = PetscOptionsSetValue("-ana_pc_hypre_type","pilut"); CHKERRQ(ierr);
00472     goto set;
00473   }
00474 
00475   /*
00476    * Direct methods are all PCLU
00477    */
00478   ierr = PetscStrcmp(pct,PCSUPERLU,&f); CHKERRQ(ierr);
00479   if (f) {
00480     pct = PCLU;
00481     no_pcv = PETSC_TRUE;
00482     goto set;
00483   }
00484   ierr = PetscStrcmp(pct,PCMUMPS,&f); CHKERRQ(ierr);
00485   if (f) {
00486     pct = PCLU;
00487     no_pcv = PETSC_TRUE;
00488     goto set;
00489   }
00490   ierr = PetscStrcmp(pct,PCSPOOLES,&f); CHKERRQ(ierr);
00491   if (f) {
00492     pct = PCLU;
00493     no_pcv = PETSC_TRUE;
00494     goto set;
00495   }
00496   ierr = PetscStrcmp(pct,PCUMFPACK,&f); CHKERRQ(ierr);
00497   if (f) {
00498     pct = PCLU;
00499     no_pcv = PETSC_TRUE;
00500     goto set;
00501   }
00502 
00503  set:
00504   ierr = PetscOptionsSetValue("-pc_type",pct); CHKERRQ(ierr);
00505   ierr = PetscOptionsSetValue("-ana_pc_type",pct); CHKERRQ(ierr);
00506   if (no_pcv) PetscFunctionReturn(0);
00507 
00508   PetscFunctionReturn(0);
00509 }
00510