Lines Matching refs:lsc
12 PC_LSC *lsc = (PC_LSC *)pc->data; in PCLSCAllocate_Private() local
16 if (lsc->allocated) PetscFunctionReturn(PETSC_SUCCESS); in PCLSCAllocate_Private()
17 PetscCall(KSPCreate(PetscObjectComm((PetscObject)pc), &lsc->kspL)); in PCLSCAllocate_Private()
18 PetscCall(KSPSetNestLevel(lsc->kspL, pc->kspnestlevel)); in PCLSCAllocate_Private()
19 PetscCall(KSPSetErrorIfNotConverged(lsc->kspL, pc->erroriffailure)); in PCLSCAllocate_Private()
20 PetscCall(PetscObjectIncrementTabLevel((PetscObject)lsc->kspL, (PetscObject)pc, 1)); in PCLSCAllocate_Private()
21 PetscCall(KSPSetType(lsc->kspL, KSPPREONLY)); in PCLSCAllocate_Private()
22 PetscCall(KSPSetOptionsPrefix(lsc->kspL, ((PetscObject)pc)->prefix)); in PCLSCAllocate_Private()
23 PetscCall(KSPAppendOptionsPrefix(lsc->kspL, "lsc_")); in PCLSCAllocate_Private()
25 PetscCall(MatCreateVecs(A, &lsc->Avec0, &lsc->Avec1)); in PCLSCAllocate_Private()
26 PetscCall(MatCreateVecs(pc->pmat, &lsc->Svec0, NULL)); in PCLSCAllocate_Private()
27 if (lsc->scalediag) PetscCall(VecDuplicate(lsc->Avec0, &lsc->scale)); in PCLSCAllocate_Private()
29 if (lsc->commute) { in PCLSCAllocate_Private()
30 PetscCall(KSPCreate(PetscObjectComm((PetscObject)pc), &lsc->kspMass)); in PCLSCAllocate_Private()
31 PetscCall(KSPSetErrorIfNotConverged(lsc->kspMass, pc->erroriffailure)); in PCLSCAllocate_Private()
32 PetscCall(PetscObjectIncrementTabLevel((PetscObject)lsc->kspMass, (PetscObject)pc, 1)); in PCLSCAllocate_Private()
33 PetscCall(KSPSetType(lsc->kspMass, KSPPREONLY)); in PCLSCAllocate_Private()
34 PetscCall(KSPSetOptionsPrefix(lsc->kspMass, ((PetscObject)pc)->prefix)); in PCLSCAllocate_Private()
35 PetscCall(KSPAppendOptionsPrefix(lsc->kspMass, "lsc_mass_")); in PCLSCAllocate_Private()
36 } else lsc->kspMass = NULL; in PCLSCAllocate_Private()
38 lsc->allocated = PETSC_TRUE; in PCLSCAllocate_Private()
44 PC_LSC *lsc = (PC_LSC *)pc->data; in PCSetUp_LSC() local
60 if (lsc->commute) { in PCSetUp_LSC()
67 if (lsc->scale) { in PCSetUp_LSC()
69 PetscCall(MatGetDiagonal(Qscale, lsc->scale)); in PCSetUp_LSC()
70 PetscCall(VecReciprocal(lsc->scale)); in PCSetUp_LSC()
75 if (lsc->scale) { in PCSetUp_LSC()
78 PetscCall(MatDiagonalScale(CAdiaginv, NULL, lsc->scale)); in PCSetUp_LSC()
79 … if (!lsc->L) PetscCall(MatMatMult(CAdiaginv, B, MAT_INITIAL_MATRIX, PETSC_CURRENT, &lsc->L)); in PCSetUp_LSC()
80 else PetscCall(MatMatMult(CAdiaginv, B, MAT_REUSE_MATRIX, PETSC_CURRENT, &lsc->L)); in PCSetUp_LSC()
83 if (!lsc->L) { in PCSetUp_LSC()
84 PetscCall(MatProductCreate(C, B, NULL, &lsc->L)); in PCSetUp_LSC()
85 PetscCall(MatProductSetType(lsc->L, MATPRODUCT_AB)); in PCSetUp_LSC()
86 PetscCall(MatProductSetFromOptions(lsc->L)); in PCSetUp_LSC()
87 PetscCall(MatProductSymbolic(lsc->L)); in PCSetUp_LSC()
89 PetscCall(MatProductNumeric(lsc->L)); in PCSetUp_LSC()
91 Lp = L = lsc->L; in PCSetUp_LSC()
95 PetscCall(KSPSetOperators(lsc->kspL, L, Lp)); in PCSetUp_LSC()
96 PetscCall(KSPSetFromOptions(lsc->kspL)); in PCSetUp_LSC()
97 if (lsc->commute) { in PCSetUp_LSC()
98 PetscCall(KSPSetOperators(lsc->kspMass, Qscale, Qscale)); in PCSetUp_LSC()
99 PetscCall(KSPSetFromOptions(lsc->kspMass)); in PCSetUp_LSC()
106 PC_LSC *lsc = (PC_LSC *)pc->data; in PCApply_LSC() local
111 if (lsc->commute) { in PCApply_LSC()
112 PetscCall(KSPSolve(lsc->kspMass, x, lsc->Svec0)); in PCApply_LSC()
113 PetscCall(KSPCheckSolve(lsc->kspMass, pc, lsc->Svec0)); in PCApply_LSC()
114 PetscCall(MatMult(B, lsc->Svec0, lsc->Avec0)); in PCApply_LSC()
115 PetscCall(KSPSolve(lsc->kspL, lsc->Avec0, lsc->Avec1)); in PCApply_LSC()
116 PetscCall(KSPCheckSolve(lsc->kspL, pc, lsc->Avec1)); in PCApply_LSC()
117 PetscCall(MatMult(A, lsc->Avec1, lsc->Avec0)); in PCApply_LSC()
118 PetscCall(KSPSolve(lsc->kspL, lsc->Avec0, lsc->Avec1)); in PCApply_LSC()
119 PetscCall(KSPCheckSolve(lsc->kspL, pc, lsc->Avec1)); in PCApply_LSC()
120 PetscCall(MatMult(C, lsc->Avec1, lsc->Svec0)); in PCApply_LSC()
121 PetscCall(KSPSolve(lsc->kspMass, lsc->Svec0, y)); in PCApply_LSC()
122 PetscCall(KSPCheckSolve(lsc->kspMass, pc, y)); in PCApply_LSC()
124 PetscCall(KSPSolve(lsc->kspL, x, lsc->Svec0)); in PCApply_LSC()
125 PetscCall(KSPCheckSolve(lsc->kspL, pc, lsc->Svec0)); in PCApply_LSC()
126 PetscCall(MatMult(B, lsc->Svec0, lsc->Avec0)); in PCApply_LSC()
127 if (lsc->scale) PetscCall(VecPointwiseMult(lsc->Avec0, lsc->Avec0, lsc->scale)); in PCApply_LSC()
128 PetscCall(MatMult(A, lsc->Avec0, lsc->Avec1)); in PCApply_LSC()
129 if (lsc->scale) PetscCall(VecPointwiseMult(lsc->Avec1, lsc->Avec1, lsc->scale)); in PCApply_LSC()
130 PetscCall(MatMult(C, lsc->Avec1, lsc->Svec0)); in PCApply_LSC()
131 PetscCall(KSPSolve(lsc->kspL, lsc->Svec0, y)); in PCApply_LSC()
132 PetscCall(KSPCheckSolve(lsc->kspL, pc, y)); in PCApply_LSC()
139 PC_LSC *lsc = (PC_LSC *)pc->data; in PCReset_LSC() local
142 PetscCall(VecDestroy(&lsc->Avec0)); in PCReset_LSC()
143 PetscCall(VecDestroy(&lsc->Avec1)); in PCReset_LSC()
144 PetscCall(VecDestroy(&lsc->Svec0)); in PCReset_LSC()
145 PetscCall(KSPDestroy(&lsc->kspL)); in PCReset_LSC()
146 if (lsc->commute) PetscCall(KSPDestroy(&lsc->kspMass)); in PCReset_LSC()
147 if (lsc->L) PetscCall(MatDestroy(&lsc->L)); in PCReset_LSC()
148 if (lsc->scale) PetscCall(VecDestroy(&lsc->scale)); in PCReset_LSC()
162 PC_LSC *lsc = (PC_LSC *)pc->data; in PCSetFromOptions_LSC() local
167 …ommute the LSC preconditioner in the style of Olshanskii", "None", lsc->commute, &lsc->commute, NU… in PCSetFromOptions_LSC()
168 … diagonal of Qscale or A if the former is not provided.", "None", lsc->scalediag, &lsc->scalediag,… in PCSetFromOptions_LSC()
169 …PetscCheck(!lsc->scalediag || !lsc->commute, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "Di… in PCSetFromOptions_LSC()
262 PC_LSC *lsc; in PCCreate_LSC() local
265 PetscCall(PetscNew(&lsc)); in PCCreate_LSC()
266 pc->data = (void *)lsc; in PCCreate_LSC()