PetscErrorCode PCSetFromOptions_Factor(PC pc) { PC_Factor *factor = (PC_Factor*)pc->data; PetscErrorCode ierr; PetscBool flg = PETSC_FALSE,set; char tname[256], solvertype[64]; PetscFunctionList ordlist; PetscEnum etmp; PetscFunctionBegin; if (!MatOrderingRegisterAllCalled) {ierr = MatOrderingRegisterAll();CHKERRQ(ierr);} ierr = PetscOptionsBool("-pc_factor_in_place","Form factored matrix in the same memory as the matrix","PCFactorSetUseInPlace",flg,&flg,NULL);CHKERRQ(ierr); if (flg) { ierr = PCFactorSetUseInPlace(pc);CHKERRQ(ierr); } ierr = PetscOptionsReal("-pc_factor_fill","Expected non-zeros in factored matrix","PCFactorSetFill",((PC_Factor*)factor)->info.fill,&((PC_Factor*)factor)->info.fill,0);CHKERRQ(ierr); ierr = PetscOptionsEnum("-pc_factor_shift_type","Type of shift to add to diagonal","PCFactorSetShiftType", MatFactorShiftTypes,(PetscEnum)(int)((PC_Factor*)factor)->info.shifttype,&etmp,&flg);CHKERRQ(ierr); if (flg) { ierr = PCFactorSetShiftType(pc,(MatFactorShiftType)etmp);CHKERRQ(ierr); } ierr = PetscOptionsReal("-pc_factor_shift_amount","Shift added to diagonal","PCFactorSetShiftAmount",((PC_Factor*)factor)->info.shiftamount,&((PC_Factor*)factor)->info.shiftamount,0);CHKERRQ(ierr); ierr = PetscOptionsReal("-pc_factor_zeropivot","Pivot is considered zero if less than","PCFactorSetZeroPivot",((PC_Factor*)factor)->info.zeropivot,&((PC_Factor*)factor)->info.zeropivot,0);CHKERRQ(ierr); ierr = PetscOptionsReal("-pc_factor_column_pivot","Column pivot tolerance (used only for some factorization)","PCFactorSetColumnPivot",((PC_Factor*)factor)->info.dtcol,&((PC_Factor*)factor)->info.dtcol,&flg);CHKERRQ(ierr); flg = ((PC_Factor*)factor)->info.pivotinblocks ? PETSC_TRUE : PETSC_FALSE; ierr = PetscOptionsBool("-pc_factor_pivot_in_blocks","Pivot inside matrix dense blocks for BAIJ and SBAIJ","PCFactorSetPivotInBlocks",flg,&flg,&set);CHKERRQ(ierr); if (set) { ierr = PCFactorSetPivotInBlocks(pc,flg);CHKERRQ(ierr); } flg = PETSC_FALSE; ierr = PetscOptionsBool("-pc_factor_reuse_fill","Use fill from previous factorization","PCFactorSetReuseFill",flg,&flg,NULL);CHKERRQ(ierr); if (flg) { ierr = PCFactorSetReuseFill(pc,PETSC_TRUE);CHKERRQ(ierr); } flg = PETSC_FALSE; ierr = PetscOptionsBool("-pc_factor_reuse_ordering","Reuse ordering from previous factorization","PCFactorSetReuseOrdering",flg,&flg,NULL);CHKERRQ(ierr); if (flg) { ierr = PCFactorSetReuseOrdering(pc,PETSC_TRUE);CHKERRQ(ierr); } ierr = MatGetOrderingList(&ordlist);CHKERRQ(ierr); ierr = PetscOptionsList("-pc_factor_mat_ordering_type","Reordering to reduce nonzeros in factored matrix","PCFactorSetMatOrderingType",ordlist,((PC_Factor*)factor)->ordering,tname,256,&flg);CHKERRQ(ierr); if (flg) { ierr = PCFactorSetMatOrderingType(pc,tname);CHKERRQ(ierr); } /* maybe should have MatGetSolverTypes(Mat,&list) like the ordering list */ ierr = PetscOptionsString("-pc_factor_mat_solver_package","Specific direct solver to use","MatGetFactor",((PC_Factor*)factor)->solvertype,solvertype,64,&flg);CHKERRQ(ierr); if (flg) { ierr = PCFactorSetMatSolverPackage(pc,solvertype);CHKERRQ(ierr); } PetscFunctionReturn(0); }
PetscErrorCode PressurePoissonCreate( ) { PetscErrorCode ierr; PetscFunctionBegin; PetscLogEventBegin(EVENT_PressurePoissonCreate,0,0,0,0); // PetscLogEventRegister(&EVENT_PressurePoissonCreate,"PressurePoissonCreate", 0); ierr = KSPCreate(PETSC_COMM_SELF, &ksp); CHKERRQ(ierr); KSPGetPC(ksp, &pc); // KSPSetType(ksp, KSPCG); // PCSetType(pc, PCICC); // PCFactorSetLevels(pc, 0); // KSPSetInitialGuessNonzero(ksp, PETSC_TRUE); KSPSetType(ksp, KSPPREONLY); PCSetType(pc, PCCHOLESKY); PCFactorSetMatOrderingType(pc, MATORDERING_ND); KSPSetFromOptions(ksp); KSPSetOperators(ksp, m, m, SAME_PRECONDITIONER); PCSetUp(pc); ierr = IIMCreate(&iim, 12); CHKERRQ(ierr); // IIMSetForceComponents(iim, ForceComponentNormalSimple, ForceComponentTangentialSimple); CreateGrid2D(d1, d2, &rhsC); CreateGrid2D(d1, d2, &p); CreateGrid2D(d1, d2, &px); CreateGrid2D(d1, d2, &py); CreateGrid2D(d1, d2, &u); CreateGrid2D(d1, d2, &v); ierr = CreateLevelSet2D(d1,d2,&ls); CHKERRQ(ierr); CreateLevelSet2D(d1, d2, &lstemp); LevelSetInitializeToStar(ls,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE); // LevelSetInitializeToCircle(ls, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE); PetscLogEventEnd(EVENT_PressurePoissonCreate,0,0,0,0); PetscFunctionReturn(0); }
#if defined(PETSC_HAVE_FORTRAN_CAPS) #define pcfactorsetmatorderingtype_ PCFACTORSETMATORDERINGTYPE #define pcfactorsetmatsolverpackage_ PCFACTORSETMATSOLVERPACKAGE #define pcfactorgetmatsolverpackage_ PCFACTORGETMATSOLVERPACKAGE #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) #define pcfactorsetmatorderingtype_ pcfactorsetmatorderingtype #define pcfactorsetmatsolverpackage_ pcfactorsetmatsolverpackage #define pcfactorgetmatsolverpackage_ pcfactorgetmatsolverpackage #endif EXTERN_C_BEGIN void PETSC_STDCALL pcfactorsetmatorderingtype_(PC *pc,CHAR ordering PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)){ char *t; FIXCHAR(ordering,len,t); *ierr = PCFactorSetMatOrderingType(*pc,t); FREECHAR(ordering,t); } void PETSC_STDCALL pcfactorsetmatsolverpackage_(PC *pc,CHAR ordering PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)){ char *t; FIXCHAR(ordering,len,t); *ierr = PCFactorSetMatSolverPackage(*pc,t); FREECHAR(ordering,t); } void PETSC_STDCALL pcfactorgetmatsolverpackage_(PC *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) { const char *tname; *ierr = PCFactorGetMatSolverPackage(*mat,&tname);if (*ierr) return; if (name != PETSC_NULL_CHARACTER_Fortran) {
END_TEST START_TEST( test_IIMContext ) { IIM iim; int d1=63, d2=d1; Grid2D rhsC, p, px, py, u, v; LevelSet2D ls, lstemp; PetscErrorCode ierr; Mat m; KSP ksp; PC pc; Generate2DLaplacianPeriodicBC( d1, d2, &m); ierr = KSPCreate(PETSC_COMM_SELF, &ksp); CHKERRQ(ierr); KSPGetPC(ksp, &pc); // KSPSetType(ksp, KSPCG); // PCSetType(pc, PCICC); // PCFactorSetLevels(pc, 0); // KSPSetInitialGuessNonzero(ksp, PETSC_TRUE); KSPSetType(ksp, KSPPREONLY); PCSetType(pc, PCCHOLESKY); PCFactorSetMatOrderingType(pc, MATORDERING_ND); KSPSetFromOptions(ksp); KSPSetOperators(ksp, m, m, SAME_PRECONDITIONER); PCSetUp(pc); ierr = IIMCreate(&iim, 12); CHKERRQ(ierr); // IIMSetForceComponents(iim, ForceComponentNormalSimple, ForceComponentTangentialSimple); CreateGrid2D(d1, d2, &rhsC); CreateGrid2D(d1, d2, &p); CreateGrid2D(d1, d2, &px); CreateGrid2D(d1, d2, &py); CreateGrid2D(d1, d2, &u); CreateGrid2D(d1, d2, &v); ierr = CreateLevelSet2D(d1,d2,&ls); CHKERRQ(ierr); CreateLevelSet2D(d1, d2, &lstemp); LevelSetInitializeToStar(ls,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE); // LevelSetInitializeToCircle(ls, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE); Vec u2,v2,magVel; VecCreateSeq(PETSC_COMM_SELF,d1*d2,&magVel); VecDuplicate(magVel, &u2); VecDuplicate(magVel, &v2); PetscReal maxVel, dt; WriteVec wv, wvC, wvP, wvPX, wvPY, wvU, wvV; WriteVecCreate(lstemp->g2d->v, "ls",&wv); WriteVecCreate(rhsC->v, "c", &wvC); WriteVecCreate(p->v, "p", &wvP); WriteVecCreate(px->v, "px", &wvPY); WriteVecCreate(py->v, "py", &wvPX); WriteVecCreate(u->v, "u", &wvU); WriteVecCreate(v->v, "v", &wvV); for( int t = 0; t < 100; t++ ) { printf("TIME: %d ",t); VecSet(rhsC->v, 0.); // TODO: this is important when reusing vecs, need to reset back to zero after time step ierr = IIMComputeCorrection2D(iim,JumpConditionPressure,ls,rhsC); CHKERRQ(ierr); IIMDiscreteCompatabilityCondition(ls, rhsC); ierr = KSPSolve(ksp, rhsC->v, p->v); CHKERRQ(ierr); IrregularNodeListWrite(ls,t); ierr = IIMPressureGradient(ls,p,px,py); CHKERRQ(ierr); ierr = IIMComputeCorrection2D(iim,JumpConditionXVelocity,ls,px); CHKERRQ(ierr); px->v2[d1/2][d2/2] = 0.; ierr = KSPSolve(ksp, px->v, u->v); CHKERRQ(ierr); ierr = IIMComputeCorrection2D(iim,JumpConditionYVelocity,ls,py); CHKERRQ(ierr); py->v2[d1/2][d2/2] = 0.; ierr = KSPSolve(ksp, py->v, v->v); CHKERRQ(ierr); VecPointwiseMult(u2, u->v, u->v); VecPointwiseMult(v2, u->v, u->v); VecWAXPY(magVel, 1, u2, v2); VecSqrt( magVel ); VecNorm(magVel, NORM_INFINITY, &maxVel); dt = PetscMin(1/(2*maxVel),.1); LevelSetAdvect2D(dt, u, v, ls, lstemp); printf("\tmaxVel: %f",maxVel); printf("\tdt: %f\n",dt); WriteVecToDisk(wv); WriteVecToDisk(wvC); WriteVecToDisk(wvP); WriteVecToDisk(wvPX); WriteVecToDisk(wvPY); WriteVecToDisk(wvU); WriteVecToDisk(wvV); VecCopy( lstemp->g2d->v, ls->g2d->v); UpdateIrregularNodeList(ls); // ReinitializeLevelSet(ls); } ierr = VecDestroy(magVel); CHKERRQ(ierr); ierr = VecDestroy(u2); CHKERRQ(ierr); ierr = VecDestroy(v2); CHKERRQ(ierr); ierr = DestroyLevelSet2D(ls); CHKERRQ(ierr); ierr = DestroyGrid2D(rhsC); CHKERRQ(ierr); ierr = DestroyGrid2D(p); CHKERRQ(ierr); ierr = DestroyGrid2D(px); CHKERRQ(ierr); ierr = DestroyGrid2D(py); CHKERRQ(ierr); ierr = DestroyGrid2D(u); CHKERRQ(ierr); ierr = DestroyGrid2D(v); CHKERRQ(ierr); ierr = IIMDestroy(iim); CHKERRQ(ierr); }