static PetscErrorCode PCSetUp_KSP(PC pc) { PetscErrorCode ierr; PC_KSP *jac = (PC_KSP*)pc->data; Mat mat; PetscBool A; PetscFunctionBegin; if (!jac->ksp) {ierr = PCKSPCreateKSP_KSP(pc);CHKERRQ(ierr);} ierr = KSPSetFromOptions(jac->ksp);CHKERRQ(ierr); if (jac->use_true_matrix) mat = pc->mat; else mat = pc->pmat; ierr = KSPGetOperatorsSet(jac->ksp,&A,PETSC_NULL);CHKERRQ(ierr); if (!A) { ierr = KSPSetOperators(jac->ksp,mat,pc->pmat,pc->flag);CHKERRQ(ierr); } else if (pc->flag != SAME_PRECONDITIONER) { Mat Amat,Bmat; ierr = KSPGetOperators(jac->ksp,&Amat,&Bmat,PETSC_NULL);CHKERRQ(ierr); if (Amat == mat && Bmat == pc->pmat) { /* The user has not replaced the matrices so we are expected to forward the update. This incorrectly diagnoses * changed matrices at the top level as the user manually changing the inner matrices, but we have no way to * identify that in this context. The longer term solution is to track matrix state internally. */ ierr = KSPSetOperators(jac->ksp,mat,pc->pmat,pc->flag);CHKERRQ(ierr); } } ierr = KSPSetUp(jac->ksp);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode PCView_KSP(PC pc,PetscViewer viewer) { PC_KSP *jac = (PC_KSP*)pc->data; PetscErrorCode ierr; PetscTruth iascii; PetscFunctionBegin; if (!jac->ksp) {ierr = PCKSPCreateKSP_KSP(pc);CHKERRQ(ierr);} ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); if (iascii) { if (jac->use_true_matrix) { ierr = PetscViewerASCIIPrintf(viewer,"Using true matrix (not preconditioner matrix) on inner solve\n");CHKERRQ(ierr); } ierr = PetscViewerASCIIPrintf(viewer,"KSP and PC on KSP preconditioner follow\n");CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(viewer,"---------------------------------\n");CHKERRQ(ierr); } else { SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported for this object",((PetscObject)viewer)->type_name); } ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); ierr = KSPView(jac->ksp,viewer);CHKERRQ(ierr); ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); if (iascii) { ierr = PetscViewerASCIIPrintf(viewer,"---------------------------------\n");CHKERRQ(ierr); } PetscFunctionReturn(0); }
static PetscErrorCode PCKSPGetKSP_KSP(PC pc,KSP *ksp) { PC_KSP *jac = (PC_KSP*)pc->data; PetscErrorCode ierr; PetscFunctionBegin; if (!jac->ksp) {ierr = PCKSPCreateKSP_KSP(pc);CHKERRQ(ierr);} *ksp = jac->ksp; PetscFunctionReturn(0); }
EXTERN_C_END EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "PCKSPGetKSP_KSP" PetscErrorCode PETSCKSP_DLLEXPORT PCKSPGetKSP_KSP(PC pc,KSP *ksp) { PC_KSP *jac = (PC_KSP*)pc->data; PetscErrorCode ierr; PetscFunctionBegin; if (!jac->ksp) {ierr = PCKSPCreateKSP_KSP(pc);CHKERRQ(ierr);} *ksp = jac->ksp; PetscFunctionReturn(0); }
static PetscErrorCode PCSetUp_KSP(PC pc) { PetscErrorCode ierr; PC_KSP *jac = (PC_KSP*)pc->data; Mat mat; PetscFunctionBegin; if (!jac->ksp) { ierr = PCKSPCreateKSP_KSP(pc);CHKERRQ(ierr); ierr = KSPSetFromOptions(jac->ksp);CHKERRQ(ierr); } if (pc->useAmat) mat = pc->mat; else mat = pc->pmat; ierr = KSPSetOperators(jac->ksp,mat,pc->pmat);CHKERRQ(ierr); ierr = KSPSetUp(jac->ksp);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode PCSetUp_KSP(PC pc) { PetscErrorCode ierr; PC_KSP *jac = (PC_KSP*)pc->data; Mat mat; PetscTruth A; PetscFunctionBegin; if (!jac->ksp) {ierr = PCKSPCreateKSP_KSP(pc);CHKERRQ(ierr);} ierr = KSPSetFromOptions(jac->ksp);CHKERRQ(ierr); if (jac->use_true_matrix) mat = pc->mat; else mat = pc->pmat; ierr = KSPGetOperatorsSet(jac->ksp,&A,PETSC_NULL);CHKERRQ(ierr); if (!A) { ierr = KSPSetOperators(jac->ksp,mat,pc->pmat,pc->flag);CHKERRQ(ierr); } ierr = KSPSetUp(jac->ksp);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode PCView_KSP(PC pc,PetscViewer viewer) { PC_KSP *jac = (PC_KSP*)pc->data; PetscErrorCode ierr; PetscBool iascii; PetscFunctionBegin; if (!jac->ksp) {ierr = PCKSPCreateKSP_KSP(pc);CHKERRQ(ierr);} ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); if (iascii) { if (pc->useAmat) { ierr = PetscViewerASCIIPrintf(viewer," Using Amat (not Pmat) as operator on inner solve\n");CHKERRQ(ierr); } ierr = PetscViewerASCIIPrintf(viewer," KSP and PC on KSP preconditioner follow\n");CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(viewer," ---------------------------------\n");CHKERRQ(ierr); } ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); ierr = KSPView(jac->ksp,viewer);CHKERRQ(ierr); ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); if (iascii) { ierr = PetscViewerASCIIPrintf(viewer," ---------------------------------\n");CHKERRQ(ierr); } PetscFunctionReturn(0); }