void PETSc::Solve(void) { //start_clock("Before Assemble matrix and vector"); ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY); ierr = VecAssemblyBegin(x); ierr = VecAssemblyEnd(x); ierr = VecAssemblyBegin(b); ierr = VecAssemblyEnd(b); //stop_clock("After Assembly matrix and vector"); KSPSetOperators(ksp,A,A,DIFFERENT_NONZERO_PATTERN); KSPSetType(ksp,KSPBCGSL); KSPBCGSLSetEll(ksp,2); //KSPGetPC(ksp, &pc); //PCSetType(pc, PCJACOBI); KSPSetFromOptions(ksp); KSPSetUp(ksp); //start_clock("Before KSPSolve"); KSPSolve(ksp,b,x); //stop_clock("After KSPSolve"); }
PetscErrorCode KSPSetFromOptions_BCGSL(KSP ksp) { KSP_BCGSL *bcgsl = (KSP_BCGSL *)ksp->data; PetscErrorCode ierr; PetscInt this_ell; PetscReal delta; PetscTruth flga = PETSC_FALSE, flg; PetscFunctionBegin; /* PetscOptionsBegin/End are called in KSPSetFromOptions. They don't need to be called here. */ ierr = PetscOptionsHead("KSP BiCGStab(L) Options"); CHKERRQ(ierr); /* Set number of search directions */ ierr = PetscOptionsInt("-ksp_bcgsl_ell","Number of Krylov search directions","KSPBCGSLSetEll",bcgsl->ell,&this_ell,&flg); CHKERRQ(ierr); if (flg) { ierr = KSPBCGSLSetEll(ksp, this_ell); CHKERRQ(ierr); } /* Set polynomial type */ ierr = PetscOptionsTruth("-ksp_bcgsl_cxpoly", "Polynomial part of BiCGStabL is MinRes + OR", "KSPBCGSLSetPol", flga,&flga,PETSC_NULL); CHKERRQ(ierr); if (flga) { ierr = KSPBCGSLSetPol(ksp, PETSC_TRUE); CHKERRQ(ierr); } else { flg = PETSC_FALSE; ierr = PetscOptionsTruth("-ksp_bcgsl_mrpoly", "Polynomial part of BiCGStabL is MinRes", "KSPBCGSLSetPol", flg,&flg,PETSC_NULL); CHKERRQ(ierr); ierr = KSPBCGSLSetPol(ksp, PETSC_FALSE); CHKERRQ(ierr); } /* Will computed residual be refreshed? */ ierr = PetscOptionsReal("-ksp_bcgsl_xres", "Threshold used to decide when to refresh computed residuals", "KSPBCGSLSetXRes", bcgsl->delta, &delta, &flg); CHKERRQ(ierr); if (flg) { ierr = KSPBCGSLSetXRes(ksp, delta); CHKERRQ(ierr); } ierr = PetscOptionsTail(); CHKERRQ(ierr); PetscFunctionReturn(0); }
void PETSc::Solve_withPureNeumann(void) { ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY); ierr = VecAssemblyBegin(x); ierr = VecAssemblyEnd(x); ierr = VecAssemblyBegin(b); ierr = VecAssemblyEnd(b); MatNullSpaceCreate(PETSC_COMM_WORLD,PETSC_TRUE,0,PETSC_NULL,&nullsp); KSPSetNullSpace(ksp,nullsp); KSPSetOperators(ksp,A,A,DIFFERENT_NONZERO_PATTERN); //KSPSetType(ksp,KSPMINRES); //KSPSetType(ksp,KSPGMRES); //KSPSetType(ksp,KSPBCGS); KSPSetType(ksp,KSPBCGSL); KSPBCGSLSetEll(ksp,2); //KSPGetPC(ksp, &pc); //PCSetType(pc, PCASM); //PCSetType(pc, PCMG); //PCMGSetLevels(pc, 3, &PETSC_COMM_WORLD); //PCMGSetType(pc,PC_MG_MULTIPLICATIVE); //PCMGSetCycleType(pc,PC_MG_CYCLE_V); // KSPSetFromOptions(ksp); KSPSetUp(ksp); //start_clock("Before Petsc Solve in pure neumann solver"); KSPSolve(ksp,b,x); //stop_clock("After Petsc Solve in pure neumann solver"); }
void PETSC_STDCALL kspbcgslsetell_(KSP ksp,PetscInt *ell, int *__ierr ){ *__ierr = KSPBCGSLSetEll( (KSP)PetscToPointer((ksp) ),*ell); }