16280154eSStefano Zampini #include <petscmat.h>
26280154eSStefano Zampini
375ab9b9fSStefano Zampini static char help[] = "Tests MatMat operations with MAT_REUSE_MATRIX and already allocated dense result.\n\n";
475ab9b9fSStefano Zampini
575ab9b9fSStefano Zampini static PetscScalar MAGIC_NUMBER = 12345;
66280154eSStefano Zampini
CheckLocal(Mat A,Mat B,PetscScalar * a,PetscScalar * b)7d71ae5a4SJacob Faibussowitsch static PetscErrorCode CheckLocal(Mat A, Mat B, PetscScalar *a, PetscScalar *b)
8d71ae5a4SJacob Faibussowitsch {
96280154eSStefano Zampini PetscBool wA = PETSC_FALSE, wB = PETSC_FALSE;
1075ab9b9fSStefano Zampini PetscBool wAv = PETSC_FALSE, wBv = PETSC_FALSE;
1175ab9b9fSStefano Zampini PetscInt lda, i, j, m, n;
126280154eSStefano Zampini
136280154eSStefano Zampini PetscFunctionBegin;
146280154eSStefano Zampini if (a) {
156280154eSStefano Zampini const PetscScalar *Aa;
169566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A, &Aa));
176280154eSStefano Zampini wA = (PetscBool)(a != Aa);
189566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(A, &lda));
199566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(A, &m, &n));
2075ab9b9fSStefano Zampini for (j = 0; j < n; j++) {
2175ab9b9fSStefano Zampini for (i = m; i < lda; i++) {
2275ab9b9fSStefano Zampini if (Aa[j * lda + i] != MAGIC_NUMBER) wAv = PETSC_TRUE;
2375ab9b9fSStefano Zampini }
2475ab9b9fSStefano Zampini }
259566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A, &Aa));
266280154eSStefano Zampini }
276280154eSStefano Zampini if (b) {
286280154eSStefano Zampini const PetscScalar *Bb;
299566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(B, &Bb));
306280154eSStefano Zampini wB = (PetscBool)(b != Bb);
319566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(B, &lda));
329566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(B, &m, &n));
3375ab9b9fSStefano Zampini for (j = 0; j < n; j++) {
3475ab9b9fSStefano Zampini for (i = m; i < lda; i++) {
3575ab9b9fSStefano Zampini if (Bb[j * lda + i] != MAGIC_NUMBER) wBv = PETSC_TRUE;
3675ab9b9fSStefano Zampini }
3775ab9b9fSStefano Zampini }
389566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(B, &Bb));
396280154eSStefano Zampini }
4008401ef6SPierre Jolivet PetscCheck(!wA && !wB, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Wrong array in first Mat? %d, Wrong array in second Mat? %d", wA, wB);
4108401ef6SPierre Jolivet PetscCheck(!wAv && !wBv, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Wrong data in first Mat? %d, Wrong data in second Mat? %d", wAv, wBv);
423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4375ab9b9fSStefano Zampini }
4475ab9b9fSStefano Zampini
4575ab9b9fSStefano Zampini typedef struct {
4675ab9b9fSStefano Zampini Mat A;
4775ab9b9fSStefano Zampini Mat P;
4875ab9b9fSStefano Zampini Mat R;
4975ab9b9fSStefano Zampini } proj_data;
5075ab9b9fSStefano Zampini
proj_destroy(PetscCtxRt ctx)512a8381b2SBarry Smith PetscErrorCode proj_destroy(PetscCtxRt ctx)
52d71ae5a4SJacob Faibussowitsch {
53cc1eb50dSBarry Smith proj_data *userdata = *(proj_data **)ctx;
5475ab9b9fSStefano Zampini
5575ab9b9fSStefano Zampini PetscFunctionBegin;
5628b400f6SJacob Faibussowitsch PetscCheck(userdata, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Missing userdata");
579566063dSJacob Faibussowitsch PetscCall(MatDestroy(&userdata->A));
589566063dSJacob Faibussowitsch PetscCall(MatDestroy(&userdata->P));
599566063dSJacob Faibussowitsch PetscCall(MatDestroy(&userdata->R));
609566063dSJacob Faibussowitsch PetscCall(PetscFree(userdata));
613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
6275ab9b9fSStefano Zampini }
6375ab9b9fSStefano Zampini
proj_mult(Mat S,Vec X,Vec Y)64d71ae5a4SJacob Faibussowitsch PetscErrorCode proj_mult(Mat S, Vec X, Vec Y)
65d71ae5a4SJacob Faibussowitsch {
6675ab9b9fSStefano Zampini Mat A, R, P;
6775ab9b9fSStefano Zampini Vec Ax, Ay;
6875ab9b9fSStefano Zampini Vec Px, Py;
6975ab9b9fSStefano Zampini proj_data *userdata;
7075ab9b9fSStefano Zampini
7175ab9b9fSStefano Zampini PetscFunctionBegin;
729566063dSJacob Faibussowitsch PetscCall(MatShellGetContext(S, &userdata));
7328b400f6SJacob Faibussowitsch PetscCheck(userdata, PetscObjectComm((PetscObject)S), PETSC_ERR_PLIB, "Missing userdata");
7475ab9b9fSStefano Zampini A = userdata->A;
7575ab9b9fSStefano Zampini R = userdata->R;
7675ab9b9fSStefano Zampini P = userdata->P;
7728b400f6SJacob Faibussowitsch PetscCheck(A, PetscObjectComm((PetscObject)S), PETSC_ERR_PLIB, "Missing matrix");
78e00437b9SBarry Smith PetscCheck(R || P, PetscObjectComm((PetscObject)S), PETSC_ERR_PLIB, "Missing projectors");
79e00437b9SBarry Smith PetscCheck(!R || !P, PetscObjectComm((PetscObject)S), PETSC_ERR_PLIB, "Both projectors");
809566063dSJacob Faibussowitsch PetscCall(MatCreateVecs(A, &Ax, &Ay));
8175ab9b9fSStefano Zampini if (R) {
829566063dSJacob Faibussowitsch PetscCall(MatCreateVecs(R, &Py, &Px));
8375ab9b9fSStefano Zampini } else {
849566063dSJacob Faibussowitsch PetscCall(MatCreateVecs(P, &Px, &Py));
8575ab9b9fSStefano Zampini }
869566063dSJacob Faibussowitsch PetscCall(VecCopy(X, Px));
8775ab9b9fSStefano Zampini if (P) {
889566063dSJacob Faibussowitsch PetscCall(MatMult(P, Px, Py));
8975ab9b9fSStefano Zampini } else {
909566063dSJacob Faibussowitsch PetscCall(MatMultTranspose(R, Px, Py));
9175ab9b9fSStefano Zampini }
929566063dSJacob Faibussowitsch PetscCall(VecCopy(Py, Ax));
939566063dSJacob Faibussowitsch PetscCall(MatMult(A, Ax, Ay));
949566063dSJacob Faibussowitsch PetscCall(VecCopy(Ay, Py));
9575ab9b9fSStefano Zampini if (P) {
969566063dSJacob Faibussowitsch PetscCall(MatMultTranspose(P, Py, Px));
9775ab9b9fSStefano Zampini } else {
989566063dSJacob Faibussowitsch PetscCall(MatMult(R, Py, Px));
9975ab9b9fSStefano Zampini }
1009566063dSJacob Faibussowitsch PetscCall(VecCopy(Px, Y));
1019566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Px));
1029566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Py));
1039566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Ax));
1049566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Ay));
1053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
10675ab9b9fSStefano Zampini }
10775ab9b9fSStefano Zampini
MyPtShellPMultSymbolic(Mat S,Mat P,Mat PtAP,void ** ctx)108d71ae5a4SJacob Faibussowitsch PetscErrorCode MyPtShellPMultSymbolic(Mat S, Mat P, Mat PtAP, void **ctx)
109d71ae5a4SJacob Faibussowitsch {
11075ab9b9fSStefano Zampini proj_data *userdata;
11175ab9b9fSStefano Zampini
11275ab9b9fSStefano Zampini PetscFunctionBegin;
1139566063dSJacob Faibussowitsch PetscCall(PetscNew(&userdata));
1149566063dSJacob Faibussowitsch PetscCall(MatShellSetContext(PtAP, userdata));
11575ab9b9fSStefano Zampini *ctx = (void *)userdata;
1163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
11775ab9b9fSStefano Zampini }
11875ab9b9fSStefano Zampini
MyPtShellPMultNumeric(Mat S,Mat P,Mat PtAP,PetscCtx ctx)1192a8381b2SBarry Smith PetscErrorCode MyPtShellPMultNumeric(Mat S, Mat P, Mat PtAP, PetscCtx ctx)
120d71ae5a4SJacob Faibussowitsch {
12175ab9b9fSStefano Zampini Mat A;
12275ab9b9fSStefano Zampini proj_data *userdata = (proj_data *)ctx;
12375ab9b9fSStefano Zampini
12475ab9b9fSStefano Zampini PetscFunctionBegin;
1259566063dSJacob Faibussowitsch PetscCall(MatShellGetContext(S, &A));
1269566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)A));
1279566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)P));
1289566063dSJacob Faibussowitsch PetscCall(MatDestroy(&userdata->A));
1299566063dSJacob Faibussowitsch PetscCall(MatDestroy(&userdata->P));
1309566063dSJacob Faibussowitsch PetscCall(MatDestroy(&userdata->R));
13175ab9b9fSStefano Zampini userdata->A = A;
13275ab9b9fSStefano Zampini userdata->P = P;
13357d50842SBarry Smith PetscCall(MatShellSetOperation(PtAP, MATOP_MULT, (PetscErrorCodeFn *)proj_mult));
1349566063dSJacob Faibussowitsch PetscCall(MatSetUp(PtAP));
1359566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(PtAP, MAT_FINAL_ASSEMBLY));
1369566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(PtAP, MAT_FINAL_ASSEMBLY));
1373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
13875ab9b9fSStefano Zampini }
13975ab9b9fSStefano Zampini
MyRShellRtMultSymbolic(Mat S,Mat R,Mat RARt,void ** ctx)140d71ae5a4SJacob Faibussowitsch PetscErrorCode MyRShellRtMultSymbolic(Mat S, Mat R, Mat RARt, void **ctx)
141d71ae5a4SJacob Faibussowitsch {
14275ab9b9fSStefano Zampini proj_data *userdata;
14375ab9b9fSStefano Zampini
14475ab9b9fSStefano Zampini PetscFunctionBegin;
1459566063dSJacob Faibussowitsch PetscCall(PetscNew(&userdata));
1469566063dSJacob Faibussowitsch PetscCall(MatShellSetContext(RARt, userdata));
14775ab9b9fSStefano Zampini *ctx = (void *)userdata;
1483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
14975ab9b9fSStefano Zampini }
15075ab9b9fSStefano Zampini
MyRShellRtMultNumeric(Mat S,Mat R,Mat RARt,PetscCtx ctx)1512a8381b2SBarry Smith PetscErrorCode MyRShellRtMultNumeric(Mat S, Mat R, Mat RARt, PetscCtx ctx)
152d71ae5a4SJacob Faibussowitsch {
15375ab9b9fSStefano Zampini Mat A;
15475ab9b9fSStefano Zampini proj_data *userdata = (proj_data *)ctx;
15575ab9b9fSStefano Zampini
15675ab9b9fSStefano Zampini PetscFunctionBegin;
1579566063dSJacob Faibussowitsch PetscCall(MatShellGetContext(S, &A));
1589566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)A));
1599566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)R));
1609566063dSJacob Faibussowitsch PetscCall(MatDestroy(&userdata->A));
1619566063dSJacob Faibussowitsch PetscCall(MatDestroy(&userdata->P));
1629566063dSJacob Faibussowitsch PetscCall(MatDestroy(&userdata->R));
16375ab9b9fSStefano Zampini userdata->A = A;
16475ab9b9fSStefano Zampini userdata->R = R;
16557d50842SBarry Smith PetscCall(MatShellSetOperation(RARt, MATOP_MULT, (PetscErrorCodeFn *)proj_mult));
1669566063dSJacob Faibussowitsch PetscCall(MatSetUp(RARt));
1679566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(RARt, MAT_FINAL_ASSEMBLY));
1689566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(RARt, MAT_FINAL_ASSEMBLY));
1693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
17075ab9b9fSStefano Zampini }
17175ab9b9fSStefano Zampini
MyMatShellMatMultNumeric(Mat S,Mat B,Mat C,PetscCtx ctx)1722a8381b2SBarry Smith PetscErrorCode MyMatShellMatMultNumeric(Mat S, Mat B, Mat C, PetscCtx ctx)
173d71ae5a4SJacob Faibussowitsch {
17475ab9b9fSStefano Zampini Mat A;
17575ab9b9fSStefano Zampini
17675ab9b9fSStefano Zampini PetscFunctionBegin;
1779566063dSJacob Faibussowitsch PetscCall(MatShellGetContext(S, &A));
178fb842aefSJose E. Roman PetscCall(MatMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &C));
1793ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
18075ab9b9fSStefano Zampini }
18175ab9b9fSStefano Zampini
MyMatTransposeShellMatMultNumeric(Mat S,Mat B,Mat C,PetscCtx ctx)1822a8381b2SBarry Smith PetscErrorCode MyMatTransposeShellMatMultNumeric(Mat S, Mat B, Mat C, PetscCtx ctx)
183d71ae5a4SJacob Faibussowitsch {
18475ab9b9fSStefano Zampini Mat A;
18575ab9b9fSStefano Zampini
18675ab9b9fSStefano Zampini PetscFunctionBegin;
1879566063dSJacob Faibussowitsch PetscCall(MatShellGetContext(S, &A));
188fb842aefSJose E. Roman PetscCall(MatTransposeMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &C));
1893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
19075ab9b9fSStefano Zampini }
19175ab9b9fSStefano Zampini
MyMatShellMatTransposeMultNumeric(Mat S,Mat B,Mat C,PetscCtx ctx)1922a8381b2SBarry Smith PetscErrorCode MyMatShellMatTransposeMultNumeric(Mat S, Mat B, Mat C, PetscCtx ctx)
193d71ae5a4SJacob Faibussowitsch {
19475ab9b9fSStefano Zampini Mat A;
19575ab9b9fSStefano Zampini
19675ab9b9fSStefano Zampini PetscFunctionBegin;
1979566063dSJacob Faibussowitsch PetscCall(MatShellGetContext(S, &A));
198fb842aefSJose E. Roman PetscCall(MatMatTransposeMult(A, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &C));
1993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2006280154eSStefano Zampini }
2016280154eSStefano Zampini
main(int argc,char ** args)202d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
203d71ae5a4SJacob Faibussowitsch {
20475ab9b9fSStefano Zampini Mat X, B, A, Bt, T, T2, PtAP = NULL, RARt = NULL, R = NULL;
20575ab9b9fSStefano Zampini Vec r, l, rs, ls;
20675ab9b9fSStefano Zampini PetscInt m, n, k, M = 10, N = 10, K = 5, ldx = 3, ldb = 5, ldr = 4;
2076280154eSStefano Zampini const char *deft = MATAIJ;
2086280154eSStefano Zampini char mattype[256];
2096280154eSStefano Zampini PetscBool flg, symm = PETSC_FALSE, testtt = PETSC_TRUE, testnest = PETSC_TRUE, testtranspose = PETSC_TRUE, testcircular = PETSC_FALSE, local = PETSC_TRUE;
210013e2dc7SBarry Smith PetscBool testhtranspose = PETSC_FALSE; /* Hermitian transpose is not handled correctly and generates an error */
21175ab9b9fSStefano Zampini PetscBool xgpu = PETSC_FALSE, bgpu = PETSC_FALSE, testshellops = PETSC_FALSE, testproj = PETSC_TRUE, testrart = PETSC_TRUE, testmatmatt = PETSC_TRUE, testmattmat = PETSC_TRUE;
21275ab9b9fSStefano Zampini PetscScalar *dataX = NULL, *dataB = NULL, *dataR = NULL, *dataBt = NULL;
21375ab9b9fSStefano Zampini PetscScalar *aX, *aB, *aBt;
214456288a8SStefano Zampini PetscReal err;
2156280154eSStefano Zampini
216327415f7SBarry Smith PetscFunctionBeginUser;
2179566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &args, NULL, help));
2189566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-N", &N, NULL));
2199566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-M", &M, NULL));
2209566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-K", &K, NULL));
2219566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-symm", &symm, NULL));
2229566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-local", &local, NULL));
2239566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-ldx", &ldx, NULL));
2249566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-ldb", &ldb, NULL));
2259566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-ldr", &ldr, NULL));
2269566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testtranspose", &testtranspose, NULL));
2279566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testnest", &testnest, NULL));
2289566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testtt", &testtt, NULL));
2299566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testcircular", &testcircular, NULL));
2309566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testshellops", &testshellops, NULL));
2319566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testproj", &testproj, NULL));
2329566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testrart", &testrart, NULL));
2339566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testmatmatt", &testmatmatt, NULL));
2349566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testmattmat", &testmattmat, NULL));
2359566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-xgpu", &xgpu, NULL));
2369566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-bgpu", &bgpu, NULL));
2379566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetScalar(NULL, NULL, "-magic_number", &MAGIC_NUMBER, NULL));
23875ab9b9fSStefano Zampini if (M != N) testproj = PETSC_FALSE;
23975ab9b9fSStefano Zampini
2409566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
2419566063dSJacob Faibussowitsch PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, M, N));
2429566063dSJacob Faibussowitsch PetscCall(MatSetType(A, MATAIJ));
24326cec326SBarry Smith PetscCall(MatSeqAIJSetPreallocation(A, PETSC_DEFAULT, NULL));
24426cec326SBarry Smith PetscCall(MatMPIAIJSetPreallocation(A, PETSC_DEFAULT, NULL, PETSC_DEFAULT, NULL));
2459566063dSJacob Faibussowitsch PetscCall(MatSetUp(A));
2469566063dSJacob Faibussowitsch PetscCall(MatSetRandom(A, NULL));
2476280154eSStefano Zampini if (M == N && symm) {
2486280154eSStefano Zampini Mat AT;
2496280154eSStefano Zampini
2509566063dSJacob Faibussowitsch PetscCall(MatTranspose(A, MAT_INITIAL_MATRIX, &AT));
2519566063dSJacob Faibussowitsch PetscCall(MatAXPY(A, 1.0, AT, DIFFERENT_NONZERO_PATTERN));
2529566063dSJacob Faibussowitsch PetscCall(MatDestroy(&AT));
2539566063dSJacob Faibussowitsch PetscCall(MatSetOption(A, MAT_SYMMETRIC, PETSC_TRUE));
2546280154eSStefano Zampini }
2559566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(A, NULL, "-A_init_view"));
256d0609cedSBarry Smith PetscOptionsBegin(PETSC_COMM_WORLD, "", "", "");
2579566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-A_mat_type", "Matrix type", "MatSetType", MatList, deft, mattype, 256, &flg));
258d0609cedSBarry Smith PetscOptionsEnd();
2596280154eSStefano Zampini if (flg) {
2606280154eSStefano Zampini Mat A2;
2616280154eSStefano Zampini
2629566063dSJacob Faibussowitsch PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &A2));
2639566063dSJacob Faibussowitsch PetscCall(MatConvert(A, mattype, MAT_INPLACE_MATRIX, &A));
2649566063dSJacob Faibussowitsch PetscCall(MatMultEqual(A, A2, 10, &flg));
2656280154eSStefano Zampini if (!flg) {
2666280154eSStefano Zampini Mat AE, A2E;
2676280154eSStefano Zampini
2689566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with convert\n"));
2699566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(A, MATDENSE, &AE));
2709566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(A2, MATDENSE, &A2E));
2719566063dSJacob Faibussowitsch PetscCall(MatView(AE, NULL));
2729566063dSJacob Faibussowitsch PetscCall(MatView(A2E, NULL));
2739566063dSJacob Faibussowitsch PetscCall(MatAXPY(A2E, -1.0, A, SAME_NONZERO_PATTERN));
2749566063dSJacob Faibussowitsch PetscCall(MatView(A2E, NULL));
2759566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A2E));
2769566063dSJacob Faibussowitsch PetscCall(MatDestroy(&AE));
2776280154eSStefano Zampini }
2789566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A2));
2796280154eSStefano Zampini }
2809566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(A, NULL, "-A_view"));
2816280154eSStefano Zampini
2829566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(A, &m, &n));
2836280154eSStefano Zampini if (local) {
28475ab9b9fSStefano Zampini PetscInt i;
28575ab9b9fSStefano Zampini
2869566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((m + ldx) * K, &dataX));
2879566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((n + ldb) * K, &dataB));
288a0638e9dSStefano Zampini for (i = 0; i < (m + ldx) * K; i++) dataX[i] = MAGIC_NUMBER;
289a0638e9dSStefano Zampini for (i = 0; i < (n + ldb) * K; i++) dataB[i] = MAGIC_NUMBER;
2906280154eSStefano Zampini }
2919566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PETSC_COMM_WORLD, n, PETSC_DECIDE, N, K, dataB, &B));
2929566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PETSC_COMM_WORLD, m, PETSC_DECIDE, M, K, dataX, &X));
29375ab9b9fSStefano Zampini if (local) {
2949566063dSJacob Faibussowitsch PetscCall(MatDenseSetLDA(X, m + ldx));
2959566063dSJacob Faibussowitsch PetscCall(MatDenseSetLDA(B, n + ldb));
29675ab9b9fSStefano Zampini }
2979566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(B, NULL, &k));
29875ab9b9fSStefano Zampini if (local) {
29975ab9b9fSStefano Zampini PetscInt i;
30075ab9b9fSStefano Zampini
3019566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((k + ldr) * N, &dataBt));
302a0638e9dSStefano Zampini for (i = 0; i < (k + ldr) * N; i++) dataBt[i] = MAGIC_NUMBER;
30375ab9b9fSStefano Zampini }
3049566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PETSC_COMM_WORLD, k, n, K, N, dataBt, &Bt));
3051baa6e33SBarry Smith if (local) PetscCall(MatDenseSetLDA(Bt, k + ldr));
3066280154eSStefano Zampini
3076280154eSStefano Zampini /* store pointer to dense data for testing */
3089566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(B, (const PetscScalar **)&dataB));
3099566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(X, (const PetscScalar **)&dataX));
3109566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(Bt, (const PetscScalar **)&dataBt));
3116280154eSStefano Zampini aX = dataX;
3126280154eSStefano Zampini aB = dataB;
31375ab9b9fSStefano Zampini aBt = dataBt;
3149566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(Bt, (const PetscScalar **)&dataBt));
3159566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(B, (const PetscScalar **)&dataB));
3169566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(X, (const PetscScalar **)&dataX));
3176280154eSStefano Zampini if (local) {
3186280154eSStefano Zampini dataX = aX;
3196280154eSStefano Zampini dataB = aB;
32075ab9b9fSStefano Zampini dataBt = aBt;
3216280154eSStefano Zampini }
32275ab9b9fSStefano Zampini
3239566063dSJacob Faibussowitsch PetscCall(MatSetRandom(X, NULL));
3249566063dSJacob Faibussowitsch PetscCall(MatSetRandom(B, NULL));
3259566063dSJacob Faibussowitsch PetscCall(MatSetRandom(Bt, NULL));
3269566063dSJacob Faibussowitsch PetscCall(CheckLocal(X, NULL, aX, NULL));
3279566063dSJacob Faibussowitsch PetscCall(CheckLocal(Bt, B, aBt, aB));
32875ab9b9fSStefano Zampini
329456288a8SStefano Zampini /* convert to CUDA if needed */
330456288a8SStefano Zampini if (bgpu) {
3319566063dSJacob Faibussowitsch PetscCall(MatConvert(B, MATDENSECUDA, MAT_INPLACE_MATRIX, &B));
3329566063dSJacob Faibussowitsch PetscCall(MatConvert(Bt, MATDENSECUDA, MAT_INPLACE_MATRIX, &Bt));
333456288a8SStefano Zampini }
33448a46eb9SPierre Jolivet if (xgpu) PetscCall(MatConvert(X, MATDENSECUDA, MAT_INPLACE_MATRIX, &X));
3359566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
3366280154eSStefano Zampini
337e7b38fdfSStefano Zampini /* Test MatDenseGetSubMatrix */
338e7b38fdfSStefano Zampini {
339e7b38fdfSStefano Zampini Mat B2, T3, T4;
340e7b38fdfSStefano Zampini
3419566063dSJacob Faibussowitsch PetscCall(MatDuplicate(B, MAT_COPY_VALUES, &B2));
3429566063dSJacob Faibussowitsch PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &T4));
3439566063dSJacob Faibussowitsch PetscCall(MatSetRandom(T4, NULL));
3449566063dSJacob Faibussowitsch PetscCall(MatAXPY(B2, 1.0, T4, SAME_NONZERO_PATTERN));
345a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B, PETSC_DECIDE, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T));
346a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(T4, PETSC_DECIDE, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T2));
347a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B2, PETSC_DECIDE, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T3));
3489566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, 1.0, T2, SAME_NONZERO_PATTERN));
3499566063dSJacob Faibussowitsch PetscCall(MatAXPY(T3, -1.0, T, SAME_NONZERO_PATTERN));
3509566063dSJacob Faibussowitsch PetscCall(MatNorm(T3, NORM_FROBENIUS, &err));
351e7b38fdfSStefano Zampini if (err > PETSC_SMALL) {
3529566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetSubMatrix\n"));
3539566063dSJacob Faibussowitsch PetscCall(MatView(T3, NULL));
354e7b38fdfSStefano Zampini }
3559566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreSubMatrix(B, &T));
3569566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreSubMatrix(T4, &T2));
3579566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreSubMatrix(B2, &T3));
3589566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, NULL, aB, NULL));
3599566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B2));
3609566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T4));
361a2748737SPierre Jolivet if (N >= 2) {
362a2748737SPierre Jolivet PetscCall(MatDuplicate(B, MAT_COPY_VALUES, &B2));
363a2748737SPierre Jolivet PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &T4));
364a2748737SPierre Jolivet PetscCall(MatSetRandom(T4, NULL));
365a2748737SPierre Jolivet PetscCall(MatAXPY(B2, 1.0, T4, SAME_NONZERO_PATTERN));
366a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B, N - 2, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T));
367a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(T4, N - 2, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T2));
368a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B2, N - 2, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T3));
369a2748737SPierre Jolivet PetscCall(MatAXPY(T, 1.0, T2, SAME_NONZERO_PATTERN));
370a2748737SPierre Jolivet PetscCall(MatAXPY(T3, -1.0, T, SAME_NONZERO_PATTERN));
371a2748737SPierre Jolivet PetscCall(MatNorm(T3, NORM_FROBENIUS, &err));
372a2748737SPierre Jolivet if (err > PETSC_SMALL) {
373a2748737SPierre Jolivet PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetSubMatrix\n"));
374a2748737SPierre Jolivet PetscCall(MatView(T3, NULL));
375a2748737SPierre Jolivet }
376a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(B, &T));
377a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(T4, &T2));
378a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(B2, &T3));
379a2748737SPierre Jolivet PetscCall(CheckLocal(B, NULL, aB, NULL));
380a2748737SPierre Jolivet PetscCall(MatDestroy(&B2));
381a2748737SPierre Jolivet PetscCall(MatDestroy(&T4));
382a2748737SPierre Jolivet PetscCall(MatDuplicate(B, MAT_COPY_VALUES, &B2));
383a2748737SPierre Jolivet PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &T4));
384a2748737SPierre Jolivet PetscCall(MatSetRandom(T4, NULL));
385a2748737SPierre Jolivet PetscCall(MatAXPY(B2, 1.0, T4, SAME_NONZERO_PATTERN));
386a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B, PETSC_DECIDE, 2, PetscMin(1, K - 1), PetscMin(2, K), &T));
387a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(T4, PETSC_DECIDE, 2, PetscMin(1, K - 1), PetscMin(2, K), &T2));
388a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B2, PETSC_DECIDE, 2, PetscMin(1, K - 1), PetscMin(2, K), &T3));
389a2748737SPierre Jolivet PetscCall(MatAXPY(T, 1.0, T2, SAME_NONZERO_PATTERN));
390a2748737SPierre Jolivet PetscCall(MatAXPY(T3, -1.0, T, SAME_NONZERO_PATTERN));
391a2748737SPierre Jolivet PetscCall(MatNorm(T3, NORM_FROBENIUS, &err));
392a2748737SPierre Jolivet if (err > PETSC_SMALL) {
393a2748737SPierre Jolivet PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetSubMatrix\n"));
394a2748737SPierre Jolivet PetscCall(MatView(T3, NULL));
395a2748737SPierre Jolivet }
396a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(B, &T));
397a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(T4, &T2));
398a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(B2, &T3));
399a2748737SPierre Jolivet PetscCall(CheckLocal(B, NULL, aB, NULL));
400a2748737SPierre Jolivet PetscCall(MatDestroy(&B2));
401a2748737SPierre Jolivet PetscCall(MatDestroy(&T4));
402a2748737SPierre Jolivet }
403e7b38fdfSStefano Zampini }
404e7b38fdfSStefano Zampini
4056280154eSStefano Zampini /* Test reusing a previously allocated dense buffer */
406fb842aefSJose E. Roman PetscCall(MatMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &X));
4079566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
4089566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(A, B, X, 10, &flg));
4096280154eSStefano Zampini if (!flg) {
4109566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage\n"));
411fb842aefSJose E. Roman PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
4129566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN));
4139566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
4149566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
4156280154eSStefano Zampini }
4166280154eSStefano Zampini
41775ab9b9fSStefano Zampini /* Test MatTransposeMat and MatMatTranspose */
41875ab9b9fSStefano Zampini if (testmattmat) {
419fb842aefSJose E. Roman PetscCall(MatTransposeMatMult(A, X, MAT_REUSE_MATRIX, PETSC_DETERMINE, &B));
4209566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
4219566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMultEqual(A, X, B, 10, &flg));
42275ab9b9fSStefano Zampini if (!flg) {
4239566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MatTransposeMat)\n"));
424fb842aefSJose E. Roman PetscCall(MatTransposeMatMult(A, X, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &B));
4259566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, B, SAME_NONZERO_PATTERN));
4269566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
4279566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
42875ab9b9fSStefano Zampini }
42975ab9b9fSStefano Zampini }
43075ab9b9fSStefano Zampini if (testmatmatt) {
431fb842aefSJose E. Roman PetscCall(MatMatTransposeMult(A, Bt, MAT_REUSE_MATRIX, PETSC_DETERMINE, &X));
4329566063dSJacob Faibussowitsch PetscCall(CheckLocal(Bt, X, aBt, aX));
4339566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMultEqual(A, Bt, X, 10, &flg));
43475ab9b9fSStefano Zampini if (!flg) {
4359566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MatMatTranspose)\n"));
436fb842aefSJose E. Roman PetscCall(MatMatTransposeMult(A, Bt, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
4379566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN));
4389566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
4399566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
44075ab9b9fSStefano Zampini }
44175ab9b9fSStefano Zampini }
44275ab9b9fSStefano Zampini
44375ab9b9fSStefano Zampini /* Test projection operations (PtAP and RARt) */
44475ab9b9fSStefano Zampini if (testproj) {
445fb842aefSJose E. Roman PetscCall(MatPtAP(A, B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &PtAP));
4469566063dSJacob Faibussowitsch PetscCall(MatPtAPMultEqual(A, B, PtAP, 10, &flg));
44775ab9b9fSStefano Zampini if (!flg) {
4489566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with PtAP\n"));
449fb842aefSJose E. Roman PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
450fb842aefSJose E. Roman PetscCall(MatTransposeMatMult(B, T, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T2));
4519566063dSJacob Faibussowitsch PetscCall(MatAXPY(T2, -1.0, PtAP, SAME_NONZERO_PATTERN));
4529566063dSJacob Faibussowitsch PetscCall(MatView(T2, NULL));
4539566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T2));
4549566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
45575ab9b9fSStefano Zampini }
4569566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((k + ldr) * M, &dataR));
4579566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PETSC_COMM_WORLD, PETSC_DECIDE, m, K, M, dataR, &R));
4589566063dSJacob Faibussowitsch PetscCall(MatDenseSetLDA(R, k + ldr));
4599566063dSJacob Faibussowitsch PetscCall(MatSetRandom(R, NULL));
46075ab9b9fSStefano Zampini if (testrart) { /* fails for AIJCUSPARSE because RA operation is not defined */
461fb842aefSJose E. Roman PetscCall(MatRARt(A, R, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &RARt));
4629566063dSJacob Faibussowitsch PetscCall(MatRARtMultEqual(A, R, RARt, 10, &flg));
46375ab9b9fSStefano Zampini if (!flg) {
4649566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with RARt\n"));
465fb842aefSJose E. Roman PetscCall(MatMatTransposeMult(A, R, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
466fb842aefSJose E. Roman PetscCall(MatMatMult(R, T, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T2));
4679566063dSJacob Faibussowitsch PetscCall(MatAXPY(T2, -1.0, RARt, SAME_NONZERO_PATTERN));
4689566063dSJacob Faibussowitsch PetscCall(MatView(T2, NULL));
4699566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T2));
4709566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
47175ab9b9fSStefano Zampini }
47275ab9b9fSStefano Zampini }
47375ab9b9fSStefano Zampini }
47475ab9b9fSStefano Zampini
475456288a8SStefano Zampini /* Test MatDenseGetColumnVec and friends */
476fb842aefSJose E. Roman PetscCall(MatMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &X));
477fb842aefSJose E. Roman PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
4789566063dSJacob Faibussowitsch PetscCall(MatDuplicate(T, MAT_DO_NOT_COPY_VALUES, &T2));
479456288a8SStefano Zampini for (k = 0; k < K; k++) {
480456288a8SStefano Zampini Vec Xv, Tv, T2v;
481456288a8SStefano Zampini
4829566063dSJacob Faibussowitsch PetscCall(MatDenseGetColumnVecRead(X, k, &Xv));
4839566063dSJacob Faibussowitsch PetscCall(MatDenseGetColumnVec(T, k, &Tv));
4849566063dSJacob Faibussowitsch PetscCall(MatDenseGetColumnVecWrite(T2, k, &T2v));
4859566063dSJacob Faibussowitsch PetscCall(VecCopy(Xv, T2v));
4869566063dSJacob Faibussowitsch PetscCall(VecAXPY(Tv, -1., Xv));
4879566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreColumnVecRead(X, k, &Xv));
4889566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreColumnVec(T, k, &Tv));
4899566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreColumnVecWrite(T2, k, &T2v));
490456288a8SStefano Zampini }
4919566063dSJacob Faibussowitsch PetscCall(MatNorm(T, NORM_FROBENIUS, &err));
492456288a8SStefano Zampini if (err > PETSC_SMALL) {
4939566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetColumnVec\n"));
4949566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
495456288a8SStefano Zampini }
4969566063dSJacob Faibussowitsch PetscCall(MatAXPY(T2, -1., X, SAME_NONZERO_PATTERN));
4979566063dSJacob Faibussowitsch PetscCall(MatNorm(T2, NORM_FROBENIUS, &err));
498456288a8SStefano Zampini if (err > PETSC_SMALL) {
4999566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetColumnVecWrite\n"));
5009566063dSJacob Faibussowitsch PetscCall(MatView(T2, NULL));
501456288a8SStefano Zampini }
5029566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
5039566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T2));
504456288a8SStefano Zampini
505456288a8SStefano Zampini /* Test with MatShell */
5069566063dSJacob Faibussowitsch PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &T));
5079566063dSJacob Faibussowitsch PetscCall(MatConvert(T, MATSHELL, MAT_INITIAL_MATRIX, &T2));
5089566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
50975ab9b9fSStefano Zampini
51075ab9b9fSStefano Zampini /* scale matrix */
5119566063dSJacob Faibussowitsch PetscCall(MatScale(A, 2.0));
5129566063dSJacob Faibussowitsch PetscCall(MatScale(T2, 2.0));
5139566063dSJacob Faibussowitsch PetscCall(MatCreateVecs(A, &r, &l));
5149566063dSJacob Faibussowitsch PetscCall(VecSetRandom(r, NULL));
5159566063dSJacob Faibussowitsch PetscCall(VecSetRandom(l, NULL));
5169566063dSJacob Faibussowitsch PetscCall(MatCreateVecs(T2, &rs, &ls));
5179566063dSJacob Faibussowitsch PetscCall(VecCopy(r, rs));
5189566063dSJacob Faibussowitsch PetscCall(VecCopy(l, ls));
51975ab9b9fSStefano Zampini if (testproj) {
5209566063dSJacob Faibussowitsch PetscCall(MatDiagonalScale(A, r, r));
5219566063dSJacob Faibussowitsch PetscCall(MatDiagonalScale(T2, rs, rs));
52275ab9b9fSStefano Zampini } else {
5239566063dSJacob Faibussowitsch PetscCall(MatDiagonalScale(A, l, r));
5249566063dSJacob Faibussowitsch PetscCall(MatDiagonalScale(T2, ls, rs));
52575ab9b9fSStefano Zampini }
5269566063dSJacob Faibussowitsch PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &T));
5279566063dSJacob Faibussowitsch PetscCall(MatAXPY(A, 4.5, T, SAME_NONZERO_PATTERN));
5289566063dSJacob Faibussowitsch PetscCall(MatAXPY(T2, 4.5, T, DIFFERENT_NONZERO_PATTERN));
5299566063dSJacob Faibussowitsch PetscCall(MatMultEqual(T2, A, 10, &flg));
53048a46eb9SPierre Jolivet if (!flg) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MATSHELL (MatMult)\n"));
5319566063dSJacob Faibussowitsch PetscCall(MatMultTransposeEqual(T2, A, 10, &flg));
53248a46eb9SPierre Jolivet if (!flg) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MATSHELL (MatMultTranspose)\n"));
5339566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
5349566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ls));
5359566063dSJacob Faibussowitsch PetscCall(VecDestroy(&rs));
5369566063dSJacob Faibussowitsch PetscCall(VecDestroy(&l));
5379566063dSJacob Faibussowitsch PetscCall(VecDestroy(&r));
53875ab9b9fSStefano Zampini
53975ab9b9fSStefano Zampini /* recompute projections, test reusage */
540fb842aefSJose E. Roman if (PtAP) PetscCall(MatPtAP(A, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &PtAP));
541fb842aefSJose E. Roman if (RARt) PetscCall(MatRARt(A, R, MAT_REUSE_MATRIX, PETSC_DETERMINE, &RARt));
54275ab9b9fSStefano Zampini if (testshellops) { /* test callbacks for user defined MatProducts */
5439566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_AB, NULL, MyMatShellMatMultNumeric, NULL, MATDENSE, MATDENSE));
5449566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_AB, NULL, MyMatShellMatMultNumeric, NULL, MATDENSECUDA, MATDENSECUDA));
5459566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_AtB, NULL, MyMatTransposeShellMatMultNumeric, NULL, MATDENSE, MATDENSE));
5469566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_AtB, NULL, MyMatTransposeShellMatMultNumeric, NULL, MATDENSECUDA, MATDENSECUDA));
5479566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_ABt, NULL, MyMatShellMatTransposeMultNumeric, NULL, MATDENSE, MATDENSE));
5489566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_ABt, NULL, MyMatShellMatTransposeMultNumeric, NULL, MATDENSECUDA, MATDENSECUDA));
54975ab9b9fSStefano Zampini if (testproj) {
5509566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_PtAP, MyPtShellPMultSymbolic, MyPtShellPMultNumeric, proj_destroy, MATDENSE, MATSHELL));
5519566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_PtAP, MyPtShellPMultSymbolic, MyPtShellPMultNumeric, proj_destroy, MATDENSECUDA, MATSHELL));
5529566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_RARt, MyRShellRtMultSymbolic, MyRShellRtMultNumeric, proj_destroy, MATDENSE, MATSHELL));
5539566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_RARt, MyRShellRtMultSymbolic, MyRShellRtMultNumeric, proj_destroy, MATDENSECUDA, MATSHELL));
55475ab9b9fSStefano Zampini }
55575ab9b9fSStefano Zampini }
5569566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
55775ab9b9fSStefano Zampini /* we either use the shell operations or the loop over columns code, applying the operator */
558fb842aefSJose E. Roman PetscCall(MatMatMult(T2, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &X));
5599566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
5609566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(T2, B, X, 10, &flg));
561456288a8SStefano Zampini if (!flg) {
5629566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MATSHELL)\n"));
563fb842aefSJose E. Roman PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
5649566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN));
5659566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
5669566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
567456288a8SStefano Zampini }
56875ab9b9fSStefano Zampini if (testproj) {
5699566063dSJacob Faibussowitsch PetscCall(MatPtAPMultEqual(T2, B, PtAP, 10, &flg));
57048a46eb9SPierre Jolivet if (!flg) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with PtAP (MATSHELL)\n"));
57175ab9b9fSStefano Zampini if (testshellops) { /* projections fail if the product operations are not specified */
572fb842aefSJose E. Roman PetscCall(MatPtAP(T2, B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
573fb842aefSJose E. Roman PetscCall(MatPtAP(T2, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &T));
5749566063dSJacob Faibussowitsch PetscCall(MatPtAPMultEqual(T2, B, T, 10, &flg));
57575ab9b9fSStefano Zampini if (!flg) {
57675ab9b9fSStefano Zampini Mat TE;
5776718818eSStefano Zampini
5789566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with PtAP (MATSHELL user defined)\n"));
5799566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(T, MATDENSE, &TE));
5809566063dSJacob Faibussowitsch PetscCall(MatView(TE, NULL));
5819566063dSJacob Faibussowitsch PetscCall(MatView(PtAP, NULL));
5829566063dSJacob Faibussowitsch PetscCall(MatAXPY(TE, -1.0, PtAP, SAME_NONZERO_PATTERN));
5839566063dSJacob Faibussowitsch PetscCall(MatView(TE, NULL));
5849566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TE));
58575ab9b9fSStefano Zampini }
5869566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
58775ab9b9fSStefano Zampini }
58875ab9b9fSStefano Zampini if (RARt) {
5899566063dSJacob Faibussowitsch PetscCall(MatRARtMultEqual(T2, R, RARt, 10, &flg));
59048a46eb9SPierre Jolivet if (!flg) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with RARt (MATSHELL)\n"));
59175ab9b9fSStefano Zampini }
59275ab9b9fSStefano Zampini if (testshellops) {
593fb842aefSJose E. Roman PetscCall(MatRARt(T2, R, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
594fb842aefSJose E. Roman PetscCall(MatRARt(T2, R, MAT_REUSE_MATRIX, PETSC_DETERMINE, &T));
5959566063dSJacob Faibussowitsch PetscCall(MatRARtMultEqual(T2, R, T, 10, &flg));
59675ab9b9fSStefano Zampini if (!flg) {
59775ab9b9fSStefano Zampini Mat TE;
59875ab9b9fSStefano Zampini
5999566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with RARt (MATSHELL user defined)\n"));
6009566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(T, MATDENSE, &TE));
6019566063dSJacob Faibussowitsch PetscCall(MatView(TE, NULL));
60275ab9b9fSStefano Zampini if (RARt) {
6039566063dSJacob Faibussowitsch PetscCall(MatView(RARt, NULL));
6049566063dSJacob Faibussowitsch PetscCall(MatAXPY(TE, -1.0, RARt, SAME_NONZERO_PATTERN));
6059566063dSJacob Faibussowitsch PetscCall(MatView(TE, NULL));
60675ab9b9fSStefano Zampini }
6079566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TE));
60875ab9b9fSStefano Zampini }
6099566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
61075ab9b9fSStefano Zampini }
61175ab9b9fSStefano Zampini }
61275ab9b9fSStefano Zampini
61375ab9b9fSStefano Zampini if (testmattmat) { /* we either use the shell operations or the loop over columns code applying the transposed operator */
614fb842aefSJose E. Roman PetscCall(MatTransposeMatMult(T2, X, MAT_REUSE_MATRIX, PETSC_DETERMINE, &B));
6159566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
6169566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMultEqual(T2, X, B, 10, &flg));
617456288a8SStefano Zampini if (!flg) {
6189566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MatTranspose, MATSHELL)\n"));
619fb842aefSJose E. Roman PetscCall(MatTransposeMatMult(A, X, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
6209566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, B, SAME_NONZERO_PATTERN));
6219566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
6229566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
6236718818eSStefano Zampini }
624456288a8SStefano Zampini }
62575ab9b9fSStefano Zampini if (testmatmatt && testshellops) { /* only when shell operations are set */
626fb842aefSJose E. Roman PetscCall(MatMatTransposeMult(T2, Bt, MAT_REUSE_MATRIX, PETSC_DETERMINE, &X));
6279566063dSJacob Faibussowitsch PetscCall(CheckLocal(Bt, X, aBt, aX));
6289566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMultEqual(T2, Bt, X, 10, &flg));
62975ab9b9fSStefano Zampini if (!flg) {
6309566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MatMatTranspose, MATSHELL)\n"));
631fb842aefSJose E. Roman PetscCall(MatMatTransposeMult(A, Bt, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
6329566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN));
6339566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
6349566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
63575ab9b9fSStefano Zampini }
63675ab9b9fSStefano Zampini }
6379566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T2));
638456288a8SStefano Zampini
6396280154eSStefano Zampini if (testnest) { /* test with MatNest */
6406280154eSStefano Zampini Mat NA;
6416280154eSStefano Zampini
6429566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 1, NULL, 1, NULL, &A, &NA));
6439566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(NA, NULL, "-NA_view"));
644fb842aefSJose E. Roman PetscCall(MatMatMult(NA, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &X));
6459566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
6469566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(NA, B, X, 10, &flg));
6476280154eSStefano Zampini if (!flg) {
6489566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Nest\n"));
649fb842aefSJose E. Roman PetscCall(MatMatMult(NA, B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
6509566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN));
6519566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
6529566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
6536280154eSStefano Zampini }
6549566063dSJacob Faibussowitsch PetscCall(MatDestroy(&NA));
6556280154eSStefano Zampini }
6566280154eSStefano Zampini
6576280154eSStefano Zampini if (testtranspose) { /* test with Transpose */
6586280154eSStefano Zampini Mat TA;
6596280154eSStefano Zampini
6609566063dSJacob Faibussowitsch PetscCall(MatCreateTranspose(A, &TA));
661fb842aefSJose E. Roman PetscCall(MatMatMult(TA, X, MAT_REUSE_MATRIX, PETSC_DETERMINE, &B));
6629566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
6639566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(TA, X, B, 10, &flg));
6646280154eSStefano Zampini if (!flg) {
6659566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Transpose\n"));
666fb842aefSJose E. Roman PetscCall(MatMatMult(TA, X, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
6679566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, B, SAME_NONZERO_PATTERN));
6689566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
6699566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
6706280154eSStefano Zampini }
6719566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TA));
6726280154eSStefano Zampini }
6736280154eSStefano Zampini
6743604c0aeSStefano Zampini if (testhtranspose) { /* test with Hermitian Transpose */
6753604c0aeSStefano Zampini Mat TA;
6763604c0aeSStefano Zampini
6779566063dSJacob Faibussowitsch PetscCall(MatCreateHermitianTranspose(A, &TA));
678fb842aefSJose E. Roman PetscCall(MatMatMult(TA, X, MAT_REUSE_MATRIX, PETSC_DETERMINE, &B));
6799566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
6809566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(TA, X, B, 10, &flg));
6813604c0aeSStefano Zampini if (!flg) {
6829566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Transpose\n"));
683fb842aefSJose E. Roman PetscCall(MatMatMult(TA, X, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
6849566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, B, SAME_NONZERO_PATTERN));
6859566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
6869566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
6873604c0aeSStefano Zampini }
6889566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TA));
6893604c0aeSStefano Zampini }
6903604c0aeSStefano Zampini
6916280154eSStefano Zampini if (testtt) { /* test with Transpose(Transpose) */
6926280154eSStefano Zampini Mat TA, TTA;
6936280154eSStefano Zampini
6949566063dSJacob Faibussowitsch PetscCall(MatCreateTranspose(A, &TA));
6959566063dSJacob Faibussowitsch PetscCall(MatCreateTranspose(TA, &TTA));
696fb842aefSJose E. Roman PetscCall(MatMatMult(TTA, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &X));
6979566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
6989566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(TTA, B, X, 10, &flg));
6996280154eSStefano Zampini if (!flg) {
7009566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Transpose(Transpose)\n"));
701fb842aefSJose E. Roman PetscCall(MatMatMult(TTA, B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
7029566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN));
7039566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
7049566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
7056280154eSStefano Zampini }
7069566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TA));
7079566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TTA));
7086280154eSStefano Zampini }
7096280154eSStefano Zampini
7106280154eSStefano Zampini if (testcircular) { /* test circular */
7116280154eSStefano Zampini Mat AB;
7126280154eSStefano Zampini
713fb842aefSJose E. Roman PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &AB));
714fb842aefSJose E. Roman PetscCall(MatMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DETERMINE, &X));
7159566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
7166280154eSStefano Zampini if (M == N && N == K) {
717fb842aefSJose E. Roman PetscCall(MatMatMult(A, X, MAT_REUSE_MATRIX, PETSC_DETERMINE, &B));
7186280154eSStefano Zampini } else {
719fb842aefSJose E. Roman PetscCall(MatTransposeMatMult(A, X, MAT_REUSE_MATRIX, PETSC_DETERMINE, &B));
7206280154eSStefano Zampini }
7219566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX));
7229566063dSJacob Faibussowitsch PetscCall(MatDestroy(&AB));
7236280154eSStefano Zampini }
7242b723ba2SStefano Zampini
7252b723ba2SStefano Zampini /* Test by Pierre Jolivet */
7262b723ba2SStefano Zampini {
7272b723ba2SStefano Zampini Mat C, D, D2, AtA;
7289566063dSJacob Faibussowitsch PetscCall(MatCreateNormal(A, &AtA));
7299566063dSJacob Faibussowitsch PetscCall(MatDuplicate(X, MAT_DO_NOT_COPY_VALUES, &C));
7309566063dSJacob Faibussowitsch PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &D));
7319566063dSJacob Faibussowitsch PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &D2));
7329566063dSJacob Faibussowitsch PetscCall(MatSetRandom(B, NULL));
7339566063dSJacob Faibussowitsch PetscCall(MatSetRandom(C, NULL));
7349566063dSJacob Faibussowitsch PetscCall(MatSetRandom(D, NULL));
7359566063dSJacob Faibussowitsch PetscCall(MatSetRandom(D2, NULL));
7369566063dSJacob Faibussowitsch PetscCall(MatProductCreateWithMat(A, B, NULL, C));
7379566063dSJacob Faibussowitsch PetscCall(MatProductSetType(C, MATPRODUCT_AB));
7389566063dSJacob Faibussowitsch PetscCall(MatProductSetFromOptions(C));
7399566063dSJacob Faibussowitsch PetscCall(MatProductSymbolic(C));
7409566063dSJacob Faibussowitsch PetscCall(MatProductCreateWithMat(A, C, NULL, D));
7419566063dSJacob Faibussowitsch PetscCall(MatProductSetType(D, MATPRODUCT_AtB));
7429566063dSJacob Faibussowitsch PetscCall(MatProductSetFromOptions(D));
7439566063dSJacob Faibussowitsch PetscCall(MatProductSymbolic(D));
7449566063dSJacob Faibussowitsch PetscCall(MatProductNumeric(C));
7453faff063SStefano Zampini PetscCall(MatMatMultEqual(A, B, C, 10, &flg));
7463faff063SStefano Zampini if (!flg) {
7473faff063SStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Normal (AB != C)\n"));
7483faff063SStefano Zampini PetscCall(MatView(A, NULL));
7493faff063SStefano Zampini PetscCall(MatView(B, NULL));
7503faff063SStefano Zampini PetscCall(MatView(C, NULL));
7513faff063SStefano Zampini }
7529566063dSJacob Faibussowitsch PetscCall(MatProductNumeric(D));
7539566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(AtA, B, D, 10, &flg));
7542b723ba2SStefano Zampini if (!flg) {
7553faff063SStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Normal (2)\n"));
756fb842aefSJose E. Roman PetscCall(MatMatMult(AtA, C, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &T));
7573faff063SStefano Zampini PetscCall(MatView(D, NULL));
7583faff063SStefano Zampini PetscCall(MatView(T, NULL));
7599566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, D, SAME_NONZERO_PATTERN));
7609566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL));
7619566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T));
7622b723ba2SStefano Zampini }
7639566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C));
7649566063dSJacob Faibussowitsch PetscCall(MatDestroy(&D));
7659566063dSJacob Faibussowitsch PetscCall(MatDestroy(&D2));
7669566063dSJacob Faibussowitsch PetscCall(MatDestroy(&AtA));
7672b723ba2SStefano Zampini }
7682b723ba2SStefano Zampini
7699566063dSJacob Faibussowitsch PetscCall(MatDestroy(&X));
7709566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Bt));
7719566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B));
7729566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A));
7739566063dSJacob Faibussowitsch PetscCall(MatDestroy(&R));
7749566063dSJacob Faibussowitsch PetscCall(MatDestroy(&PtAP));
7759566063dSJacob Faibussowitsch PetscCall(MatDestroy(&RARt));
7769566063dSJacob Faibussowitsch PetscCall(PetscFree(dataX));
7779566063dSJacob Faibussowitsch PetscCall(PetscFree(dataB));
7789566063dSJacob Faibussowitsch PetscCall(PetscFree(dataR));
7799566063dSJacob Faibussowitsch PetscCall(PetscFree(dataBt));
7809566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
781b122ec5aSJacob Faibussowitsch return 0;
7826280154eSStefano Zampini }
7836280154eSStefano Zampini
7846280154eSStefano Zampini /*TEST
7856280154eSStefano Zampini
7866280154eSStefano Zampini test:
7873886731fSPierre Jolivet output_file: output/empty.out
7886280154eSStefano Zampini suffix: 1
78975ab9b9fSStefano Zampini args: -local {{0 1}} -testshellops
7906280154eSStefano Zampini
7916280154eSStefano Zampini test:
7923886731fSPierre Jolivet output_file: output/empty.out
793456288a8SStefano Zampini requires: cuda
794456288a8SStefano Zampini suffix: 1_cuda
795686594dbSStefano Zampini args: -local {{0 1}} -xgpu {{0 1}} -bgpu {{0 1}} -A_mat_type {{seqaijcusparse seqaij}} -testshellops {{0 1}}
796456288a8SStefano Zampini
797456288a8SStefano Zampini test:
7983886731fSPierre Jolivet output_file: output/empty.out
7996280154eSStefano Zampini nsize: 2
8006280154eSStefano Zampini suffix: 1_par
80175ab9b9fSStefano Zampini args: -local {{0 1}} -testmatmatt 0
8026280154eSStefano Zampini
8036280154eSStefano Zampini test:
8043886731fSPierre Jolivet output_file: output/empty.out
805456288a8SStefano Zampini requires: cuda
806456288a8SStefano Zampini nsize: 2
807456288a8SStefano Zampini suffix: 1_par_cuda
808*1e2d28a0SPierre Jolivet args: -local {{0 1}} -xgpu {{0 1}} -bgpu {{0 1}} -A_mat_type {{mpiaijcusparse mpiaij}} -testnest 0 -testmatmatt 0 -matproduct_batch_size 3
809456288a8SStefano Zampini
810456288a8SStefano Zampini test:
8113886731fSPierre Jolivet output_file: output/empty.out
8126280154eSStefano Zampini suffix: 2
8136280154eSStefano Zampini nsize: 1
8146280154eSStefano Zampini args: -M {{7 11}} -N {{12 9}} -K {{1 3}} -local {{0 1}}
8156280154eSStefano Zampini
8168a311839SJunchao Zhang testset:
817456288a8SStefano Zampini requires: cuda
8183886731fSPierre Jolivet output_file: output/empty.out
819456288a8SStefano Zampini nsize: 1
820456288a8SStefano Zampini args: -M 7 -N 9 -K 2 -local {{0 1}} -testnest 0 -A_mat_type {{seqdensecuda seqdense}} -xgpu {{0 1}} -bgpu {{0 1}}
8218a311839SJunchao Zhang test:
8228a311839SJunchao Zhang requires: !complex
8238a311839SJunchao Zhang suffix: 2_cuda_real
8248a311839SJunchao Zhang test:
8258a311839SJunchao Zhang # complex+single gives a little bigger error in the MatDenseGetColumnVec test
8268a311839SJunchao Zhang requires: complex !single
8278a311839SJunchao Zhang suffix: 2_cuda_complex
828456288a8SStefano Zampini
829456288a8SStefano Zampini test:
8303886731fSPierre Jolivet output_file: output/empty.out
8316280154eSStefano Zampini suffix: 2_par
8326280154eSStefano Zampini nsize: 2
83375ab9b9fSStefano Zampini args: -M {{7 11}} -N {{12 9}} -K {{1 3}} -local {{0 1}} -testcircular -testmatmatt 0
8346280154eSStefano Zampini
8356280154eSStefano Zampini test:
836456288a8SStefano Zampini requires: cuda
8373886731fSPierre Jolivet output_file: output/empty.out
838456288a8SStefano Zampini suffix: 2_par_cuda
839456288a8SStefano Zampini nsize: 2
84075ab9b9fSStefano Zampini args: -M 11 -N 9 -K 1 -local {{0 1}} -testcircular 0 -A_mat_type mpiaijcusparse -xgpu -bgpu -testnest 0 -testmatmatt 0
841456288a8SStefano Zampini
842456288a8SStefano Zampini test:
8433886731fSPierre Jolivet output_file: output/empty.out
8446280154eSStefano Zampini suffix: 3
845456288a8SStefano Zampini nsize: {{1 3}}
84675ab9b9fSStefano Zampini args: -M 13 -N 13 -K {{1 3}} -local {{0 1}} -A_mat_type sbaij -symm -testproj 0 -testmatmatt 0
8476280154eSStefano Zampini
8486280154eSStefano Zampini test:
8493886731fSPierre Jolivet output_file: output/empty.out
8506280154eSStefano Zampini suffix: 4
8516280154eSStefano Zampini nsize: 1
8526280154eSStefano Zampini args: -M 3 -N 3 -K 3 -local {{0 1}} -testcircular
8536280154eSStefano Zampini
8546280154eSStefano Zampini test:
8553886731fSPierre Jolivet output_file: output/empty.out
8566280154eSStefano Zampini suffix: 5
8576280154eSStefano Zampini nsize: {{2 4}}
858a0638e9dSStefano Zampini args: -M 3 -N 3 -K 3 -local {{0 1}} -testcircular -testmatmatt 0
8596280154eSStefano Zampini
8606280154eSStefano Zampini test:
8613886731fSPierre Jolivet output_file: output/empty.out
8626280154eSStefano Zampini suffix: 6
8636280154eSStefano Zampini nsize: 1
86475ab9b9fSStefano Zampini args: -M {{1 3}} -N {{2 5}} -K {{1 2}} -local {{0 1}} -testcircular
8656280154eSStefano Zampini
8666280154eSStefano Zampini test:
8673886731fSPierre Jolivet output_file: output/empty.out
8686280154eSStefano Zampini suffix: 7
8696280154eSStefano Zampini nsize: 1
870456288a8SStefano Zampini args: -M 13 -N 13 -K {{1 3}} -local {{0 1}} -A_mat_type dense -testnest -testcircular
8716718818eSStefano Zampini
8726280154eSStefano Zampini TEST*/
873