Lines Matching defs:red

23   PC_Redundant *red = (PC_Redundant *)pc->data;
26 if (red->ksp) {
28 PetscCall(KSPGetPC(red->ksp, &pc));
31 red->shifttypeset = PETSC_TRUE;
32 red->shifttype = shifttype;
39 PC_Redundant *red = (PC_Redundant *)pc->data;
47 if (!red->psubcomm) {
50 PetscCall(PetscViewerASCIIPrintf(viewer, " First (color=0) of %" PetscInt_FMT " PCs follows\n", red->nsubcomm));
51 PetscCall(PetscViewerGetSubViewer(viewer, ((PetscObject)red->pc)->comm, &subviewer));
52 if (!red->psubcomm->color) { /* only view first redundant pc */
54 PetscCall(KSPView(red->ksp, subviewer));
57 PetscCall(PetscViewerRestoreSubViewer(viewer, ((PetscObject)red->pc)->comm, &subviewer));
68 PC_Redundant *red = (PC_Redundant *)pc->data;
79 if (size == 1) red->useparallelmat = PETSC_FALSE;
83 if (!red->psubcomm) { /* create red->psubcomm, new ksp and pc over subcomm */
87 subcomm = PetscSubcommChild(red->psubcomm);
89 if (red->useparallelmat) {
91 PetscCall(MatCreateRedundantMatrix(pc->pmat, red->psubcomm->n, subcomm, MAT_INITIAL_MATRIX, &red->pmats));
96 PetscCall(PetscObjectTypeCompare((PetscObject)red->pmats, MATMPISBAIJ, &issbaij));
98 PetscCall(MatGetFactorAvailable(red->pmats, NULL, MAT_FACTOR_LU, &foundpack));
100 PetscCall(MatGetFactorAvailable(red->pmats, NULL, MAT_FACTOR_CHOLESKY, &foundpack));
103 PetscCall(KSPSetType(red->ksp, KSPGMRES));
104 PetscCall(PCSetType(red->pc, PCBJACOBI));
106 PetscCall(PCFactorSetMatSolverType(red->pc, NULL));
110 PetscCall(KSPSetOperators(red->ksp, red->pmats, red->pmats));
113 PetscCall(MatCreateVecs(red->pmats, &red->xsub, &red->ysub));
119 PetscCall(MatGetLocalSize(red->pmats, &mloc_sub, NULL));
120 PetscCall(VecCreateMPI(PetscSubcommContiguousParent(red->psubcomm), mloc_sub, PETSC_DECIDE, &red->xdup));
121 PetscCall(VecCreateMPIWithArray(PetscSubcommContiguousParent(red->psubcomm), 1, mloc_sub, PETSC_DECIDE, NULL, &red->ydup));
124 if (!red->scatterin) { /* efficiency of scatterin is independent from psubcomm_type! */
132 PetscCall(PetscMalloc2(red->psubcomm->n * mlocal, &idx1, red->psubcomm->n * mlocal, &idx2));
134 for (k = 0; k < red->psubcomm->n; k++) {
140 PetscCall(ISCreateGeneral(comm, red->psubcomm->n * mlocal, idx1, PETSC_COPY_VALUES, &is1));
141 PetscCall(ISCreateGeneral(comm, red->psubcomm->n * mlocal, idx2, PETSC_COPY_VALUES, &is2));
142 PetscCall(VecScatterCreate(x, is1, red->xdup, is2, &red->scatterin));
147 PetscCall(ISCreateStride(comm, mlocal, mstart + red->psubcomm->color * M, 1, &is1));
149 PetscCall(VecScatterCreate(red->xdup, is1, x, is2, &red->scatterout));
155 } else { /* !red->useparallelmat */
156 PetscCall(KSPSetOperators(red->ksp, pc->mat, pc->pmat));
159 if (red->useparallelmat) {
164 PetscCall(MatDestroy(&red->pmats));
169 PetscCall(MatCreateRedundantMatrix(pc->pmat, red->psubcomm->n, PetscSubcommChild(red->psubcomm), reuse, &red->pmats));
170 PetscCall(KSPSetOperators(red->ksp, red->pmats, red->pmats));
171 } else { /* !red->useparallelmat */
172 PetscCall(KSPSetOperators(red->ksp, pc->mat, pc->pmat));
176 if (pc->setfromoptionscalled) PetscCall(KSPSetFromOptions(red->ksp));
182 PC_Redundant *red = (PC_Redundant *)pc->data;
186 if (!red->useparallelmat) {
187 PetscCall(KSPSolve(red->ksp, x, y));
188 PetscCall(KSPCheckSolve(red->ksp, pc, y));
193 PetscCall(VecScatterBegin(red->scatterin, x, red->xdup, INSERT_VALUES, SCATTER_FORWARD));
194 PetscCall(VecScatterEnd(red->scatterin, x, red->xdup, INSERT_VALUES, SCATTER_FORWARD));
197 PetscCall(VecGetArray(red->xdup, &array));
198 PetscCall(VecPlaceArray(red->xsub, (const PetscScalar *)array));
201 PetscCall(KSPSolve(red->ksp, red->xsub, red->ysub));
202 PetscCall(KSPCheckSolve(red->ksp, pc, red->ysub));
203 PetscCall(VecResetArray(red->xsub));
204 PetscCall(VecRestoreArray(red->xdup, &array));
207 PetscCall(VecGetArray(red->ysub, &array));
208 PetscCall(VecPlaceArray(red->ydup, (const PetscScalar *)array));
211 PetscCall(VecScatterBegin(red->scatterout, red->ydup, y, INSERT_VALUES, SCATTER_FORWARD));
212 PetscCall(VecScatterEnd(red->scatterout, red->ydup, y, INSERT_VALUES, SCATTER_FORWARD));
213 PetscCall(VecResetArray(red->ydup));
214 PetscCall(VecRestoreArray(red->ysub, &array));
220 PC_Redundant *red = (PC_Redundant *)pc->data;
224 if (!red->useparallelmat) {
225 PetscCall(KSPSolveTranspose(red->ksp, x, y));
226 PetscCall(KSPCheckSolve(red->ksp, pc, y));
231 PetscCall(VecScatterBegin(red->scatterin, x, red->xdup, INSERT_VALUES, SCATTER_FORWARD));
232 PetscCall(VecScatterEnd(red->scatterin, x, red->xdup, INSERT_VALUES, SCATTER_FORWARD));
235 PetscCall(VecGetArray(red->xdup, &array));
236 PetscCall(VecPlaceArray(red->xsub, (const PetscScalar *)array));
239 PetscCall(KSPSolveTranspose(red->ksp, red->xsub, red->ysub));
240 PetscCall(KSPCheckSolve(red->ksp, pc, red->ysub));
241 PetscCall(VecResetArray(red->xsub));
242 PetscCall(VecRestoreArray(red->xdup, &array));
245 PetscCall(VecGetArray(red->ysub, &array));
246 PetscCall(VecPlaceArray(red->ydup, (const PetscScalar *)array));
249 PetscCall(VecScatterBegin(red->scatterout, red->ydup, y, INSERT_VALUES, SCATTER_FORWARD));
250 PetscCall(VecScatterEnd(red->scatterout, red->ydup, y, INSERT_VALUES, SCATTER_FORWARD));
251 PetscCall(VecResetArray(red->ydup));
252 PetscCall(VecRestoreArray(red->ysub, &array));
258 PC_Redundant *red = (PC_Redundant *)pc->data;
261 if (red->useparallelmat) {
262 PetscCall(VecScatterDestroy(&red->scatterin));
263 PetscCall(VecScatterDestroy(&red->scatterout));
264 PetscCall(VecDestroy(&red->ysub));
265 PetscCall(VecDestroy(&red->xsub));
266 PetscCall(VecDestroy(&red->xdup));
267 PetscCall(VecDestroy(&red->ydup));
269 PetscCall(MatDestroy(&red->pmats));
270 PetscCall(KSPReset(red->ksp));
276 PC_Redundant *red = (PC_Redundant *)pc->data;
280 PetscCall(KSPDestroy(&red->ksp));
281 PetscCall(PetscSubcommDestroy(&red->psubcomm));
293 PC_Redundant *red = (PC_Redundant *)pc->data;
297 PetscCall(PetscOptionsInt("-pc_redundant_number", "Number of redundant pc", "PCRedundantSetNumber", red->nsubcomm, &red->nsubcomm, NULL));
304 PC_Redundant *red = (PC_Redundant *)pc->data;
307 red->nsubcomm = nreds;
336 PC_Redundant *red = (PC_Redundant *)pc->data;
340 PetscCall(VecScatterDestroy(&red->scatterin));
342 red->scatterin = in;
345 PetscCall(VecScatterDestroy(&red->scatterout));
346 red->scatterout = out;
378 PC_Redundant *red = (PC_Redundant *)pc->data;
384 if (!red->psubcomm) {
388 PetscCall(PetscSubcommCreate(comm, &red->psubcomm));
389 PetscCall(PetscSubcommSetNumber(red->psubcomm, red->nsubcomm));
390 PetscCall(PetscSubcommSetType(red->psubcomm, PETSC_SUBCOMM_CONTIGUOUS));
392 PetscCall(PetscSubcommSetOptionsPrefix(red->psubcomm, prefix));
393 PetscCall(PetscSubcommSetFromOptions(red->psubcomm));
396 subcomm = PetscSubcommChild(red->psubcomm);
398 PetscCall(KSPCreate(subcomm, &red->ksp));
399 PetscCall(KSPSetNestLevel(red->ksp, pc->kspnestlevel));
400 PetscCall(KSPSetErrorIfNotConverged(red->ksp, pc->erroriffailure));
401 PetscCall(PetscObjectIncrementTabLevel((PetscObject)red->ksp, (PetscObject)pc, 1));
402 PetscCall(KSPSetType(red->ksp, KSPPREONLY));
403 PetscCall(KSPGetPC(red->ksp, &red->pc));
407 PetscCall(PCSetType(red->pc, PCLU));
409 PetscCall(PCSetType(red->pc, PCCHOLESKY));
411 if (red->shifttypeset) {
412 PetscCall(PCFactorSetShiftType(red->pc, red->shifttype));
413 red->shifttypeset = PETSC_FALSE;
415 PetscCall(KSPSetOptionsPrefix(red->ksp, prefix));
416 PetscCall(KSPAppendOptionsPrefix(red->ksp, "redundant_"));
418 *innerksp = red->ksp;
448 PC_Redundant *red = (PC_Redundant *)pc->data;
451 if (mat) *mat = red->pmats;
452 if (pmat) *pmat = red->pmats;
507 PC_Redundant *red;
511 PetscCall(PetscNew(&red));
514 red->nsubcomm = size;
515 red->useparallelmat = PETSC_TRUE;
516 pc->data = (void *)red;