00001 #include <stdlib.h>
00002 #include "petscpc.h"
00003 #include "petscksp.h"
00004 #include "anamod.h"
00005 #include "linpc.h"
00006
00007
00008
00009
00010
00011 #undef __FUNCT__
00012 #define __FUNCT__ "set_blocked_sub_pc"
00013 static PetscErrorCode set_blocked_sub_pc(int pcv)
00014 {
00015 char *opt,val[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(val,"%d",pcv-1);
00025 ierr = PetscOptionsSetValue(opt,val); CHKERRQ(ierr);
00026 opt = "-ana_sub_pc_factor_levels";
00027 sprintf(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(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
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
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
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
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
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
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
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
00171 sprintf(ss,"%s%d",pct,pcv);
00172 exit:
00173 *s = ss;
00174 PetscFunctionReturn(0);
00175 }
00176
00177 #if 0
00178
00179
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
00230
00231
00232 PetscFunctionBegin;
00233
00234
00235
00236
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
00267
00268 ierr = PetscStrcmp(pct,PCBS95,&flg); CHKERRQ(ierr);
00269 if (flg) {
00270 ierr = MatConvert
00271 (B,MATMPIROWBS,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 PCType pct = pct0; PetscTruth f,no_pcv; PetscErrorCode ierr;
00307 PetscFunctionBegin;
00308
00309
00310
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
00350
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;
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;
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
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
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