System Preprocessors
|
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(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 PetscTruth 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(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 PetscTruth 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(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 PetscTruth 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 PetscTruth 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 PetscTruth 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,MAT_SOLVER_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,MAT_SOLVER_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,MAT_SOLVER_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,MAT_SOLVER_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; PetscTruth 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