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 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); 42*3ba16761SJacob 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 51d71ae5a4SJacob Faibussowitsch PetscErrorCode proj_destroy(void *ctx) 52d71ae5a4SJacob Faibussowitsch { 5375ab9b9fSStefano Zampini 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)); 61*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6275ab9b9fSStefano Zampini } 6375ab9b9fSStefano Zampini 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)); 105*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10675ab9b9fSStefano Zampini } 10775ab9b9fSStefano Zampini 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; 116*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11775ab9b9fSStefano Zampini } 11875ab9b9fSStefano Zampini 119d71ae5a4SJacob Faibussowitsch PetscErrorCode MyPtShellPMultNumeric(Mat S, Mat P, Mat PtAP, void *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; 1339566063dSJacob Faibussowitsch PetscCall(MatShellSetOperation(PtAP, MATOP_MULT, (void (*)(void))proj_mult)); 1349566063dSJacob Faibussowitsch PetscCall(MatSetUp(PtAP)); 1359566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(PtAP, MAT_FINAL_ASSEMBLY)); 1369566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(PtAP, MAT_FINAL_ASSEMBLY)); 137*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13875ab9b9fSStefano Zampini } 13975ab9b9fSStefano Zampini 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; 148*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 14975ab9b9fSStefano Zampini } 15075ab9b9fSStefano Zampini 151d71ae5a4SJacob Faibussowitsch PetscErrorCode MyRShellRtMultNumeric(Mat S, Mat R, Mat RARt, void *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; 1659566063dSJacob Faibussowitsch PetscCall(MatShellSetOperation(RARt, MATOP_MULT, (void (*)(void))proj_mult)); 1669566063dSJacob Faibussowitsch PetscCall(MatSetUp(RARt)); 1679566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(RARt, MAT_FINAL_ASSEMBLY)); 1689566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(RARt, MAT_FINAL_ASSEMBLY)); 169*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 17075ab9b9fSStefano Zampini } 17175ab9b9fSStefano Zampini 172d71ae5a4SJacob Faibussowitsch PetscErrorCode MyMatShellMatMultNumeric(Mat S, Mat B, Mat C, void *ctx) 173d71ae5a4SJacob Faibussowitsch { 17475ab9b9fSStefano Zampini Mat A; 17575ab9b9fSStefano Zampini 17675ab9b9fSStefano Zampini PetscFunctionBegin; 1779566063dSJacob Faibussowitsch PetscCall(MatShellGetContext(S, &A)); 1789566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &C)); 179*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 18075ab9b9fSStefano Zampini } 18175ab9b9fSStefano Zampini 182d71ae5a4SJacob Faibussowitsch PetscErrorCode MyMatTransposeShellMatMultNumeric(Mat S, Mat B, Mat C, void *ctx) 183d71ae5a4SJacob Faibussowitsch { 18475ab9b9fSStefano Zampini Mat A; 18575ab9b9fSStefano Zampini 18675ab9b9fSStefano Zampini PetscFunctionBegin; 1879566063dSJacob Faibussowitsch PetscCall(MatShellGetContext(S, &A)); 1889566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &C)); 189*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19075ab9b9fSStefano Zampini } 19175ab9b9fSStefano Zampini 192d71ae5a4SJacob Faibussowitsch PetscErrorCode MyMatShellMatTransposeMultNumeric(Mat S, Mat B, Mat C, void *ctx) 193d71ae5a4SJacob Faibussowitsch { 19475ab9b9fSStefano Zampini Mat A; 19575ab9b9fSStefano Zampini 19675ab9b9fSStefano Zampini PetscFunctionBegin; 1979566063dSJacob Faibussowitsch PetscCall(MatShellGetContext(S, &A)); 1989566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMult(A, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &C)); 199*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2006280154eSStefano Zampini } 2016280154eSStefano Zampini 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)); 2439566063dSJacob Faibussowitsch PetscCall(MatSetUp(A)); 2449566063dSJacob Faibussowitsch PetscCall(MatSetRandom(A, NULL)); 2456280154eSStefano Zampini if (M == N && symm) { 2466280154eSStefano Zampini Mat AT; 2476280154eSStefano Zampini 2489566063dSJacob Faibussowitsch PetscCall(MatTranspose(A, MAT_INITIAL_MATRIX, &AT)); 2499566063dSJacob Faibussowitsch PetscCall(MatAXPY(A, 1.0, AT, DIFFERENT_NONZERO_PATTERN)); 2509566063dSJacob Faibussowitsch PetscCall(MatDestroy(&AT)); 2519566063dSJacob Faibussowitsch PetscCall(MatSetOption(A, MAT_SYMMETRIC, PETSC_TRUE)); 2526280154eSStefano Zampini } 2539566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(A, NULL, "-A_init_view")); 254d0609cedSBarry Smith PetscOptionsBegin(PETSC_COMM_WORLD, "", "", ""); 2559566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-A_mat_type", "Matrix type", "MatSetType", MatList, deft, mattype, 256, &flg)); 256d0609cedSBarry Smith PetscOptionsEnd(); 2576280154eSStefano Zampini if (flg) { 2586280154eSStefano Zampini Mat A2; 2596280154eSStefano Zampini 2609566063dSJacob Faibussowitsch PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &A2)); 2619566063dSJacob Faibussowitsch PetscCall(MatConvert(A, mattype, MAT_INPLACE_MATRIX, &A)); 2629566063dSJacob Faibussowitsch PetscCall(MatMultEqual(A, A2, 10, &flg)); 2636280154eSStefano Zampini if (!flg) { 2646280154eSStefano Zampini Mat AE, A2E; 2656280154eSStefano Zampini 2669566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with convert\n")); 2679566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(A, MATDENSE, &AE)); 2689566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(A2, MATDENSE, &A2E)); 2699566063dSJacob Faibussowitsch PetscCall(MatView(AE, NULL)); 2709566063dSJacob Faibussowitsch PetscCall(MatView(A2E, NULL)); 2719566063dSJacob Faibussowitsch PetscCall(MatAXPY(A2E, -1.0, A, SAME_NONZERO_PATTERN)); 2729566063dSJacob Faibussowitsch PetscCall(MatView(A2E, NULL)); 2739566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A2E)); 2749566063dSJacob Faibussowitsch PetscCall(MatDestroy(&AE)); 2756280154eSStefano Zampini } 2769566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A2)); 2776280154eSStefano Zampini } 2789566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(A, NULL, "-A_view")); 2796280154eSStefano Zampini 2809566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(A, &m, &n)); 2816280154eSStefano Zampini if (local) { 28275ab9b9fSStefano Zampini PetscInt i; 28375ab9b9fSStefano Zampini 2849566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((m + ldx) * K, &dataX)); 2859566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((n + ldb) * K, &dataB)); 286a0638e9dSStefano Zampini for (i = 0; i < (m + ldx) * K; i++) dataX[i] = MAGIC_NUMBER; 287a0638e9dSStefano Zampini for (i = 0; i < (n + ldb) * K; i++) dataB[i] = MAGIC_NUMBER; 2886280154eSStefano Zampini } 2899566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PETSC_COMM_WORLD, n, PETSC_DECIDE, N, K, dataB, &B)); 2909566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PETSC_COMM_WORLD, m, PETSC_DECIDE, M, K, dataX, &X)); 29175ab9b9fSStefano Zampini if (local) { 2929566063dSJacob Faibussowitsch PetscCall(MatDenseSetLDA(X, m + ldx)); 2939566063dSJacob Faibussowitsch PetscCall(MatDenseSetLDA(B, n + ldb)); 29475ab9b9fSStefano Zampini } 2959566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(B, NULL, &k)); 29675ab9b9fSStefano Zampini if (local) { 29775ab9b9fSStefano Zampini PetscInt i; 29875ab9b9fSStefano Zampini 2999566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((k + ldr) * N, &dataBt)); 300a0638e9dSStefano Zampini for (i = 0; i < (k + ldr) * N; i++) dataBt[i] = MAGIC_NUMBER; 30175ab9b9fSStefano Zampini } 3029566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PETSC_COMM_WORLD, k, n, K, N, dataBt, &Bt)); 3031baa6e33SBarry Smith if (local) PetscCall(MatDenseSetLDA(Bt, k + ldr)); 3046280154eSStefano Zampini 3056280154eSStefano Zampini /* store pointer to dense data for testing */ 3069566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(B, (const PetscScalar **)&dataB)); 3079566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(X, (const PetscScalar **)&dataX)); 3089566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(Bt, (const PetscScalar **)&dataBt)); 3096280154eSStefano Zampini aX = dataX; 3106280154eSStefano Zampini aB = dataB; 31175ab9b9fSStefano Zampini aBt = dataBt; 3129566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(Bt, (const PetscScalar **)&dataBt)); 3139566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(B, (const PetscScalar **)&dataB)); 3149566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(X, (const PetscScalar **)&dataX)); 3156280154eSStefano Zampini if (local) { 3166280154eSStefano Zampini dataX = aX; 3176280154eSStefano Zampini dataB = aB; 31875ab9b9fSStefano Zampini dataBt = aBt; 3196280154eSStefano Zampini } 32075ab9b9fSStefano Zampini 3219566063dSJacob Faibussowitsch PetscCall(MatSetRandom(X, NULL)); 3229566063dSJacob Faibussowitsch PetscCall(MatSetRandom(B, NULL)); 3239566063dSJacob Faibussowitsch PetscCall(MatSetRandom(Bt, NULL)); 3249566063dSJacob Faibussowitsch PetscCall(CheckLocal(X, NULL, aX, NULL)); 3259566063dSJacob Faibussowitsch PetscCall(CheckLocal(Bt, B, aBt, aB)); 32675ab9b9fSStefano Zampini 327456288a8SStefano Zampini /* convert to CUDA if needed */ 328456288a8SStefano Zampini if (bgpu) { 3299566063dSJacob Faibussowitsch PetscCall(MatConvert(B, MATDENSECUDA, MAT_INPLACE_MATRIX, &B)); 3309566063dSJacob Faibussowitsch PetscCall(MatConvert(Bt, MATDENSECUDA, MAT_INPLACE_MATRIX, &Bt)); 331456288a8SStefano Zampini } 33248a46eb9SPierre Jolivet if (xgpu) PetscCall(MatConvert(X, MATDENSECUDA, MAT_INPLACE_MATRIX, &X)); 3339566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 3346280154eSStefano Zampini 335e7b38fdfSStefano Zampini /* Test MatDenseGetSubMatrix */ 336e7b38fdfSStefano Zampini { 337e7b38fdfSStefano Zampini Mat B2, T3, T4; 338e7b38fdfSStefano Zampini 3399566063dSJacob Faibussowitsch PetscCall(MatDuplicate(B, MAT_COPY_VALUES, &B2)); 3409566063dSJacob Faibussowitsch PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &T4)); 3419566063dSJacob Faibussowitsch PetscCall(MatSetRandom(T4, NULL)); 3429566063dSJacob Faibussowitsch PetscCall(MatAXPY(B2, 1.0, T4, SAME_NONZERO_PATTERN)); 343a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B, PETSC_DECIDE, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T)); 344a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(T4, PETSC_DECIDE, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T2)); 345a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B2, PETSC_DECIDE, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T3)); 3469566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, 1.0, T2, SAME_NONZERO_PATTERN)); 3479566063dSJacob Faibussowitsch PetscCall(MatAXPY(T3, -1.0, T, SAME_NONZERO_PATTERN)); 3489566063dSJacob Faibussowitsch PetscCall(MatNorm(T3, NORM_FROBENIUS, &err)); 349e7b38fdfSStefano Zampini if (err > PETSC_SMALL) { 3509566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetSubMatrix\n")); 3519566063dSJacob Faibussowitsch PetscCall(MatView(T3, NULL)); 352e7b38fdfSStefano Zampini } 3539566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreSubMatrix(B, &T)); 3549566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreSubMatrix(T4, &T2)); 3559566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreSubMatrix(B2, &T3)); 3569566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, NULL, aB, NULL)); 3579566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B2)); 3589566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T4)); 359a2748737SPierre Jolivet if (N >= 2) { 360a2748737SPierre Jolivet PetscCall(MatDuplicate(B, MAT_COPY_VALUES, &B2)); 361a2748737SPierre Jolivet PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &T4)); 362a2748737SPierre Jolivet PetscCall(MatSetRandom(T4, NULL)); 363a2748737SPierre Jolivet PetscCall(MatAXPY(B2, 1.0, T4, SAME_NONZERO_PATTERN)); 364a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B, N - 2, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T)); 365a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(T4, N - 2, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T2)); 366a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B2, N - 2, PETSC_DECIDE, PetscMin(1, K - 1), PetscMin(2, K), &T3)); 367a2748737SPierre Jolivet PetscCall(MatAXPY(T, 1.0, T2, SAME_NONZERO_PATTERN)); 368a2748737SPierre Jolivet PetscCall(MatAXPY(T3, -1.0, T, SAME_NONZERO_PATTERN)); 369a2748737SPierre Jolivet PetscCall(MatNorm(T3, NORM_FROBENIUS, &err)); 370a2748737SPierre Jolivet if (err > PETSC_SMALL) { 371a2748737SPierre Jolivet PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetSubMatrix\n")); 372a2748737SPierre Jolivet PetscCall(MatView(T3, NULL)); 373a2748737SPierre Jolivet } 374a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(B, &T)); 375a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(T4, &T2)); 376a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(B2, &T3)); 377a2748737SPierre Jolivet PetscCall(CheckLocal(B, NULL, aB, NULL)); 378a2748737SPierre Jolivet PetscCall(MatDestroy(&B2)); 379a2748737SPierre Jolivet PetscCall(MatDestroy(&T4)); 380a2748737SPierre Jolivet PetscCall(MatDuplicate(B, MAT_COPY_VALUES, &B2)); 381a2748737SPierre Jolivet PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &T4)); 382a2748737SPierre Jolivet PetscCall(MatSetRandom(T4, NULL)); 383a2748737SPierre Jolivet PetscCall(MatAXPY(B2, 1.0, T4, SAME_NONZERO_PATTERN)); 384a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B, PETSC_DECIDE, 2, PetscMin(1, K - 1), PetscMin(2, K), &T)); 385a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(T4, PETSC_DECIDE, 2, PetscMin(1, K - 1), PetscMin(2, K), &T2)); 386a2748737SPierre Jolivet PetscCall(MatDenseGetSubMatrix(B2, PETSC_DECIDE, 2, PetscMin(1, K - 1), PetscMin(2, K), &T3)); 387a2748737SPierre Jolivet PetscCall(MatAXPY(T, 1.0, T2, SAME_NONZERO_PATTERN)); 388a2748737SPierre Jolivet PetscCall(MatAXPY(T3, -1.0, T, SAME_NONZERO_PATTERN)); 389a2748737SPierre Jolivet PetscCall(MatNorm(T3, NORM_FROBENIUS, &err)); 390a2748737SPierre Jolivet if (err > PETSC_SMALL) { 391a2748737SPierre Jolivet PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetSubMatrix\n")); 392a2748737SPierre Jolivet PetscCall(MatView(T3, NULL)); 393a2748737SPierre Jolivet } 394a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(B, &T)); 395a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(T4, &T2)); 396a2748737SPierre Jolivet PetscCall(MatDenseRestoreSubMatrix(B2, &T3)); 397a2748737SPierre Jolivet PetscCall(CheckLocal(B, NULL, aB, NULL)); 398a2748737SPierre Jolivet PetscCall(MatDestroy(&B2)); 399a2748737SPierre Jolivet PetscCall(MatDestroy(&T4)); 400a2748737SPierre Jolivet } 401e7b38fdfSStefano Zampini } 402e7b38fdfSStefano Zampini 4036280154eSStefano Zampini /* Test reusing a previously allocated dense buffer */ 4049566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &X)); 4059566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 4069566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(A, B, X, 10, &flg)); 4076280154eSStefano Zampini if (!flg) { 4089566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage\n")); 4099566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 4109566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN)); 4119566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 4129566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 4136280154eSStefano Zampini } 4146280154eSStefano Zampini 41575ab9b9fSStefano Zampini /* Test MatTransposeMat and MatMatTranspose */ 41675ab9b9fSStefano Zampini if (testmattmat) { 4179566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMult(A, X, MAT_REUSE_MATRIX, PETSC_DEFAULT, &B)); 4189566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 4199566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMultEqual(A, X, B, 10, &flg)); 42075ab9b9fSStefano Zampini if (!flg) { 4219566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MatTransposeMat)\n")); 4229566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMult(A, X, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &B)); 4239566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, B, SAME_NONZERO_PATTERN)); 4249566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 4259566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 42675ab9b9fSStefano Zampini } 42775ab9b9fSStefano Zampini } 42875ab9b9fSStefano Zampini if (testmatmatt) { 4299566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMult(A, Bt, MAT_REUSE_MATRIX, PETSC_DEFAULT, &X)); 4309566063dSJacob Faibussowitsch PetscCall(CheckLocal(Bt, X, aBt, aX)); 4319566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMultEqual(A, Bt, X, 10, &flg)); 43275ab9b9fSStefano Zampini if (!flg) { 4339566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MatMatTranspose)\n")); 4349566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMult(A, Bt, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 4359566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN)); 4369566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 4379566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 43875ab9b9fSStefano Zampini } 43975ab9b9fSStefano Zampini } 44075ab9b9fSStefano Zampini 44175ab9b9fSStefano Zampini /* Test projection operations (PtAP and RARt) */ 44275ab9b9fSStefano Zampini if (testproj) { 4439566063dSJacob Faibussowitsch PetscCall(MatPtAP(A, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &PtAP)); 4449566063dSJacob Faibussowitsch PetscCall(MatPtAPMultEqual(A, B, PtAP, 10, &flg)); 44575ab9b9fSStefano Zampini if (!flg) { 4469566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with PtAP\n")); 4479566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 4489566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMult(B, T, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T2)); 4499566063dSJacob Faibussowitsch PetscCall(MatAXPY(T2, -1.0, PtAP, SAME_NONZERO_PATTERN)); 4509566063dSJacob Faibussowitsch PetscCall(MatView(T2, NULL)); 4519566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T2)); 4529566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 45375ab9b9fSStefano Zampini } 4549566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((k + ldr) * M, &dataR)); 4559566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PETSC_COMM_WORLD, PETSC_DECIDE, m, K, M, dataR, &R)); 4569566063dSJacob Faibussowitsch PetscCall(MatDenseSetLDA(R, k + ldr)); 4579566063dSJacob Faibussowitsch PetscCall(MatSetRandom(R, NULL)); 45875ab9b9fSStefano Zampini if (testrart) { /* fails for AIJCUSPARSE because RA operation is not defined */ 4599566063dSJacob Faibussowitsch PetscCall(MatRARt(A, R, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &RARt)); 4609566063dSJacob Faibussowitsch PetscCall(MatRARtMultEqual(A, R, RARt, 10, &flg)); 46175ab9b9fSStefano Zampini if (!flg) { 4629566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with RARt\n")); 4639566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMult(A, R, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 4649566063dSJacob Faibussowitsch PetscCall(MatMatMult(R, T, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T2)); 4659566063dSJacob Faibussowitsch PetscCall(MatAXPY(T2, -1.0, RARt, SAME_NONZERO_PATTERN)); 4669566063dSJacob Faibussowitsch PetscCall(MatView(T2, NULL)); 4679566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T2)); 4689566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 46975ab9b9fSStefano Zampini } 47075ab9b9fSStefano Zampini } 47175ab9b9fSStefano Zampini } 47275ab9b9fSStefano Zampini 473456288a8SStefano Zampini /* Test MatDenseGetColumnVec and friends */ 4749566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &X)); 4759566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 4769566063dSJacob Faibussowitsch PetscCall(MatDuplicate(T, MAT_DO_NOT_COPY_VALUES, &T2)); 477456288a8SStefano Zampini for (k = 0; k < K; k++) { 478456288a8SStefano Zampini Vec Xv, Tv, T2v; 479456288a8SStefano Zampini 4809566063dSJacob Faibussowitsch PetscCall(MatDenseGetColumnVecRead(X, k, &Xv)); 4819566063dSJacob Faibussowitsch PetscCall(MatDenseGetColumnVec(T, k, &Tv)); 4829566063dSJacob Faibussowitsch PetscCall(MatDenseGetColumnVecWrite(T2, k, &T2v)); 4839566063dSJacob Faibussowitsch PetscCall(VecCopy(Xv, T2v)); 4849566063dSJacob Faibussowitsch PetscCall(VecAXPY(Tv, -1., Xv)); 4859566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreColumnVecRead(X, k, &Xv)); 4869566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreColumnVec(T, k, &Tv)); 4879566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreColumnVecWrite(T2, k, &T2v)); 488456288a8SStefano Zampini } 4899566063dSJacob Faibussowitsch PetscCall(MatNorm(T, NORM_FROBENIUS, &err)); 490456288a8SStefano Zampini if (err > PETSC_SMALL) { 4919566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetColumnVec\n")); 4929566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 493456288a8SStefano Zampini } 4949566063dSJacob Faibussowitsch PetscCall(MatAXPY(T2, -1., X, SAME_NONZERO_PATTERN)); 4959566063dSJacob Faibussowitsch PetscCall(MatNorm(T2, NORM_FROBENIUS, &err)); 496456288a8SStefano Zampini if (err > PETSC_SMALL) { 4979566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MatDenseGetColumnVecWrite\n")); 4989566063dSJacob Faibussowitsch PetscCall(MatView(T2, NULL)); 499456288a8SStefano Zampini } 5009566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 5019566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T2)); 502456288a8SStefano Zampini 503456288a8SStefano Zampini /* Test with MatShell */ 5049566063dSJacob Faibussowitsch PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &T)); 5059566063dSJacob Faibussowitsch PetscCall(MatConvert(T, MATSHELL, MAT_INITIAL_MATRIX, &T2)); 5069566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 50775ab9b9fSStefano Zampini 50875ab9b9fSStefano Zampini /* scale matrix */ 5099566063dSJacob Faibussowitsch PetscCall(MatScale(A, 2.0)); 5109566063dSJacob Faibussowitsch PetscCall(MatScale(T2, 2.0)); 5119566063dSJacob Faibussowitsch PetscCall(MatCreateVecs(A, &r, &l)); 5129566063dSJacob Faibussowitsch PetscCall(VecSetRandom(r, NULL)); 5139566063dSJacob Faibussowitsch PetscCall(VecSetRandom(l, NULL)); 5149566063dSJacob Faibussowitsch PetscCall(MatCreateVecs(T2, &rs, &ls)); 5159566063dSJacob Faibussowitsch PetscCall(VecCopy(r, rs)); 5169566063dSJacob Faibussowitsch PetscCall(VecCopy(l, ls)); 51775ab9b9fSStefano Zampini if (testproj) { 5189566063dSJacob Faibussowitsch PetscCall(MatDiagonalScale(A, r, r)); 5199566063dSJacob Faibussowitsch PetscCall(MatDiagonalScale(T2, rs, rs)); 52075ab9b9fSStefano Zampini } else { 5219566063dSJacob Faibussowitsch PetscCall(MatDiagonalScale(A, l, r)); 5229566063dSJacob Faibussowitsch PetscCall(MatDiagonalScale(T2, ls, rs)); 52375ab9b9fSStefano Zampini } 5249566063dSJacob Faibussowitsch PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &T)); 5259566063dSJacob Faibussowitsch PetscCall(MatAXPY(A, 4.5, T, SAME_NONZERO_PATTERN)); 5269566063dSJacob Faibussowitsch PetscCall(MatAXPY(T2, 4.5, T, DIFFERENT_NONZERO_PATTERN)); 5279566063dSJacob Faibussowitsch PetscCall(MatMultEqual(T2, A, 10, &flg)); 52848a46eb9SPierre Jolivet if (!flg) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MATSHELL (MatMult)\n")); 5299566063dSJacob Faibussowitsch PetscCall(MatMultTransposeEqual(T2, A, 10, &flg)); 53048a46eb9SPierre Jolivet if (!flg) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with MATSHELL (MatMultTranspose)\n")); 5319566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 5329566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ls)); 5339566063dSJacob Faibussowitsch PetscCall(VecDestroy(&rs)); 5349566063dSJacob Faibussowitsch PetscCall(VecDestroy(&l)); 5359566063dSJacob Faibussowitsch PetscCall(VecDestroy(&r)); 53675ab9b9fSStefano Zampini 53775ab9b9fSStefano Zampini /* recompute projections, test reusage */ 5389566063dSJacob Faibussowitsch if (PtAP) PetscCall(MatPtAP(A, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &PtAP)); 5399566063dSJacob Faibussowitsch if (RARt) PetscCall(MatRARt(A, R, MAT_REUSE_MATRIX, PETSC_DEFAULT, &RARt)); 54075ab9b9fSStefano Zampini if (testshellops) { /* test callbacks for user defined MatProducts */ 5419566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_AB, NULL, MyMatShellMatMultNumeric, NULL, MATDENSE, MATDENSE)); 5429566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_AB, NULL, MyMatShellMatMultNumeric, NULL, MATDENSECUDA, MATDENSECUDA)); 5439566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_AtB, NULL, MyMatTransposeShellMatMultNumeric, NULL, MATDENSE, MATDENSE)); 5449566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_AtB, NULL, MyMatTransposeShellMatMultNumeric, NULL, MATDENSECUDA, MATDENSECUDA)); 5459566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_ABt, NULL, MyMatShellMatTransposeMultNumeric, NULL, MATDENSE, MATDENSE)); 5469566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_ABt, NULL, MyMatShellMatTransposeMultNumeric, NULL, MATDENSECUDA, MATDENSECUDA)); 54775ab9b9fSStefano Zampini if (testproj) { 5489566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_PtAP, MyPtShellPMultSymbolic, MyPtShellPMultNumeric, proj_destroy, MATDENSE, MATSHELL)); 5499566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_PtAP, MyPtShellPMultSymbolic, MyPtShellPMultNumeric, proj_destroy, MATDENSECUDA, MATSHELL)); 5509566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_RARt, MyRShellRtMultSymbolic, MyRShellRtMultNumeric, proj_destroy, MATDENSE, MATSHELL)); 5519566063dSJacob Faibussowitsch PetscCall(MatShellSetMatProductOperation(T2, MATPRODUCT_RARt, MyRShellRtMultSymbolic, MyRShellRtMultNumeric, proj_destroy, MATDENSECUDA, MATSHELL)); 55275ab9b9fSStefano Zampini } 55375ab9b9fSStefano Zampini } 5549566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 55575ab9b9fSStefano Zampini /* we either use the shell operations or the loop over columns code, applying the operator */ 5569566063dSJacob Faibussowitsch PetscCall(MatMatMult(T2, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &X)); 5579566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 5589566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(T2, B, X, 10, &flg)); 559456288a8SStefano Zampini if (!flg) { 5609566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MATSHELL)\n")); 5619566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 5629566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN)); 5639566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 5649566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 565456288a8SStefano Zampini } 56675ab9b9fSStefano Zampini if (testproj) { 5679566063dSJacob Faibussowitsch PetscCall(MatPtAPMultEqual(T2, B, PtAP, 10, &flg)); 56848a46eb9SPierre Jolivet if (!flg) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with PtAP (MATSHELL)\n")); 56975ab9b9fSStefano Zampini if (testshellops) { /* projections fail if the product operations are not specified */ 5709566063dSJacob Faibussowitsch PetscCall(MatPtAP(T2, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 5719566063dSJacob Faibussowitsch PetscCall(MatPtAP(T2, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &T)); 5729566063dSJacob Faibussowitsch PetscCall(MatPtAPMultEqual(T2, B, T, 10, &flg)); 57375ab9b9fSStefano Zampini if (!flg) { 57475ab9b9fSStefano Zampini Mat TE; 5756718818eSStefano Zampini 5769566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with PtAP (MATSHELL user defined)\n")); 5779566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(T, MATDENSE, &TE)); 5789566063dSJacob Faibussowitsch PetscCall(MatView(TE, NULL)); 5799566063dSJacob Faibussowitsch PetscCall(MatView(PtAP, NULL)); 5809566063dSJacob Faibussowitsch PetscCall(MatAXPY(TE, -1.0, PtAP, SAME_NONZERO_PATTERN)); 5819566063dSJacob Faibussowitsch PetscCall(MatView(TE, NULL)); 5829566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TE)); 58375ab9b9fSStefano Zampini } 5849566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 58575ab9b9fSStefano Zampini } 58675ab9b9fSStefano Zampini if (RARt) { 5879566063dSJacob Faibussowitsch PetscCall(MatRARtMultEqual(T2, R, RARt, 10, &flg)); 58848a46eb9SPierre Jolivet if (!flg) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with RARt (MATSHELL)\n")); 58975ab9b9fSStefano Zampini } 59075ab9b9fSStefano Zampini if (testshellops) { 5919566063dSJacob Faibussowitsch PetscCall(MatRARt(T2, R, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 5929566063dSJacob Faibussowitsch PetscCall(MatRARt(T2, R, MAT_REUSE_MATRIX, PETSC_DEFAULT, &T)); 5939566063dSJacob Faibussowitsch PetscCall(MatRARtMultEqual(T2, R, T, 10, &flg)); 59475ab9b9fSStefano Zampini if (!flg) { 59575ab9b9fSStefano Zampini Mat TE; 59675ab9b9fSStefano Zampini 5979566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with RARt (MATSHELL user defined)\n")); 5989566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(T, MATDENSE, &TE)); 5999566063dSJacob Faibussowitsch PetscCall(MatView(TE, NULL)); 60075ab9b9fSStefano Zampini if (RARt) { 6019566063dSJacob Faibussowitsch PetscCall(MatView(RARt, NULL)); 6029566063dSJacob Faibussowitsch PetscCall(MatAXPY(TE, -1.0, RARt, SAME_NONZERO_PATTERN)); 6039566063dSJacob Faibussowitsch PetscCall(MatView(TE, NULL)); 60475ab9b9fSStefano Zampini } 6059566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TE)); 60675ab9b9fSStefano Zampini } 6079566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 60875ab9b9fSStefano Zampini } 60975ab9b9fSStefano Zampini } 61075ab9b9fSStefano Zampini 61175ab9b9fSStefano Zampini if (testmattmat) { /* we either use the shell operations or the loop over columns code applying the transposed operator */ 6129566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMult(T2, X, MAT_REUSE_MATRIX, PETSC_DEFAULT, &B)); 6139566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 6149566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMultEqual(T2, X, B, 10, &flg)); 615456288a8SStefano Zampini if (!flg) { 6169566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MatTranspose, MATSHELL)\n")); 6179566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMult(A, X, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 6189566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, B, SAME_NONZERO_PATTERN)); 6199566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 6209566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 6216718818eSStefano Zampini } 622456288a8SStefano Zampini } 62375ab9b9fSStefano Zampini if (testmatmatt && testshellops) { /* only when shell operations are set */ 6249566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMult(T2, Bt, MAT_REUSE_MATRIX, PETSC_DEFAULT, &X)); 6259566063dSJacob Faibussowitsch PetscCall(CheckLocal(Bt, X, aBt, aX)); 6269566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMultEqual(T2, Bt, X, 10, &flg)); 62775ab9b9fSStefano Zampini if (!flg) { 6289566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with reusage (MatMatTranspose, MATSHELL)\n")); 6299566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMult(A, Bt, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 6309566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN)); 6319566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 6329566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 63375ab9b9fSStefano Zampini } 63475ab9b9fSStefano Zampini } 6359566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T2)); 636456288a8SStefano Zampini 6376280154eSStefano Zampini if (testnest) { /* test with MatNest */ 6386280154eSStefano Zampini Mat NA; 6396280154eSStefano Zampini 6409566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 1, NULL, 1, NULL, &A, &NA)); 6419566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(NA, NULL, "-NA_view")); 6429566063dSJacob Faibussowitsch PetscCall(MatMatMult(NA, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &X)); 6439566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 6449566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(NA, B, X, 10, &flg)); 6456280154eSStefano Zampini if (!flg) { 6469566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Nest\n")); 6479566063dSJacob Faibussowitsch PetscCall(MatMatMult(NA, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 6489566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN)); 6499566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 6509566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 6516280154eSStefano Zampini } 6529566063dSJacob Faibussowitsch PetscCall(MatDestroy(&NA)); 6536280154eSStefano Zampini } 6546280154eSStefano Zampini 6556280154eSStefano Zampini if (testtranspose) { /* test with Transpose */ 6566280154eSStefano Zampini Mat TA; 6576280154eSStefano Zampini 6589566063dSJacob Faibussowitsch PetscCall(MatCreateTranspose(A, &TA)); 6599566063dSJacob Faibussowitsch PetscCall(MatMatMult(TA, X, MAT_REUSE_MATRIX, PETSC_DEFAULT, &B)); 6609566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 6619566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(TA, X, B, 10, &flg)); 6626280154eSStefano Zampini if (!flg) { 6639566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Transpose\n")); 6649566063dSJacob Faibussowitsch PetscCall(MatMatMult(TA, X, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 6659566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, B, SAME_NONZERO_PATTERN)); 6669566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 6679566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 6686280154eSStefano Zampini } 6699566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TA)); 6706280154eSStefano Zampini } 6716280154eSStefano Zampini 6723604c0aeSStefano Zampini if (testhtranspose) { /* test with Hermitian Transpose */ 6733604c0aeSStefano Zampini Mat TA; 6743604c0aeSStefano Zampini 6759566063dSJacob Faibussowitsch PetscCall(MatCreateHermitianTranspose(A, &TA)); 6769566063dSJacob Faibussowitsch PetscCall(MatMatMult(TA, X, MAT_REUSE_MATRIX, PETSC_DEFAULT, &B)); 6779566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 6789566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(TA, X, B, 10, &flg)); 6793604c0aeSStefano Zampini if (!flg) { 6809566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Transpose\n")); 6819566063dSJacob Faibussowitsch PetscCall(MatMatMult(TA, X, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 6829566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, B, SAME_NONZERO_PATTERN)); 6839566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 6849566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 6853604c0aeSStefano Zampini } 6869566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TA)); 6873604c0aeSStefano Zampini } 6883604c0aeSStefano Zampini 6896280154eSStefano Zampini if (testtt) { /* test with Transpose(Transpose) */ 6906280154eSStefano Zampini Mat TA, TTA; 6916280154eSStefano Zampini 6929566063dSJacob Faibussowitsch PetscCall(MatCreateTranspose(A, &TA)); 6939566063dSJacob Faibussowitsch PetscCall(MatCreateTranspose(TA, &TTA)); 6949566063dSJacob Faibussowitsch PetscCall(MatMatMult(TTA, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &X)); 6959566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 6969566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(TTA, B, X, 10, &flg)); 6976280154eSStefano Zampini if (!flg) { 6989566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Transpose(Transpose)\n")); 6999566063dSJacob Faibussowitsch PetscCall(MatMatMult(TTA, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 7009566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, X, SAME_NONZERO_PATTERN)); 7019566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 7029566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 7036280154eSStefano Zampini } 7049566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TA)); 7059566063dSJacob Faibussowitsch PetscCall(MatDestroy(&TTA)); 7066280154eSStefano Zampini } 7076280154eSStefano Zampini 7086280154eSStefano Zampini if (testcircular) { /* test circular */ 7096280154eSStefano Zampini Mat AB; 7106280154eSStefano Zampini 7119566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &AB)); 7129566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &X)); 7139566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 7146280154eSStefano Zampini if (M == N && N == K) { 7159566063dSJacob Faibussowitsch PetscCall(MatMatMult(A, X, MAT_REUSE_MATRIX, PETSC_DEFAULT, &B)); 7166280154eSStefano Zampini } else { 7179566063dSJacob Faibussowitsch PetscCall(MatTransposeMatMult(A, X, MAT_REUSE_MATRIX, PETSC_DEFAULT, &B)); 7186280154eSStefano Zampini } 7199566063dSJacob Faibussowitsch PetscCall(CheckLocal(B, X, aB, aX)); 7209566063dSJacob Faibussowitsch PetscCall(MatDestroy(&AB)); 7216280154eSStefano Zampini } 7222b723ba2SStefano Zampini 7232b723ba2SStefano Zampini /* Test by Pierre Jolivet */ 7242b723ba2SStefano Zampini { 7252b723ba2SStefano Zampini Mat C, D, D2, AtA; 7269566063dSJacob Faibussowitsch PetscCall(MatCreateNormal(A, &AtA)); 7279566063dSJacob Faibussowitsch PetscCall(MatDuplicate(X, MAT_DO_NOT_COPY_VALUES, &C)); 7289566063dSJacob Faibussowitsch PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &D)); 7299566063dSJacob Faibussowitsch PetscCall(MatDuplicate(B, MAT_DO_NOT_COPY_VALUES, &D2)); 7309566063dSJacob Faibussowitsch PetscCall(MatSetRandom(B, NULL)); 7319566063dSJacob Faibussowitsch PetscCall(MatSetRandom(C, NULL)); 7329566063dSJacob Faibussowitsch PetscCall(MatSetRandom(D, NULL)); 7339566063dSJacob Faibussowitsch PetscCall(MatSetRandom(D2, NULL)); 7349566063dSJacob Faibussowitsch PetscCall(MatProductCreateWithMat(A, B, NULL, C)); 7359566063dSJacob Faibussowitsch PetscCall(MatProductSetType(C, MATPRODUCT_AB)); 7369566063dSJacob Faibussowitsch PetscCall(MatProductSetFromOptions(C)); 7379566063dSJacob Faibussowitsch PetscCall(MatProductSymbolic(C)); 7389566063dSJacob Faibussowitsch PetscCall(MatProductCreateWithMat(A, C, NULL, D)); 7399566063dSJacob Faibussowitsch PetscCall(MatProductSetType(D, MATPRODUCT_AtB)); 7409566063dSJacob Faibussowitsch PetscCall(MatProductSetFromOptions(D)); 7419566063dSJacob Faibussowitsch PetscCall(MatProductSymbolic(D)); 7429566063dSJacob Faibussowitsch PetscCall(MatProductNumeric(C)); 7433faff063SStefano Zampini PetscCall(MatMatMultEqual(A, B, C, 10, &flg)); 7443faff063SStefano Zampini if (!flg) { 7453faff063SStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Normal (AB != C)\n")); 7463faff063SStefano Zampini PetscCall(MatView(A, NULL)); 7473faff063SStefano Zampini PetscCall(MatView(B, NULL)); 7483faff063SStefano Zampini PetscCall(MatView(C, NULL)); 7493faff063SStefano Zampini } 7509566063dSJacob Faibussowitsch PetscCall(MatProductNumeric(D)); 7519566063dSJacob Faibussowitsch PetscCall(MatMatMultEqual(AtA, B, D, 10, &flg)); 7522b723ba2SStefano Zampini if (!flg) { 7533faff063SStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error with Normal (2)\n")); 7549566063dSJacob Faibussowitsch PetscCall(MatMatMult(AtA, C, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &T)); 7553faff063SStefano Zampini PetscCall(MatView(D, NULL)); 7563faff063SStefano Zampini PetscCall(MatView(T, NULL)); 7579566063dSJacob Faibussowitsch PetscCall(MatAXPY(T, -1.0, D, SAME_NONZERO_PATTERN)); 7589566063dSJacob Faibussowitsch PetscCall(MatView(T, NULL)); 7599566063dSJacob Faibussowitsch PetscCall(MatDestroy(&T)); 7602b723ba2SStefano Zampini } 7619566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 7629566063dSJacob Faibussowitsch PetscCall(MatDestroy(&D)); 7639566063dSJacob Faibussowitsch PetscCall(MatDestroy(&D2)); 7649566063dSJacob Faibussowitsch PetscCall(MatDestroy(&AtA)); 7652b723ba2SStefano Zampini } 7662b723ba2SStefano Zampini 7679566063dSJacob Faibussowitsch PetscCall(MatDestroy(&X)); 7689566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Bt)); 7699566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B)); 7709566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 7719566063dSJacob Faibussowitsch PetscCall(MatDestroy(&R)); 7729566063dSJacob Faibussowitsch PetscCall(MatDestroy(&PtAP)); 7739566063dSJacob Faibussowitsch PetscCall(MatDestroy(&RARt)); 7749566063dSJacob Faibussowitsch PetscCall(PetscFree(dataX)); 7759566063dSJacob Faibussowitsch PetscCall(PetscFree(dataB)); 7769566063dSJacob Faibussowitsch PetscCall(PetscFree(dataR)); 7779566063dSJacob Faibussowitsch PetscCall(PetscFree(dataBt)); 7789566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 779b122ec5aSJacob Faibussowitsch return 0; 7806280154eSStefano Zampini } 7816280154eSStefano Zampini 7826280154eSStefano Zampini /*TEST 7836280154eSStefano Zampini 7846280154eSStefano Zampini test: 7856280154eSStefano Zampini suffix: 1 78675ab9b9fSStefano Zampini args: -local {{0 1}} -testshellops 7876280154eSStefano Zampini 7886280154eSStefano Zampini test: 7896280154eSStefano Zampini output_file: output/ex70_1.out 790456288a8SStefano Zampini requires: cuda 791456288a8SStefano Zampini suffix: 1_cuda 792686594dbSStefano Zampini args: -local {{0 1}} -xgpu {{0 1}} -bgpu {{0 1}} -A_mat_type {{seqaijcusparse seqaij}} -testshellops {{0 1}} 793456288a8SStefano Zampini 794456288a8SStefano Zampini test: 795456288a8SStefano Zampini output_file: output/ex70_1.out 7966280154eSStefano Zampini nsize: 2 7976280154eSStefano Zampini suffix: 1_par 79875ab9b9fSStefano Zampini args: -local {{0 1}} -testmatmatt 0 7996280154eSStefano Zampini 8006280154eSStefano Zampini test: 801456288a8SStefano Zampini output_file: output/ex70_1.out 802456288a8SStefano Zampini requires: cuda 803456288a8SStefano Zampini nsize: 2 804456288a8SStefano Zampini suffix: 1_par_cuda 80575ab9b9fSStefano Zampini args: -local {{0 1}} -xgpu {{0 1}} -bgpu {{0 1}} -A_mat_type {{mpiaijcusparse mpiaij}} -testnest 0 -testmatmatt 0 -matmatmult_Bbn 3 806456288a8SStefano Zampini 807456288a8SStefano Zampini test: 8086280154eSStefano Zampini output_file: output/ex70_1.out 8096280154eSStefano Zampini suffix: 2 8106280154eSStefano Zampini nsize: 1 8116280154eSStefano Zampini args: -M {{7 11}} -N {{12 9}} -K {{1 3}} -local {{0 1}} 8126280154eSStefano Zampini 8138a311839SJunchao Zhang testset: 814456288a8SStefano Zampini requires: cuda 815456288a8SStefano Zampini output_file: output/ex70_1.out 816456288a8SStefano Zampini nsize: 1 817456288a8SStefano Zampini args: -M 7 -N 9 -K 2 -local {{0 1}} -testnest 0 -A_mat_type {{seqdensecuda seqdense}} -xgpu {{0 1}} -bgpu {{0 1}} 8188a311839SJunchao Zhang test: 8198a311839SJunchao Zhang requires: !complex 8208a311839SJunchao Zhang suffix: 2_cuda_real 8218a311839SJunchao Zhang test: 8228a311839SJunchao Zhang # complex+single gives a little bigger error in the MatDenseGetColumnVec test 8238a311839SJunchao Zhang requires: complex !single 8248a311839SJunchao Zhang suffix: 2_cuda_complex 825456288a8SStefano Zampini 826456288a8SStefano Zampini test: 8276280154eSStefano Zampini output_file: output/ex70_1.out 8286280154eSStefano Zampini suffix: 2_par 8296280154eSStefano Zampini nsize: 2 83075ab9b9fSStefano Zampini args: -M {{7 11}} -N {{12 9}} -K {{1 3}} -local {{0 1}} -testcircular -testmatmatt 0 8316280154eSStefano Zampini 8326280154eSStefano Zampini test: 833456288a8SStefano Zampini requires: cuda 834456288a8SStefano Zampini output_file: output/ex70_1.out 835456288a8SStefano Zampini suffix: 2_par_cuda 836456288a8SStefano Zampini nsize: 2 83775ab9b9fSStefano Zampini args: -M 11 -N 9 -K 1 -local {{0 1}} -testcircular 0 -A_mat_type mpiaijcusparse -xgpu -bgpu -testnest 0 -testmatmatt 0 838456288a8SStefano Zampini 839456288a8SStefano Zampini test: 8406280154eSStefano Zampini output_file: output/ex70_1.out 8416280154eSStefano Zampini suffix: 3 842456288a8SStefano Zampini nsize: {{1 3}} 84375ab9b9fSStefano Zampini args: -M 13 -N 13 -K {{1 3}} -local {{0 1}} -A_mat_type sbaij -symm -testproj 0 -testmatmatt 0 8446280154eSStefano Zampini 8456280154eSStefano Zampini test: 8466280154eSStefano Zampini output_file: output/ex70_1.out 8476280154eSStefano Zampini suffix: 4 8486280154eSStefano Zampini nsize: 1 8496280154eSStefano Zampini args: -M 3 -N 3 -K 3 -local {{0 1}} -testcircular 8506280154eSStefano Zampini 8516280154eSStefano Zampini test: 8526280154eSStefano Zampini output_file: output/ex70_1.out 8536280154eSStefano Zampini suffix: 5 8546280154eSStefano Zampini nsize: {{2 4}} 855a0638e9dSStefano Zampini args: -M 3 -N 3 -K 3 -local {{0 1}} -testcircular -testmatmatt 0 8566280154eSStefano Zampini 8576280154eSStefano Zampini test: 8586280154eSStefano Zampini output_file: output/ex70_1.out 8596280154eSStefano Zampini suffix: 6 8606280154eSStefano Zampini nsize: 1 86175ab9b9fSStefano Zampini args: -M {{1 3}} -N {{2 5}} -K {{1 2}} -local {{0 1}} -testcircular 8626280154eSStefano Zampini 8636280154eSStefano Zampini test: 8646280154eSStefano Zampini output_file: output/ex70_1.out 8656280154eSStefano Zampini suffix: 7 8666280154eSStefano Zampini nsize: 1 867456288a8SStefano Zampini args: -M 13 -N 13 -K {{1 3}} -local {{0 1}} -A_mat_type dense -testnest -testcircular 8686718818eSStefano Zampini 8696280154eSStefano Zampini TEST*/ 870