Lines Matching refs:shell

15   Mat_Shell *shell = (Mat_Shell *)A->data;  in MatShellPreZeroRight()  local
19 if (shell->zrows) { in MatShellPreZeroRight()
20 PetscCall(VecSet(shell->zvals_w, 0.0)); in MatShellPreZeroRight()
21 … PetscCall(VecScatterBegin(shell->zvals_sct_c, x, shell->zvals_w, INSERT_VALUES, SCATTER_FORWARD)); in MatShellPreZeroRight()
22 PetscCall(VecScatterEnd(shell->zvals_sct_c, x, shell->zvals_w, INSERT_VALUES, SCATTER_FORWARD)); in MatShellPreZeroRight()
23 PetscCall(VecPointwiseMult(shell->zvals_w, shell->zvals_w, shell->zvals)); in MatShellPreZeroRight()
25 if (shell->zcols) { in MatShellPreZeroRight()
26 if (!shell->right_work) PetscCall(MatCreateVecs(A, &shell->right_work, NULL)); in MatShellPreZeroRight()
27 PetscCall(VecCopy(x, shell->right_work)); in MatShellPreZeroRight()
28 PetscCall(VecISSet(shell->right_work, shell->zcols, 0.0)); in MatShellPreZeroRight()
29 *xx = shell->right_work; in MatShellPreZeroRight()
37 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellPostZeroLeft() local
40 if (shell->zrows) { in MatShellPostZeroLeft()
41 … PetscCall(VecScatterBegin(shell->zvals_sct_r, shell->zvals_w, x, INSERT_VALUES, SCATTER_REVERSE)); in MatShellPostZeroLeft()
42 PetscCall(VecScatterEnd(shell->zvals_sct_r, shell->zvals_w, x, INSERT_VALUES, SCATTER_REVERSE)); in MatShellPostZeroLeft()
53 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellPreZeroLeft() local
57 if (!shell->zrows) { in MatShellPreZeroLeft()
60 if (!shell->left_work) PetscCall(MatCreateVecs(A, NULL, &shell->left_work)); in MatShellPreZeroLeft()
61 PetscCall(VecCopy(x, shell->left_work)); in MatShellPreZeroLeft()
62 PetscCall(VecSet(shell->zvals_w, 0.0)); in MatShellPreZeroLeft()
63 …PetscCall(VecScatterBegin(shell->zvals_sct_r, shell->zvals_w, shell->left_work, INSERT_VALUES, SCA… in MatShellPreZeroLeft()
64 …PetscCall(VecScatterEnd(shell->zvals_sct_r, shell->zvals_w, shell->left_work, INSERT_VALUES, SCATT… in MatShellPreZeroLeft()
65 … PetscCall(VecScatterBegin(shell->zvals_sct_r, x, shell->zvals_w, INSERT_VALUES, SCATTER_FORWARD)); in MatShellPreZeroLeft()
66 PetscCall(VecScatterEnd(shell->zvals_sct_r, x, shell->zvals_w, INSERT_VALUES, SCATTER_FORWARD)); in MatShellPreZeroLeft()
67 PetscCall(VecPointwiseMult(shell->zvals_w, shell->zvals_w, shell->zvals)); in MatShellPreZeroLeft()
68 *xx = shell->left_work; in MatShellPreZeroLeft()
76 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellPostZeroRight() local
79 if (shell->zcols) PetscCall(VecISSet(x, shell->zcols, 0.0)); in MatShellPostZeroRight()
80 if (shell->zrows) { in MatShellPostZeroRight()
81 PetscCall(VecScatterBegin(shell->zvals_sct_c, shell->zvals_w, x, ADD_VALUES, SCATTER_REVERSE)); in MatShellPostZeroRight()
82 PetscCall(VecScatterEnd(shell->zvals_sct_c, shell->zvals_w, x, ADD_VALUES, SCATTER_REVERSE)); in MatShellPostZeroRight()
92 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellPreScaleLeft() local
96 if (!shell->left) { in MatShellPreScaleLeft()
99 if (!shell->left_work) PetscCall(VecDuplicate(shell->left, &shell->left_work)); in MatShellPreScaleLeft()
105 PetscCall(VecGetArrayRead(shell->left, &d)); in MatShellPreScaleLeft()
107 PetscCall(VecGetArrayWrite(shell->left_work, &w)); in MatShellPreScaleLeft()
109 PetscCall(VecRestoreArrayRead(shell->dshift, &d)); in MatShellPreScaleLeft()
111 PetscCall(VecRestoreArrayWrite(shell->left_work, &w)); in MatShellPreScaleLeft()
112 } else PetscCall(VecPointwiseMult(shell->left_work, x, shell->left)); in MatShellPreScaleLeft()
113 *xx = shell->left_work; in MatShellPreScaleLeft()
123 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellPreScaleRight() local
127 if (!shell->right) { in MatShellPreScaleRight()
130 if (!shell->right_work) PetscCall(VecDuplicate(shell->right, &shell->right_work)); in MatShellPreScaleRight()
131 PetscCall(VecPointwiseMult(shell->right_work, x, shell->right)); in MatShellPreScaleRight()
132 *xx = shell->right_work; in MatShellPreScaleRight()
142 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellPostScaleLeft() local
145 if (shell->left) PetscCall(VecPointwiseMult(x, x, shell->left)); in MatShellPostScaleLeft()
154 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellPostScaleRight() local
157 if (shell->right) { in MatShellPostScaleRight()
163 PetscCall(VecGetArrayRead(shell->right, &d)); in MatShellPostScaleRight()
166 PetscCall(VecRestoreArrayRead(shell->dshift, &d)); in MatShellPostScaleRight()
168 } else PetscCall(VecPointwiseMult(x, x, shell->right)); in MatShellPostScaleRight()
182 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellShiftAndScale() local
183 PetscScalar vscale = conjugate ? PetscConj(shell->vscale) : shell->vscale; in MatShellShiftAndScale()
184 PetscScalar vshift = conjugate ? PetscConj(shell->vshift) : shell->vshift; in MatShellShiftAndScale()
187 if (shell->dshift) { /* get arrays because there is no VecPointwiseMultAdd() */ in MatShellShiftAndScale()
192 PetscCall(VecGetArrayRead(shell->dshift, &d)); in MatShellShiftAndScale()
199 PetscCall(VecRestoreArrayRead(shell->dshift, &d)); in MatShellShiftAndScale()
211 Mat_Shell *shell = (Mat_Shell *)mat->data; in MatShellGetContext_Shell() local
214 if (shell->ctxcontainer) PetscCall(PetscContainerGetPointer(shell->ctxcontainer, ctx)); in MatShellGetContext_Shell()
251 Mat_Shell *shell = (Mat_Shell *)mat->data; in MatZeroRowsColumns_Local_Shell() local
259 if (!shell->zvals) PetscCall(MatCreateVecs(mat, NULL, &shell->zvals)); in MatZeroRowsColumns_Local_Shell()
260 if (!shell->zvals_w) PetscCall(VecDuplicate(shell->zvals, &shell->zvals_w)); in MatZeroRowsColumns_Local_Shell()
269 PetscCall(VecISSet(shell->zvals, is1, diag)); in MatZeroRowsColumns_Local_Shell()
270 if (shell->zrows) { in MatZeroRowsColumns_Local_Shell()
271 PetscCall(ISSum(shell->zrows, is1, &is2)); in MatZeroRowsColumns_Local_Shell()
272 PetscCall(ISDestroy(&shell->zrows)); in MatZeroRowsColumns_Local_Shell()
274 shell->zrows = is2; in MatZeroRowsColumns_Local_Shell()
275 } else shell->zrows = is1; in MatZeroRowsColumns_Local_Shell()
278 PetscCall(VecScatterDestroy(&shell->zvals_sct_c)); in MatZeroRowsColumns_Local_Shell()
279 PetscCall(VecScatterDestroy(&shell->zvals_sct_r)); in MatZeroRowsColumns_Local_Shell()
283 PetscCall(VecScatterCreate(b, shell->zrows, shell->zvals_w, shell->zrows, &shell->zvals_sct_r)); in MatZeroRowsColumns_Local_Shell()
286 PetscCall(ISGetIndices(shell->zrows, &ridxs)); in MatZeroRowsColumns_Local_Shell()
287 PetscCall(ISGetLocalSize(shell->zrows, &nr)); in MatZeroRowsColumns_Local_Shell()
295 PetscCall(VecScatterCreate(x, is1, shell->zvals_w, is1, &shell->zvals_sct_c)); in MatZeroRowsColumns_Local_Shell()
306 if (shell->zcols) { in MatZeroRowsColumns_Local_Shell()
307 PetscCall(ISSum(shell->zcols, is1, &is2)); in MatZeroRowsColumns_Local_Shell()
308 PetscCall(ISDestroy(&shell->zcols)); in MatZeroRowsColumns_Local_Shell()
310 shell->zcols = is2; in MatZeroRowsColumns_Local_Shell()
311 } else shell->zcols = is1; in MatZeroRowsColumns_Local_Shell()
318 Mat_Shell *shell = (Mat_Shell *)mat->data; in MatZeroRows_Shell() local
357 if (shell->axpy) PetscCall(MatZeroRows(shell->axpy, n, rows, 0.0, NULL, NULL)); in MatZeroRows_Shell()
364 Mat_Shell *shell = (Mat_Shell *)mat->data; in MatZeroRowsColumns_Shell() local
431 if (shell->axpy) PetscCall(MatZeroRowsColumns(shell->axpy, n, rowscols, 0.0, NULL, NULL)); in MatZeroRowsColumns_Shell()
437 Mat_Shell *shell = (Mat_Shell *)mat->data; in MatDestroy_Shell() local
441 if (shell->ops->destroy) PetscCall((*shell->ops->destroy)(mat)); in MatDestroy_Shell()
442 PetscCall(PetscMemzero(shell->ops, sizeof(struct _MatShellOps))); in MatDestroy_Shell()
443 PetscCall(VecDestroy(&shell->left)); in MatDestroy_Shell()
444 PetscCall(VecDestroy(&shell->right)); in MatDestroy_Shell()
445 PetscCall(VecDestroy(&shell->dshift)); in MatDestroy_Shell()
446 PetscCall(VecDestroy(&shell->left_work)); in MatDestroy_Shell()
447 PetscCall(VecDestroy(&shell->right_work)); in MatDestroy_Shell()
448 PetscCall(VecDestroy(&shell->left_add_work)); in MatDestroy_Shell()
449 PetscCall(VecDestroy(&shell->right_add_work)); in MatDestroy_Shell()
450 PetscCall(VecDestroy(&shell->axpy_left)); in MatDestroy_Shell()
451 PetscCall(VecDestroy(&shell->axpy_right)); in MatDestroy_Shell()
452 PetscCall(MatDestroy(&shell->axpy)); in MatDestroy_Shell()
453 PetscCall(VecDestroy(&shell->zvals_w)); in MatDestroy_Shell()
454 PetscCall(VecDestroy(&shell->zvals)); in MatDestroy_Shell()
455 PetscCall(VecScatterDestroy(&shell->zvals_sct_c)); in MatDestroy_Shell()
456 PetscCall(VecScatterDestroy(&shell->zvals_sct_r)); in MatDestroy_Shell()
457 PetscCall(ISDestroy(&shell->zrows)); in MatDestroy_Shell()
458 PetscCall(ISDestroy(&shell->zcols)); in MatDestroy_Shell()
460 matmat = shell->matmat; in MatDestroy_Shell()
511 Mat_Shell *shell; in MatProductNumeric_Shell_X() local
523 shell = (Mat_Shell *)A->data; in MatProductNumeric_Shell_X()
526 if (shell->managescalingshifts) { in MatProductNumeric_Shell_X()
527 …PetscCheck(!shell->zcols && !shell->zrows, PetscObjectComm((PetscObject)D), PETSC_ERR_SUP, "MatPro… in MatProductNumeric_Shell_X()
528 if (shell->right || shell->left) { in MatProductNumeric_Shell_X()
539 if (shell->right) PetscCall(MatDiagonalScale(mdata->B, shell->right, NULL)); in MatProductNumeric_Shell_X()
542 if (shell->left) PetscCall(MatDiagonalScale(mdata->B, shell->left, NULL)); in MatProductNumeric_Shell_X()
545 if (shell->right) PetscCall(MatDiagonalScale(mdata->B, NULL, shell->right)); in MatProductNumeric_Shell_X()
548 if (shell->right && shell->left) { in MatProductNumeric_Shell_X()
551 PetscCall(VecEqual(shell->right, shell->left, &flg)); in MatProductNumeric_Shell_X()
555 if (shell->right) PetscCall(MatDiagonalScale(mdata->B, NULL, shell->right)); in MatProductNumeric_Shell_X()
558 if (shell->right && shell->left) { in MatProductNumeric_Shell_X()
561 PetscCall(VecEqual(shell->right, shell->left, &flg)); in MatProductNumeric_Shell_X()
565 if (shell->right) PetscCall(MatDiagonalScale(mdata->B, shell->right, NULL)); in MatProductNumeric_Shell_X()
584 if (shell->managescalingshifts) { in MatProductNumeric_Shell_X()
585 PetscCall(MatScale(D, shell->vscale)); in MatProductNumeric_Shell_X()
589 if (shell->left) { in MatProductNumeric_Shell_X()
590 PetscCall(MatDiagonalScale(D, shell->left, NULL)); in MatProductNumeric_Shell_X()
591 if (shell->dshift || shell->vshift != 0.0) { in MatProductNumeric_Shell_X()
592 if (!shell->left_work) PetscCall(MatCreateVecs(A, NULL, &shell->left_work)); in MatProductNumeric_Shell_X()
593 if (shell->dshift) { in MatProductNumeric_Shell_X()
594 PetscCall(VecCopy(shell->dshift, shell->left_work)); in MatProductNumeric_Shell_X()
595 PetscCall(VecShift(shell->left_work, shell->vshift)); in MatProductNumeric_Shell_X()
596 PetscCall(VecPointwiseMult(shell->left_work, shell->left_work, shell->left)); in MatProductNumeric_Shell_X()
598 PetscCall(VecSet(shell->left_work, shell->vshift)); in MatProductNumeric_Shell_X()
605 PetscCall(MatDiagonalScale(mdata->Bt, shell->left_work, NULL)); in MatProductNumeric_Shell_X()
610 PetscCall(MatDiagonalScale(mdata->B, shell->left_work, NULL)); in MatProductNumeric_Shell_X()
617 if (shell->right) { in MatProductNumeric_Shell_X()
618 PetscCall(MatDiagonalScale(D, shell->right, NULL)); in MatProductNumeric_Shell_X()
619 if (shell->dshift || shell->vshift != 0.0) { in MatProductNumeric_Shell_X()
622 if (!shell->right_work) PetscCall(MatCreateVecs(A, &shell->right_work, NULL)); in MatProductNumeric_Shell_X()
623 if (shell->dshift) { in MatProductNumeric_Shell_X()
624 PetscCall(VecCopy(shell->dshift, shell->right_work)); in MatProductNumeric_Shell_X()
625 PetscCall(VecShift(shell->right_work, shell->vshift)); in MatProductNumeric_Shell_X()
626 PetscCall(VecPointwiseMult(shell->right_work, shell->right_work, shell->right)); in MatProductNumeric_Shell_X()
628 PetscCall(VecSet(shell->right_work, shell->vshift)); in MatProductNumeric_Shell_X()
630 PetscCall(MatDiagonalScale(mdata->B, shell->right_work, NULL)); in MatProductNumeric_Shell_X()
637 …PetscCheck(!shell->dshift && shell->vshift == 0.0, PetscObjectComm((PetscObject)D), PETSC_ERR_SUP,… in MatProductNumeric_Shell_X()
643 if (shell->axpy && shell->axpy_vscale != 0.0) { in MatProductNumeric_Shell_X()
648 PetscCall(MatShellGetContext(shell->axpy, &X)); in MatProductNumeric_Shell_X()
650 …PetscCheck(shell->axpy_state == axpy_state, PetscObjectComm((PetscObject)A), PETSC_ERR_ORDER, "Inv… in MatProductNumeric_Shell_X()
653 PetscCall(MatProductCreate(shell->axpy, B, NULL, &mdata->axpy)); in MatProductNumeric_Shell_X()
660 PetscCall(MatProductReplaceMats(shell->axpy, B, NULL, mdata->axpy)); in MatProductNumeric_Shell_X()
669 PetscCall(MatAXPY(D, shell->axpy_vscale, mdata->axpy, str)); in MatProductNumeric_Shell_X()
680 Mat_Shell *shell; in MatProductSymbolic_Shell_X() local
691 shell = (Mat_Shell *)A->data; in MatProductSymbolic_Shell_X()
692 matmat = shell->matmat; in MatProductSymbolic_Shell_X()
752 Mat_Shell *shell; in MatProductSetFromOptions_Shell_X() local
763 shell = (Mat_Shell *)A->data; in MatProductSetFromOptions_Shell_X()
764 matmat = shell->matmat; in MatProductSetFromOptions_Shell_X()
781 Mat_Shell *shell; in MatShellSetMatProductOperation_Private() local
789 shell = (Mat_Shell *)A->data; in MatShellSetMatProductOperation_Private()
790 matmat = shell->matmat; in MatShellSetMatProductOperation_Private()
792 PetscCall(PetscNew(&shell->matmat)); in MatShellSetMatProductOperation_Private()
793 matmat = shell->matmat; in MatShellSetMatProductOperation_Private()
987 Mat_Shell *shell = (Mat_Shell *)A->data; in MatMult_Shell() local
995 PetscCall((*shell->ops->mult)(A, xx, y)); in MatMult_Shell()
1005 if (shell->axpy) { in MatMult_Shell()
1009 PetscCall(MatShellGetContext(shell->axpy, &X)); in MatMult_Shell()
1011 …PetscCheck(shell->axpy_state == axpy_state, PetscObjectComm((PetscObject)A), PETSC_ERR_ORDER, "Inv… in MatMult_Shell()
1013 …PetscCall(MatCreateVecs(shell->axpy, shell->axpy_right ? NULL : &shell->axpy_right, shell->axpy_le… in MatMult_Shell()
1014 PetscCall(VecCopy(x, shell->axpy_right)); in MatMult_Shell()
1015 PetscCall(MatMult(shell->axpy, shell->axpy_right, shell->axpy_left)); in MatMult_Shell()
1016 PetscCall(VecAXPY(y, shell->axpy_vscale, shell->axpy_left)); in MatMult_Shell()
1023 Mat_Shell *shell = (Mat_Shell *)A->data; in MatMultAdd_Shell() local
1027 if (!shell->right_add_work) PetscCall(VecDuplicate(z, &shell->right_add_work)); in MatMultAdd_Shell()
1028 PetscCall(MatMult(A, x, shell->right_add_work)); in MatMultAdd_Shell()
1029 PetscCall(VecAXPY(z, 1.0, shell->right_add_work)); in MatMultAdd_Shell()
1039 Mat_Shell *shell = (Mat_Shell *)A->data; in MatMultTranspose_Shell() local
1047 PetscCall((*shell->ops->multtranspose)(A, xx, y)); in MatMultTranspose_Shell()
1057 if (shell->axpy) { in MatMultTranspose_Shell()
1061 PetscCall(MatShellGetContext(shell->axpy, &X)); in MatMultTranspose_Shell()
1063 …PetscCheck(shell->axpy_state == axpy_state, PetscObjectComm((PetscObject)A), PETSC_ERR_ORDER, "Inv… in MatMultTranspose_Shell()
1064 …PetscCall(MatCreateVecs(shell->axpy, shell->axpy_right ? NULL : &shell->axpy_right, shell->axpy_le… in MatMultTranspose_Shell()
1065 PetscCall(VecCopy(x, shell->axpy_left)); in MatMultTranspose_Shell()
1066 PetscCall(MatMultTranspose(shell->axpy, shell->axpy_left, shell->axpy_right)); in MatMultTranspose_Shell()
1067 PetscCall(VecAXPY(y, shell->axpy_vscale, shell->axpy_right)); in MatMultTranspose_Shell()
1074 Mat_Shell *shell = (Mat_Shell *)A->data; in MatMultHermitianTranspose_Shell() local
1082 PetscCall((*shell->ops->multhermitiantranspose)(A, xx, y)); in MatMultHermitianTranspose_Shell()
1092 if (shell->axpy) { in MatMultHermitianTranspose_Shell()
1096 PetscCall(MatShellGetContext(shell->axpy, &X)); in MatMultHermitianTranspose_Shell()
1098 …PetscCheck(shell->axpy_state == axpy_state, PetscObjectComm((PetscObject)A), PETSC_ERR_ORDER, "Inv… in MatMultHermitianTranspose_Shell()
1099 …PetscCall(MatCreateVecs(shell->axpy, shell->axpy_right ? NULL : &shell->axpy_right, shell->axpy_le… in MatMultHermitianTranspose_Shell()
1100 PetscCall(VecCopy(x, shell->axpy_left)); in MatMultHermitianTranspose_Shell()
1101 PetscCall(MatMultHermitianTranspose(shell->axpy, shell->axpy_left, shell->axpy_right)); in MatMultHermitianTranspose_Shell()
1102 PetscCall(VecAXPY(y, PetscConj(shell->axpy_vscale), shell->axpy_right)); in MatMultHermitianTranspose_Shell()
1109 Mat_Shell *shell = (Mat_Shell *)A->data; in MatMultTransposeAdd_Shell() local
1113 if (!shell->left_add_work) PetscCall(VecDuplicate(z, &shell->left_add_work)); in MatMultTransposeAdd_Shell()
1114 PetscCall(MatMultTranspose(A, x, shell->left_add_work)); in MatMultTransposeAdd_Shell()
1115 PetscCall(VecAXPY(z, 1.0, shell->left_add_work)); in MatMultTransposeAdd_Shell()
1125 Mat_Shell *shell = (Mat_Shell *)A->data; in MatMultHermitianTransposeAdd_Shell() local
1129 if (!shell->left_add_work) PetscCall(VecDuplicate(z, &shell->left_add_work)); in MatMultHermitianTransposeAdd_Shell()
1130 PetscCall(MatMultHermitianTranspose(A, x, shell->left_add_work)); in MatMultHermitianTransposeAdd_Shell()
1131 PetscCall(VecAXPY(z, 1.0, shell->left_add_work)); in MatMultHermitianTransposeAdd_Shell()
1144 Mat_Shell *shell = (Mat_Shell *)A->data; in MatGetDiagonal_Shell() local
1147 …PetscCheck(shell->ops->getdiagonal, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "Mu… in MatGetDiagonal_Shell()
1148 PetscCall((*shell->ops->getdiagonal)(A, v)); in MatGetDiagonal_Shell()
1149 PetscCall(VecScale(v, shell->vscale)); in MatGetDiagonal_Shell()
1150 if (shell->dshift) PetscCall(VecAXPY(v, 1.0, shell->dshift)); in MatGetDiagonal_Shell()
1151 PetscCall(VecShift(v, shell->vshift)); in MatGetDiagonal_Shell()
1152 if (shell->left) PetscCall(VecPointwiseMult(v, v, shell->left)); in MatGetDiagonal_Shell()
1153 if (shell->right) PetscCall(VecPointwiseMult(v, v, shell->right)); in MatGetDiagonal_Shell()
1154 if (shell->zrows) { in MatGetDiagonal_Shell()
1155 PetscCall(VecScatterBegin(shell->zvals_sct_r, shell->zvals, v, INSERT_VALUES, SCATTER_REVERSE)); in MatGetDiagonal_Shell()
1156 PetscCall(VecScatterEnd(shell->zvals_sct_r, shell->zvals, v, INSERT_VALUES, SCATTER_REVERSE)); in MatGetDiagonal_Shell()
1158 if (shell->axpy) { in MatGetDiagonal_Shell()
1162 PetscCall(MatShellGetContext(shell->axpy, &X)); in MatGetDiagonal_Shell()
1164 …PetscCheck(shell->axpy_state == axpy_state, PetscObjectComm((PetscObject)A), PETSC_ERR_ORDER, "Inv… in MatGetDiagonal_Shell()
1165 PetscCall(MatCreateVecs(shell->axpy, NULL, shell->axpy_left ? NULL : &shell->axpy_left)); in MatGetDiagonal_Shell()
1166 PetscCall(MatGetDiagonal(shell->axpy, shell->axpy_left)); in MatGetDiagonal_Shell()
1167 PetscCall(VecAXPY(v, shell->axpy_vscale, shell->axpy_left)); in MatGetDiagonal_Shell()
1174 Mat_Shell *shell = (Mat_Shell *)A->data; in MatGetDiagonalBlock_Shell() local
1178 …PetscCheck(!shell->zrows && !shell->zcols, PetscObjectComm((PetscObject)A), PETSC_ERR_SUP, "Cannot… in MatGetDiagonalBlock_Shell()
1179 …PetscCheck(!shell->axpy, PetscObjectComm((PetscObject)A), PETSC_ERR_SUP, "Cannot call MatGetDiagon… in MatGetDiagonalBlock_Shell()
1180 …PetscCheck(!shell->dshift, PetscObjectComm((PetscObject)A), PETSC_ERR_SUP, "Cannot call MatGetDiag… in MatGetDiagonalBlock_Shell()
1181 …PetscCheck(shell->ops->getdiagonalblock, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE… in MatGetDiagonalBlock_Shell()
1182 PetscCall((*shell->ops->getdiagonalblock)(A, b)); in MatGetDiagonalBlock_Shell()
1183 PetscCall(MatScale(*b, shell->vscale)); in MatGetDiagonalBlock_Shell()
1184 PetscCall(MatShift(*b, shell->vshift)); in MatGetDiagonalBlock_Shell()
1185 if (shell->left) { in MatGetDiagonalBlock_Shell()
1186 PetscCall(VecCreateLocalVector(shell->left, &left)); in MatGetDiagonalBlock_Shell()
1187 PetscCall(VecGetLocalVectorRead(shell->left, left)); in MatGetDiagonalBlock_Shell()
1189 if (shell->right) { in MatGetDiagonalBlock_Shell()
1190 PetscCall(VecCreateLocalVector(shell->right, &right)); in MatGetDiagonalBlock_Shell()
1191 PetscCall(VecGetLocalVectorRead(shell->right, right)); in MatGetDiagonalBlock_Shell()
1194 if (shell->left) { in MatGetDiagonalBlock_Shell()
1195 PetscCall(VecRestoreLocalVectorRead(shell->left, left)); in MatGetDiagonalBlock_Shell()
1198 if (shell->right) { in MatGetDiagonalBlock_Shell()
1199 PetscCall(VecRestoreLocalVectorRead(shell->right, right)); in MatGetDiagonalBlock_Shell()
1207 Mat_Shell *shell = (Mat_Shell *)Y->data; in MatShift_Shell() local
1213 if (shell->left || shell->right) { in MatShift_Shell()
1214 if (!shell->dshift) { in MatShift_Shell()
1215 PetscCall(VecDuplicate(shell->left ? shell->left : shell->right, &shell->dshift)); in MatShift_Shell()
1216 PetscCall(VecSet(shell->dshift, a)); in MatShift_Shell()
1218 if (shell->left) PetscCall(VecPointwiseMult(shell->dshift, shell->dshift, shell->left)); in MatShift_Shell()
1219 if (shell->right) PetscCall(VecPointwiseMult(shell->dshift, shell->dshift, shell->right)); in MatShift_Shell()
1220 PetscCall(VecShift(shell->dshift, a)); in MatShift_Shell()
1222 if (shell->left) PetscCall(VecPointwiseDivide(shell->dshift, shell->dshift, shell->left)); in MatShift_Shell()
1223 if (shell->right) PetscCall(VecPointwiseDivide(shell->dshift, shell->dshift, shell->right)); in MatShift_Shell()
1224 } else shell->vshift += a; in MatShift_Shell()
1225 if (shell->zrows) PetscCall(VecShift(shell->zvals, a)); in MatShift_Shell()
1231 Mat_Shell *shell = (Mat_Shell *)A->data; in MatDiagonalSet_Shell_Private() local
1234 if (!shell->dshift) PetscCall(VecDuplicate(D, &shell->dshift)); in MatDiagonalSet_Shell_Private()
1235 if (shell->left || shell->right) { in MatDiagonalSet_Shell_Private()
1236 …if (!shell->right_work) PetscCall(VecDuplicate(shell->left ? shell->left : shell->right, &shell->r… in MatDiagonalSet_Shell_Private()
1237 if (shell->left && shell->right) { in MatDiagonalSet_Shell_Private()
1238 PetscCall(VecPointwiseDivide(shell->right_work, D, shell->left)); in MatDiagonalSet_Shell_Private()
1239 PetscCall(VecPointwiseDivide(shell->right_work, shell->right_work, shell->right)); in MatDiagonalSet_Shell_Private()
1240 } else if (shell->left) { in MatDiagonalSet_Shell_Private()
1241 PetscCall(VecPointwiseDivide(shell->right_work, D, shell->left)); in MatDiagonalSet_Shell_Private()
1243 PetscCall(VecPointwiseDivide(shell->right_work, D, shell->right)); in MatDiagonalSet_Shell_Private()
1245 PetscCall(VecAXPY(shell->dshift, s, shell->right_work)); in MatDiagonalSet_Shell_Private()
1247 PetscCall(VecAXPY(shell->dshift, s, D)); in MatDiagonalSet_Shell_Private()
1254 Mat_Shell *shell = (Mat_Shell *)A->data; in MatDiagonalSet_Shell() local
1267 if (shell->zrows) PetscCall(VecCopy(D, shell->zvals)); in MatDiagonalSet_Shell()
1270 if (shell->zrows) PetscCall(VecAXPY(shell->zvals, 1.0, D)); in MatDiagonalSet_Shell()
1277 Mat_Shell *shell = (Mat_Shell *)Y->data; in MatScale_Shell() local
1280 shell->vscale *= a; in MatScale_Shell()
1281 shell->vshift *= a; in MatScale_Shell()
1282 if (shell->dshift) PetscCall(VecScale(shell->dshift, a)); in MatScale_Shell()
1283 shell->axpy_vscale *= a; in MatScale_Shell()
1284 if (shell->zrows) PetscCall(VecScale(shell->zvals, a)); in MatScale_Shell()
1290 Mat_Shell *shell = (Mat_Shell *)Y->data; in MatDiagonalScale_Shell() local
1294 if (!shell->left) { in MatDiagonalScale_Shell()
1295 PetscCall(VecDuplicate(left, &shell->left)); in MatDiagonalScale_Shell()
1296 PetscCall(VecCopy(left, shell->left)); in MatDiagonalScale_Shell()
1298 PetscCall(VecPointwiseMult(shell->left, shell->left, left)); in MatDiagonalScale_Shell()
1300 if (shell->zrows) PetscCall(VecPointwiseMult(shell->zvals, shell->zvals, left)); in MatDiagonalScale_Shell()
1303 if (!shell->right) { in MatDiagonalScale_Shell()
1304 PetscCall(VecDuplicate(right, &shell->right)); in MatDiagonalScale_Shell()
1305 PetscCall(VecCopy(right, shell->right)); in MatDiagonalScale_Shell()
1307 PetscCall(VecPointwiseMult(shell->right, shell->right, right)); in MatDiagonalScale_Shell()
1309 if (shell->zrows) { in MatDiagonalScale_Shell()
1310 if (!shell->left_work) PetscCall(MatCreateVecs(Y, NULL, &shell->left_work)); in MatDiagonalScale_Shell()
1311 PetscCall(VecSet(shell->zvals_w, 1.0)); in MatDiagonalScale_Shell()
1312 …PetscCall(VecScatterBegin(shell->zvals_sct_c, right, shell->zvals_w, INSERT_VALUES, SCATTER_FORWAR… in MatDiagonalScale_Shell()
1313 …PetscCall(VecScatterEnd(shell->zvals_sct_c, right, shell->zvals_w, INSERT_VALUES, SCATTER_FORWARD)… in MatDiagonalScale_Shell()
1314 PetscCall(VecPointwiseMult(shell->zvals, shell->zvals, shell->zvals_w)); in MatDiagonalScale_Shell()
1317 if (shell->axpy) PetscCall(MatDiagonalScale(shell->axpy, left, right)); in MatDiagonalScale_Shell()
1323 Mat_Shell *shell = (Mat_Shell *)Y->data; in MatAssemblyEnd_Shell() local
1327 shell->vshift = 0.0; in MatAssemblyEnd_Shell()
1328 shell->vscale = 1.0; in MatAssemblyEnd_Shell()
1329 shell->axpy_vscale = 0.0; in MatAssemblyEnd_Shell()
1330 shell->axpy_state = 0; in MatAssemblyEnd_Shell()
1331 PetscCall(VecDestroy(&shell->dshift)); in MatAssemblyEnd_Shell()
1332 PetscCall(VecDestroy(&shell->left)); in MatAssemblyEnd_Shell()
1333 PetscCall(VecDestroy(&shell->right)); in MatAssemblyEnd_Shell()
1334 PetscCall(MatDestroy(&shell->axpy)); in MatAssemblyEnd_Shell()
1335 PetscCall(VecDestroy(&shell->axpy_left)); in MatAssemblyEnd_Shell()
1336 PetscCall(VecDestroy(&shell->axpy_right)); in MatAssemblyEnd_Shell()
1337 PetscCall(VecScatterDestroy(&shell->zvals_sct_c)); in MatAssemblyEnd_Shell()
1338 PetscCall(VecScatterDestroy(&shell->zvals_sct_r)); in MatAssemblyEnd_Shell()
1339 PetscCall(ISDestroy(&shell->zrows)); in MatAssemblyEnd_Shell()
1340 PetscCall(ISDestroy(&shell->zcols)); in MatAssemblyEnd_Shell()
1347 Mat_Shell *shell = (Mat_Shell *)Y->data; in MatAXPY_Shell() local
1354 if (!shell->axpy) { in MatAXPY_Shell()
1355 PetscCall(MatConvertFrom_Shell(X, MATSHELL, MAT_INITIAL_MATRIX, &shell->axpy)); in MatAXPY_Shell()
1356 shell->axpy_vscale = a; in MatAXPY_Shell()
1357 PetscCall(PetscObjectStateGet((PetscObject)X, &shell->axpy_state)); in MatAXPY_Shell()
1359 PetscCall(MatAXPY(shell->axpy, a / shell->axpy_vscale, X, str)); in MatAXPY_Shell()
1511 Mat_Shell *shell = (Mat_Shell *)mat->data; in MatShellSetContext_Shell() local
1519 shell->ctxcontainer = ctxcontainer; in MatShellSetContext_Shell()
1523 shell->ctxcontainer = NULL; in MatShellSetContext_Shell()
1530 Mat_Shell *shell = (Mat_Shell *)mat->data; in MatShellSetContextDestroy_Shell() local
1533 if (shell->ctxcontainer) PetscCall(PetscContainerSetCtxDestroy(shell->ctxcontainer, f)); in MatShellSetContextDestroy_Shell()
1568 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellSetManageScalingShifts_Shell() local
1571 shell->managescalingshifts = PETSC_FALSE; in MatShellSetManageScalingShifts_Shell()
1582 Mat_Shell *shell = (Mat_Shell *)A->data; in MatShellGetScalingShifts_Shell() local
1585 …PetscCheck(shell->managescalingshifts, PetscObjectComm((PetscObject)A), PETSC_ERR_SUP, "Cannot get… in MatShellGetScalingShifts_Shell()
1586 …if (vshift == MAT_SHELL_NOT_ALLOWED) PetscCheck(shell->vshift == 0.0, PetscObjectComm((PetscObject… in MatShellGetScalingShifts_Shell()
1587 else if (vshift) *vshift = shell->vshift; in MatShellGetScalingShifts_Shell()
1588 …if (vscale == MAT_SHELL_NOT_ALLOWED) PetscCheck(shell->vscale == 1.0, PetscObjectComm((PetscObject… in MatShellGetScalingShifts_Shell()
1589 else if (vscale) *vscale = shell->vscale; in MatShellGetScalingShifts_Shell()
1590 …if (dshift == MAT_SHELL_NOT_ALLOWED) PetscCheck(!shell->dshift, PetscObjectComm((PetscObject)A), P… in MatShellGetScalingShifts_Shell()
1591 else if (dshift) *dshift = shell->dshift; in MatShellGetScalingShifts_Shell()
1592 …if (left == MAT_SHELL_NOT_ALLOWED) PetscCheck(!shell->left, PetscObjectComm((PetscObject)A), PETSC… in MatShellGetScalingShifts_Shell()
1593 else if (left) *left = shell->left; in MatShellGetScalingShifts_Shell()
1594 …if (right == MAT_SHELL_NOT_ALLOWED) PetscCheck(!shell->right, PetscObjectComm((PetscObject)A), PET… in MatShellGetScalingShifts_Shell()
1595 else if (right) *right = shell->right; in MatShellGetScalingShifts_Shell()
1596 …if (axpy == MAT_SHELL_NOT_ALLOWED) PetscCheck(!shell->axpy, PetscObjectComm((PetscObject)A), PETSC… in MatShellGetScalingShifts_Shell()
1597 else if (axpy) *axpy = shell->axpy; in MatShellGetScalingShifts_Shell()
1598 …if (zrows == MAT_SHELL_NOT_ALLOWED) PetscCheck(!shell->zrows, PetscObjectComm((PetscObject)A), PET… in MatShellGetScalingShifts_Shell()
1599 else if (zrows) *zrows = shell->zrows; in MatShellGetScalingShifts_Shell()
1600 …if (zcols == MAT_SHELL_NOT_ALLOWED) PetscCheck(!shell->zcols, PetscObjectComm((PetscObject)A), PET… in MatShellGetScalingShifts_Shell()
1601 else if (zcols) *zcols = shell->zcols; in MatShellGetScalingShifts_Shell()
1607 Mat_Shell *shell = (Mat_Shell *)mat->data; in MatShellSetOperation_Shell() local
1612 shell->ops->destroy = (PetscErrorCode (*)(Mat))f; in MatShellSetOperation_Shell()
1619 shell->ops->copy = (PetscErrorCode (*)(Mat, Mat, MatStructure))f; in MatShellSetOperation_Shell()
1630 …PetscCheck(!shell->managescalingshifts, PetscObjectComm((PetscObject)mat), PETSC_ERR_ARG_WRONGSTAT… in MatShellSetOperation_Shell()
1634 if (shell->managescalingshifts) { in MatShellSetOperation_Shell()
1635 shell->ops->getdiagonal = (PetscErrorCode (*)(Mat, Vec))f; in MatShellSetOperation_Shell()
1638 shell->ops->getdiagonal = NULL; in MatShellSetOperation_Shell()
1643 if (shell->managescalingshifts) { in MatShellSetOperation_Shell()
1644 shell->ops->getdiagonalblock = (PetscErrorCode (*)(Mat, Mat *))f; in MatShellSetOperation_Shell()
1647 shell->ops->getdiagonalblock = NULL; in MatShellSetOperation_Shell()
1652 if (shell->managescalingshifts) { in MatShellSetOperation_Shell()
1653 shell->ops->mult = (PetscErrorCode (*)(Mat, Vec, Vec))f; in MatShellSetOperation_Shell()
1656 shell->ops->mult = NULL; in MatShellSetOperation_Shell()
1661 if (shell->managescalingshifts) { in MatShellSetOperation_Shell()
1662 shell->ops->multtranspose = (PetscErrorCode (*)(Mat, Vec, Vec))f; in MatShellSetOperation_Shell()
1665 shell->ops->multtranspose = NULL; in MatShellSetOperation_Shell()
1670 if (shell->managescalingshifts) { in MatShellSetOperation_Shell()
1671 shell->ops->multhermitiantranspose = (PetscErrorCode (*)(Mat, Vec, Vec))f; in MatShellSetOperation_Shell()
1674 shell->ops->multhermitiantranspose = NULL; in MatShellSetOperation_Shell()
1687 Mat_Shell *shell = (Mat_Shell *)mat->data; in MatShellGetOperation_Shell() local
1692 *f = (PetscErrorCodeFn *)shell->ops->destroy; in MatShellGetOperation_Shell()
1698 *f = (PetscErrorCodeFn *)shell->ops->copy; in MatShellGetOperation_Shell()
1710 if (shell->ops->getdiagonal) *f = (PetscErrorCodeFn *)shell->ops->getdiagonal; in MatShellGetOperation_Shell()
1714 if (shell->ops->getdiagonalblock) *f = (PetscErrorCodeFn *)shell->ops->getdiagonalblock; in MatShellGetOperation_Shell()
1718 if (shell->ops->mult) *f = (PetscErrorCodeFn *)shell->ops->mult; in MatShellGetOperation_Shell()
1722 if (shell->ops->multtranspose) *f = (PetscErrorCodeFn *)shell->ops->multtranspose; in MatShellGetOperation_Shell()
1726 …if (shell->ops->multhermitiantranspose) *f = (PetscErrorCodeFn *)shell->ops->multhermitiantranspos… in MatShellGetOperation_Shell()