xref: /petsc/src/mat/tests/ex70.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
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 
76280154eSStefano Zampini static PetscErrorCode CheckLocal(Mat A, Mat B, PetscScalar *a, PetscScalar *b)
86280154eSStefano Zampini {
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;
16*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetArrayRead(A,&Aa));
176280154eSStefano Zampini     wA   = (PetscBool)(a != Aa);
18*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetLDA(A,&lda));
19*5f80ce2aSJacob Faibussowitsch     CHKERRQ(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     }
25*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArrayRead(A,&Aa));
266280154eSStefano Zampini   }
276280154eSStefano Zampini   if (b) {
286280154eSStefano Zampini     const PetscScalar *Bb;
29*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetArrayRead(B,&Bb));
306280154eSStefano Zampini     wB   = (PetscBool)(b != Bb);
31*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetLDA(B,&lda));
32*5f80ce2aSJacob Faibussowitsch     CHKERRQ(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     }
38*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArrayRead(B,&Bb));
396280154eSStefano Zampini   }
402c71b3e2SJacob Faibussowitsch   PetscCheckFalse(wA || wB,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Wrong array in first Mat? %d, Wrong array in second Mat? %d",wA,wB);
412c71b3e2SJacob Faibussowitsch   PetscCheckFalse(wAv || wBv,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Wrong data in first Mat? %d, Wrong data in second Mat? %d",wAv,wBv);
4275ab9b9fSStefano Zampini   PetscFunctionReturn(0);
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 
5175ab9b9fSStefano Zampini PetscErrorCode proj_destroy(void *ctx)
5275ab9b9fSStefano Zampini {
5375ab9b9fSStefano Zampini   proj_data      *userdata = (proj_data*)ctx;
5475ab9b9fSStefano Zampini 
5575ab9b9fSStefano Zampini   PetscFunctionBegin;
562c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!userdata,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing userdata");
57*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&userdata->A));
58*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&userdata->P));
59*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&userdata->R));
60*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(userdata));
6175ab9b9fSStefano Zampini   PetscFunctionReturn(0);
6275ab9b9fSStefano Zampini }
6375ab9b9fSStefano Zampini 
6475ab9b9fSStefano Zampini PetscErrorCode proj_mult(Mat S, Vec X, Vec Y)
6575ab9b9fSStefano Zampini {
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;
72*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellGetContext(S,&userdata));
732c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!userdata,PetscObjectComm((PetscObject)S),PETSC_ERR_PLIB,"Missing userdata");
7475ab9b9fSStefano Zampini   A = userdata->A;
7575ab9b9fSStefano Zampini   R = userdata->R;
7675ab9b9fSStefano Zampini   P = userdata->P;
772c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!A,PetscObjectComm((PetscObject)S),PETSC_ERR_PLIB,"Missing matrix");
782c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!R && !P,PetscObjectComm((PetscObject)S),PETSC_ERR_PLIB,"Missing projectors");
792c71b3e2SJacob Faibussowitsch   PetscCheckFalse(R && P,PetscObjectComm((PetscObject)S),PETSC_ERR_PLIB,"Both projectors");
80*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreateVecs(A,&Ax,&Ay));
8175ab9b9fSStefano Zampini   if (R) {
82*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateVecs(R,&Py,&Px));
8375ab9b9fSStefano Zampini   } else {
84*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateVecs(P,&Px,&Py));
8575ab9b9fSStefano Zampini   }
86*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecCopy(X,Px));
8775ab9b9fSStefano Zampini   if (P) {
88*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMult(P,Px,Py));
8975ab9b9fSStefano Zampini   } else {
90*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMultTranspose(R,Px,Py));
9175ab9b9fSStefano Zampini   }
92*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecCopy(Py,Ax));
93*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMult(A,Ax,Ay));
94*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecCopy(Ay,Py));
9575ab9b9fSStefano Zampini   if (P) {
96*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMultTranspose(P,Py,Px));
9775ab9b9fSStefano Zampini   } else {
98*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMult(R,Py,Px));
9975ab9b9fSStefano Zampini   }
100*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecCopy(Px,Y));
101*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&Px));
102*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&Py));
103*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&Ax));
104*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&Ay));
10575ab9b9fSStefano Zampini   PetscFunctionReturn(0);
10675ab9b9fSStefano Zampini }
10775ab9b9fSStefano Zampini 
10875ab9b9fSStefano Zampini PetscErrorCode MyPtShellPMultSymbolic(Mat S, Mat P, Mat PtAP, void** ctx)
10975ab9b9fSStefano Zampini {
11075ab9b9fSStefano Zampini   proj_data      *userdata;
11175ab9b9fSStefano Zampini 
11275ab9b9fSStefano Zampini   PetscFunctionBegin;
113*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscNew(&userdata));
114*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellSetContext(PtAP,userdata));
11575ab9b9fSStefano Zampini   *ctx = (void *)userdata;
11675ab9b9fSStefano Zampini   PetscFunctionReturn(0);
11775ab9b9fSStefano Zampini }
11875ab9b9fSStefano Zampini 
11975ab9b9fSStefano Zampini PetscErrorCode MyPtShellPMultNumeric(Mat S, Mat P, Mat PtAP, void *ctx)
12075ab9b9fSStefano Zampini {
12175ab9b9fSStefano Zampini   Mat            A;
12275ab9b9fSStefano Zampini   proj_data      *userdata = (proj_data*)ctx;
12375ab9b9fSStefano Zampini 
12475ab9b9fSStefano Zampini   PetscFunctionBegin;
125*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellGetContext(S,&A));
126*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectReference((PetscObject)A));
127*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectReference((PetscObject)P));
128*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&userdata->A));
129*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&userdata->P));
130*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&userdata->R));
13175ab9b9fSStefano Zampini   userdata->A = A;
13275ab9b9fSStefano Zampini   userdata->P = P;
133*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellSetOperation(PtAP,MATOP_MULT,(void (*)(void))proj_mult));
134*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(PtAP));
135*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(PtAP,MAT_FINAL_ASSEMBLY));
136*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(PtAP,MAT_FINAL_ASSEMBLY));
13775ab9b9fSStefano Zampini   PetscFunctionReturn(0);
13875ab9b9fSStefano Zampini }
13975ab9b9fSStefano Zampini 
14075ab9b9fSStefano Zampini PetscErrorCode MyRShellRtMultSymbolic(Mat S, Mat R, Mat RARt, void **ctx)
14175ab9b9fSStefano Zampini {
14275ab9b9fSStefano Zampini   proj_data      *userdata;
14375ab9b9fSStefano Zampini 
14475ab9b9fSStefano Zampini   PetscFunctionBegin;
145*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscNew(&userdata));
146*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellSetContext(RARt,userdata));
14775ab9b9fSStefano Zampini   *ctx = (void *)userdata;
14875ab9b9fSStefano Zampini   PetscFunctionReturn(0);
14975ab9b9fSStefano Zampini }
15075ab9b9fSStefano Zampini 
15175ab9b9fSStefano Zampini PetscErrorCode MyRShellRtMultNumeric(Mat S, Mat R, Mat RARt, void *ctx)
15275ab9b9fSStefano Zampini {
15375ab9b9fSStefano Zampini   Mat            A;
15475ab9b9fSStefano Zampini   proj_data      *userdata = (proj_data*)ctx;
15575ab9b9fSStefano Zampini 
15675ab9b9fSStefano Zampini   PetscFunctionBegin;
157*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellGetContext(S,&A));
158*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectReference((PetscObject)A));
159*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectReference((PetscObject)R));
160*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&userdata->A));
161*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&userdata->P));
162*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&userdata->R));
16375ab9b9fSStefano Zampini   userdata->A = A;
16475ab9b9fSStefano Zampini   userdata->R = R;
165*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellSetOperation(RARt,MATOP_MULT,(void (*)(void))proj_mult));
166*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(RARt));
167*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(RARt,MAT_FINAL_ASSEMBLY));
168*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(RARt,MAT_FINAL_ASSEMBLY));
16975ab9b9fSStefano Zampini   PetscFunctionReturn(0);
17075ab9b9fSStefano Zampini }
17175ab9b9fSStefano Zampini 
17275ab9b9fSStefano Zampini PetscErrorCode MyMatShellMatMultNumeric(Mat S, Mat B, Mat C, void *ctx)
17375ab9b9fSStefano Zampini {
17475ab9b9fSStefano Zampini   Mat            A;
17575ab9b9fSStefano Zampini 
17675ab9b9fSStefano Zampini   PetscFunctionBegin;
177*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellGetContext(S,&A));
178*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C));
17975ab9b9fSStefano Zampini   PetscFunctionReturn(0);
18075ab9b9fSStefano Zampini }
18175ab9b9fSStefano Zampini 
18275ab9b9fSStefano Zampini PetscErrorCode MyMatTransposeShellMatMultNumeric(Mat S, Mat B, Mat C, void *ctx)
18375ab9b9fSStefano Zampini {
18475ab9b9fSStefano Zampini   Mat            A;
18575ab9b9fSStefano Zampini 
18675ab9b9fSStefano Zampini   PetscFunctionBegin;
187*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellGetContext(S,&A));
188*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatTransposeMatMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C));
18975ab9b9fSStefano Zampini   PetscFunctionReturn(0);
19075ab9b9fSStefano Zampini }
19175ab9b9fSStefano Zampini 
19275ab9b9fSStefano Zampini PetscErrorCode MyMatShellMatTransposeMultNumeric(Mat S, Mat B, Mat C, void *ctx)
19375ab9b9fSStefano Zampini {
19475ab9b9fSStefano Zampini   Mat            A;
19575ab9b9fSStefano Zampini 
19675ab9b9fSStefano Zampini   PetscFunctionBegin;
197*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatShellGetContext(S,&A));
198*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatTransposeMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C));
1996280154eSStefano Zampini   PetscFunctionReturn(0);
2006280154eSStefano Zampini }
2016280154eSStefano Zampini 
2026280154eSStefano Zampini int main(int argc,char **args)
2036280154eSStefano Zampini {
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;
2103604c0aeSStefano Zampini   PetscBool      testhtranspose = PETSC_TRUE;
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   PetscErrorCode ierr;
2166280154eSStefano Zampini 
2176280154eSStefano Zampini   ierr = PetscInitialize(&argc,&args,NULL,help);if (ierr) return ierr;
218*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL));
219*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL));
220*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-K",&K,NULL));
221*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-symm",&symm,NULL));
222*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-local",&local,NULL));
223*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-ldx",&ldx,NULL));
224*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-ldb",&ldb,NULL));
225*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-ldr",&ldr,NULL));
226*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testtranspose",&testtranspose,NULL));
227*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testnest",&testnest,NULL));
228*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testtt",&testtt,NULL));
229*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testcircular",&testcircular,NULL));
230*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testshellops",&testshellops,NULL));
231*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testproj",&testproj,NULL));
232*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testrart",&testrart,NULL));
233*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testmatmatt",&testmatmatt,NULL));
234*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testmattmat",&testmattmat,NULL));
235*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-xgpu",&xgpu,NULL));
236*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-bgpu",&bgpu,NULL));
237*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetScalar(NULL,NULL,"-magic_number",&MAGIC_NUMBER,NULL));
23875ab9b9fSStefano Zampini   if (M != N) testproj = PETSC_FALSE;
23975ab9b9fSStefano Zampini 
240*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreate(PETSC_COMM_WORLD,&A));
241*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,M,N));
242*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetType(A,MATAIJ));
243*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(A));
244*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetRandom(A,NULL));
2456280154eSStefano Zampini   if (M==N && symm) {
2466280154eSStefano Zampini     Mat AT;
2476280154eSStefano Zampini 
248*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatTranspose(A,MAT_INITIAL_MATRIX,&AT));
249*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAXPY(A,1.0,AT,DIFFERENT_NONZERO_PATTERN));
250*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&AT));
251*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetOption(A,MAT_SYMMETRIC,PETSC_TRUE));
2526280154eSStefano Zampini   }
253*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatViewFromOptions(A,NULL,"-A_init_view"));
2546280154eSStefano Zampini   ierr = PetscOptionsBegin(PETSC_COMM_WORLD,"","","");CHKERRQ(ierr);
255*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFList("-A_mat_type","Matrix type","MatSetType",MatList,deft,mattype,256,&flg));
2566280154eSStefano Zampini   ierr = PetscOptionsEnd();CHKERRQ(ierr);
2576280154eSStefano Zampini   if (flg) {
2586280154eSStefano Zampini     Mat A2;
2596280154eSStefano Zampini 
260*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDuplicate(A,MAT_COPY_VALUES,&A2));
261*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatConvert(A,mattype,MAT_INPLACE_MATRIX,&A));
262*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMultEqual(A,A2,10,&flg));
2636280154eSStefano Zampini     if (!flg) {
2646280154eSStefano Zampini       Mat AE,A2E;
2656280154eSStefano Zampini 
266*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with convert\n"));
267*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatComputeOperator(A,MATDENSE,&AE));
268*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatComputeOperator(A2,MATDENSE,&A2E));
269*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(AE,NULL));
270*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(A2E,NULL));
271*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(A2E,-1.0,A,SAME_NONZERO_PATTERN));
272*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(A2E,NULL));
273*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&A2E));
274*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&AE));
2756280154eSStefano Zampini     }
276*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&A2));
2776280154eSStefano Zampini   }
278*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatViewFromOptions(A,NULL,"-A_view"));
2796280154eSStefano Zampini 
280*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetLocalSize(A,&m,&n));
2816280154eSStefano Zampini   if (local) {
28275ab9b9fSStefano Zampini     PetscInt i;
28375ab9b9fSStefano Zampini 
284*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1((m+ldx)*K,&dataX));
285*5f80ce2aSJacob Faibussowitsch     CHKERRQ(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   }
289*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreateDense(PETSC_COMM_WORLD,n,PETSC_DECIDE,N,K,dataB,&B));
290*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreateDense(PETSC_COMM_WORLD,m,PETSC_DECIDE,M,K,dataX,&X));
29175ab9b9fSStefano Zampini   if (local) {
292*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseSetLDA(X,m+ldx));
293*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseSetLDA(B,n+ldb));
29475ab9b9fSStefano Zampini   }
295*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetLocalSize(B,NULL,&k));
29675ab9b9fSStefano Zampini   if (local) {
29775ab9b9fSStefano Zampini     PetscInt i;
29875ab9b9fSStefano Zampini 
299*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1((k+ldr)*N,&dataBt));
300a0638e9dSStefano Zampini     for (i=0;i<(k+ldr)*N;i++) dataBt[i] = MAGIC_NUMBER;
30175ab9b9fSStefano Zampini   }
302*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreateDense(PETSC_COMM_WORLD,k,n,K,N,dataBt,&Bt));
30375ab9b9fSStefano Zampini   if (local) {
304*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseSetLDA(Bt,k+ldr));
30575ab9b9fSStefano Zampini   }
3066280154eSStefano Zampini 
3076280154eSStefano Zampini   /* store pointer to dense data for testing */
308*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(B,(const PetscScalar**)&dataB));
309*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(X,(const PetscScalar**)&dataX));
310*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(Bt,(const PetscScalar**)&dataBt));
3116280154eSStefano Zampini   aX   = dataX;
3126280154eSStefano Zampini   aB   = dataB;
31375ab9b9fSStefano Zampini   aBt  = dataBt;
314*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(Bt,(const PetscScalar**)&dataBt));
315*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(B,(const PetscScalar**)&dataB));
316*5f80ce2aSJacob Faibussowitsch   CHKERRQ(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 
323*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetRandom(X,NULL));
324*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetRandom(B,NULL));
325*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetRandom(Bt,NULL));
326*5f80ce2aSJacob Faibussowitsch   CHKERRQ(CheckLocal(X,NULL,aX,NULL));
327*5f80ce2aSJacob Faibussowitsch   CHKERRQ(CheckLocal(Bt,B,aBt,aB));
32875ab9b9fSStefano Zampini 
329456288a8SStefano Zampini   /* convert to CUDA if needed */
330456288a8SStefano Zampini   if (bgpu) {
331*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatConvert(B,MATDENSECUDA,MAT_INPLACE_MATRIX,&B));
332*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatConvert(Bt,MATDENSECUDA,MAT_INPLACE_MATRIX,&Bt));
333456288a8SStefano Zampini   }
334456288a8SStefano Zampini   if (xgpu) {
335*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatConvert(X,MATDENSECUDA,MAT_INPLACE_MATRIX,&X));
336456288a8SStefano Zampini   }
337*5f80ce2aSJacob Faibussowitsch   CHKERRQ(CheckLocal(B,X,aB,aX));
3386280154eSStefano Zampini 
339e7b38fdfSStefano Zampini   /* Test MatDenseGetSubMatrix */
340e7b38fdfSStefano Zampini   {
341e7b38fdfSStefano Zampini     Mat B2,T3,T4;
342e7b38fdfSStefano Zampini 
343*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDuplicate(B,MAT_COPY_VALUES,&B2));
344*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDuplicate(B,MAT_DO_NOT_COPY_VALUES,&T4));
345*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetRandom(T4,NULL));
346*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAXPY(B2,1.0,T4,SAME_NONZERO_PATTERN));
347*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetSubMatrix(B,PetscMin(1,K),PetscMin(2,K),&T));
348*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetSubMatrix(T4,PetscMin(1,K),PetscMin(2,K),&T2));
349*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetSubMatrix(B2,PetscMin(1,K),PetscMin(2,K),&T3));
350*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAXPY(T,1.0,T2,SAME_NONZERO_PATTERN));
351*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAXPY(T3,-1.0,T,SAME_NONZERO_PATTERN));
352*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatNorm(T3,NORM_FROBENIUS,&err));
353e7b38fdfSStefano Zampini     if (err > PETSC_SMALL) {
354*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with MatDenseGetSubMatrix\n"));
355*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T3,NULL));
356e7b38fdfSStefano Zampini     }
357*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreSubMatrix(B,&T));
358*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreSubMatrix(T4,&T2));
359*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreSubMatrix(B2,&T3));
360*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(B,NULL,aB,NULL));
361*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&B2));
362*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&T4));
363e7b38fdfSStefano Zampini   }
364e7b38fdfSStefano Zampini 
3656280154eSStefano Zampini   /* Test reusing a previously allocated dense buffer */
366*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X));
367*5f80ce2aSJacob Faibussowitsch   CHKERRQ(CheckLocal(B,X,aB,aX));
368*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatMultEqual(A,B,X,10,&flg));
3696280154eSStefano Zampini   if (!flg) {
370*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with reusage\n"));
371*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
372*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAXPY(T,-1.0,X,SAME_NONZERO_PATTERN));
373*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView(T,NULL));
374*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&T));
3756280154eSStefano Zampini   }
3766280154eSStefano Zampini 
37775ab9b9fSStefano Zampini   /* Test MatTransposeMat and MatMatTranspose */
37875ab9b9fSStefano Zampini   if (testmattmat) {
379*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatTransposeMatMult(A,X,MAT_REUSE_MATRIX,PETSC_DEFAULT,&B));
380*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(B,X,aB,aX));
381*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatTransposeMatMultEqual(A,X,B,10,&flg));
38275ab9b9fSStefano Zampini     if (!flg) {
383*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with reusage (MatTransposeMat)\n"));
384*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatTransposeMatMult(A,X,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&B));
385*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T,-1.0,B,SAME_NONZERO_PATTERN));
386*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T,NULL));
387*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
38875ab9b9fSStefano Zampini     }
38975ab9b9fSStefano Zampini   }
39075ab9b9fSStefano Zampini   if (testmatmatt) {
391*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatTransposeMult(A,Bt,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X));
392*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(Bt,X,aBt,aX));
393*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatTransposeMultEqual(A,Bt,X,10,&flg));
39475ab9b9fSStefano Zampini     if (!flg) {
395*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with reusage (MatMatTranspose)\n"));
396*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMatTransposeMult(A,Bt,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
397*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T,-1.0,X,SAME_NONZERO_PATTERN));
398*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T,NULL));
399*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
40075ab9b9fSStefano Zampini     }
40175ab9b9fSStefano Zampini   }
40275ab9b9fSStefano Zampini 
40375ab9b9fSStefano Zampini   /* Test projection operations (PtAP and RARt) */
40475ab9b9fSStefano Zampini   if (testproj) {
405*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatPtAP(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&PtAP));
406*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatPtAPMultEqual(A,B,PtAP,10,&flg));
40775ab9b9fSStefano Zampini     if (!flg) {
408*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with PtAP\n"));
409*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
410*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatTransposeMatMult(B,T,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T2));
411*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T2,-1.0,PtAP,SAME_NONZERO_PATTERN));
412*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T2,NULL));
413*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T2));
414*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
41575ab9b9fSStefano Zampini     }
416*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1((k+ldr)*M,&dataR));
417*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateDense(PETSC_COMM_WORLD,PETSC_DECIDE,m,K,M,dataR,&R));
418*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseSetLDA(R,k+ldr));
419*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetRandom(R,NULL));
42075ab9b9fSStefano Zampini     if (testrart) { /* fails for AIJCUSPARSE because RA operation is not defined */
421*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatRARt(A,R,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&RARt));
422*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatRARtMultEqual(A,R,RARt,10,&flg));
42375ab9b9fSStefano Zampini       if (!flg) {
424*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with RARt\n"));
425*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatMatTransposeMult(A,R,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
426*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatMatMult(R,T,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T2));
427*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatAXPY(T2,-1.0,RARt,SAME_NONZERO_PATTERN));
428*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatView(T2,NULL));
429*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatDestroy(&T2));
430*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatDestroy(&T));
43175ab9b9fSStefano Zampini       }
43275ab9b9fSStefano Zampini     }
43375ab9b9fSStefano Zampini   }
43475ab9b9fSStefano Zampini 
435456288a8SStefano Zampini   /* Test MatDenseGetColumnVec and friends */
436*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X));
437*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
438*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDuplicate(T,MAT_DO_NOT_COPY_VALUES,&T2));
439456288a8SStefano Zampini   for (k=0;k<K;k++) {
440456288a8SStefano Zampini     Vec Xv,Tv,T2v;
441456288a8SStefano Zampini 
442*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetColumnVecRead(X,k,&Xv));
443*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetColumnVec(T,k,&Tv));
444*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetColumnVecWrite(T2,k,&T2v));
445*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCopy(Xv,T2v));
446*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecAXPY(Tv,-1.,Xv));
447*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreColumnVecRead(X,k,&Xv));
448*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreColumnVec(T,k,&Tv));
449*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreColumnVecWrite(T2,k,&T2v));
450456288a8SStefano Zampini   }
451*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatNorm(T,NORM_FROBENIUS,&err));
452456288a8SStefano Zampini   if (err > PETSC_SMALL) {
453*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with MatDenseGetColumnVec\n"));
454*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView(T,NULL));
455456288a8SStefano Zampini   }
456*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAXPY(T2,-1.,X,SAME_NONZERO_PATTERN));
457*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatNorm(T2,NORM_FROBENIUS,&err));
458456288a8SStefano Zampini   if (err > PETSC_SMALL) {
459*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with MatDenseGetColumnVecWrite\n"));
460*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView(T2,NULL));
461456288a8SStefano Zampini   }
462*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&T));
463*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&T2));
464456288a8SStefano Zampini 
465456288a8SStefano Zampini   /* Test with MatShell */
466*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDuplicate(A,MAT_COPY_VALUES,&T));
467*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatConvert(T,MATSHELL,MAT_INITIAL_MATRIX,&T2));
468*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&T));
46975ab9b9fSStefano Zampini 
47075ab9b9fSStefano Zampini   /* scale matrix */
471*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatScale(A,2.0));
472*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatScale(T2,2.0));
473*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreateVecs(A,&r,&l));
474*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecSetRandom(r,NULL));
475*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecSetRandom(l,NULL));
476*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreateVecs(T2,&rs,&ls));
477*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecCopy(r,rs));
478*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecCopy(l,ls));
47975ab9b9fSStefano Zampini   if (testproj) {
480*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDiagonalScale(A,r,r));
481*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDiagonalScale(T2,rs,rs));
48275ab9b9fSStefano Zampini   } else {
483*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDiagonalScale(A,l,r));
484*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDiagonalScale(T2,ls,rs));
48575ab9b9fSStefano Zampini   }
486*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDuplicate(A,MAT_COPY_VALUES,&T));
487*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAXPY(A,4.5,T,SAME_NONZERO_PATTERN));
488*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAXPY(T2,4.5,T,DIFFERENT_NONZERO_PATTERN));
489*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMultEqual(T2,A,10,&flg));
49075ab9b9fSStefano Zampini   if (!flg) {
491*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with MATSHELL (MatMult)\n"));
49275ab9b9fSStefano Zampini   }
493*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMultTransposeEqual(T2,A,10,&flg));
49475ab9b9fSStefano Zampini   if (!flg) {
495*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with MATSHELL (MatMultTranspose)\n"));
49675ab9b9fSStefano Zampini   }
497*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&T));
498*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&ls));
499*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&rs));
500*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&l));
501*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&r));
50275ab9b9fSStefano Zampini 
50375ab9b9fSStefano Zampini   /* recompute projections, test reusage */
504*5f80ce2aSJacob Faibussowitsch   if (PtAP) CHKERRQ(MatPtAP(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&PtAP));
505*5f80ce2aSJacob Faibussowitsch   if (RARt) CHKERRQ(MatRARt(A,R,MAT_REUSE_MATRIX,PETSC_DEFAULT,&RARt));
50675ab9b9fSStefano Zampini   if (testshellops) { /* test callbacks for user defined MatProducts */
507*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_AB,NULL,MyMatShellMatMultNumeric,NULL,MATDENSE,MATDENSE));
508*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_AB,NULL,MyMatShellMatMultNumeric,NULL,MATDENSECUDA,MATDENSECUDA));
509*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_AtB,NULL,MyMatTransposeShellMatMultNumeric,NULL,MATDENSE,MATDENSE));
510*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_AtB,NULL,MyMatTransposeShellMatMultNumeric,NULL,MATDENSECUDA,MATDENSECUDA));
511*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_ABt,NULL,MyMatShellMatTransposeMultNumeric,NULL,MATDENSE,MATDENSE));
512*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_ABt,NULL,MyMatShellMatTransposeMultNumeric,NULL,MATDENSECUDA,MATDENSECUDA));
51375ab9b9fSStefano Zampini     if (testproj) {
514*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_PtAP,MyPtShellPMultSymbolic,MyPtShellPMultNumeric,proj_destroy,MATDENSE,MATSHELL));
515*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_PtAP,MyPtShellPMultSymbolic,MyPtShellPMultNumeric,proj_destroy,MATDENSECUDA,MATSHELL));
516*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_RARt,MyRShellRtMultSymbolic,MyRShellRtMultNumeric,proj_destroy,MATDENSE,MATSHELL));
517*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatShellSetMatProductOperation(T2,MATPRODUCT_RARt,MyRShellRtMultSymbolic,MyRShellRtMultNumeric,proj_destroy,MATDENSECUDA,MATSHELL));
51875ab9b9fSStefano Zampini     }
51975ab9b9fSStefano Zampini   }
520*5f80ce2aSJacob Faibussowitsch   CHKERRQ(CheckLocal(B,X,aB,aX));
52175ab9b9fSStefano Zampini   /* we either use the shell operations or the loop over columns code, applying the operator */
522*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatMult(T2,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X));
523*5f80ce2aSJacob Faibussowitsch   CHKERRQ(CheckLocal(B,X,aB,aX));
524*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatMultEqual(T2,B,X,10,&flg));
525456288a8SStefano Zampini   if (!flg) {
526*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with reusage (MATSHELL)\n"));
527*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
528*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAXPY(T,-1.0,X,SAME_NONZERO_PATTERN));
529*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView(T,NULL));
530*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&T));
531456288a8SStefano Zampini   }
53275ab9b9fSStefano Zampini   if (testproj) {
533*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatPtAPMultEqual(T2,B,PtAP,10,&flg));
53475ab9b9fSStefano Zampini     if (!flg) {
535*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with PtAP (MATSHELL)\n"));
53675ab9b9fSStefano Zampini     }
53775ab9b9fSStefano Zampini     if (testshellops) { /* projections fail if the product operations are not specified */
538*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatPtAP(T2,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
539*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatPtAP(T2,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&T));
540*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatPtAPMultEqual(T2,B,T,10,&flg));
54175ab9b9fSStefano Zampini       if (!flg) {
54275ab9b9fSStefano Zampini         Mat TE;
5436718818eSStefano Zampini 
544*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with PtAP (MATSHELL user defined)\n"));
545*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatComputeOperator(T,MATDENSE,&TE));
546*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatView(TE,NULL));
547*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatView(PtAP,NULL));
548*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatAXPY(TE,-1.0,PtAP,SAME_NONZERO_PATTERN));
549*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatView(TE,NULL));
550*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatDestroy(&TE));
55175ab9b9fSStefano Zampini       }
552*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
55375ab9b9fSStefano Zampini     }
55475ab9b9fSStefano Zampini     if (RARt) {
555*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatRARtMultEqual(T2,R,RARt,10,&flg));
55675ab9b9fSStefano Zampini       if (!flg) {
557*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with RARt (MATSHELL)\n"));
55875ab9b9fSStefano Zampini       }
55975ab9b9fSStefano Zampini     }
56075ab9b9fSStefano Zampini     if (testshellops) {
561*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatRARt(T2,R,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
562*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatRARt(T2,R,MAT_REUSE_MATRIX,PETSC_DEFAULT,&T));
563*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatRARtMultEqual(T2,R,T,10,&flg));
56475ab9b9fSStefano Zampini       if (!flg) {
56575ab9b9fSStefano Zampini         Mat TE;
56675ab9b9fSStefano Zampini 
567*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with RARt (MATSHELL user defined)\n"));
568*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatComputeOperator(T,MATDENSE,&TE));
569*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatView(TE,NULL));
57075ab9b9fSStefano Zampini         if (RARt) {
571*5f80ce2aSJacob Faibussowitsch           CHKERRQ(MatView(RARt,NULL));
572*5f80ce2aSJacob Faibussowitsch           CHKERRQ(MatAXPY(TE,-1.0,RARt,SAME_NONZERO_PATTERN));
573*5f80ce2aSJacob Faibussowitsch           CHKERRQ(MatView(TE,NULL));
57475ab9b9fSStefano Zampini         }
575*5f80ce2aSJacob Faibussowitsch         CHKERRQ(MatDestroy(&TE));
57675ab9b9fSStefano Zampini       }
577*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
57875ab9b9fSStefano Zampini     }
57975ab9b9fSStefano Zampini   }
58075ab9b9fSStefano Zampini 
58175ab9b9fSStefano Zampini   if (testmattmat) { /* we either use the shell operations or the loop over columns code applying the transposed operator */
582*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatTransposeMatMult(T2,X,MAT_REUSE_MATRIX,PETSC_DEFAULT,&B));
583*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(B,X,aB,aX));
584*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatTransposeMatMultEqual(T2,X,B,10,&flg));
585456288a8SStefano Zampini     if (!flg) {
586*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with reusage (MatTranspose, MATSHELL)\n"));
587*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatTransposeMatMult(A,X,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
588*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T,-1.0,B,SAME_NONZERO_PATTERN));
589*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T,NULL));
590*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
5916718818eSStefano Zampini     }
592456288a8SStefano Zampini   }
59375ab9b9fSStefano Zampini   if (testmatmatt && testshellops) { /* only when shell operations are set */
594*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatTransposeMult(T2,Bt,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X));
595*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(Bt,X,aBt,aX));
596*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatTransposeMultEqual(T2,Bt,X,10,&flg));
59775ab9b9fSStefano Zampini     if (!flg) {
598*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with reusage (MatMatTranspose, MATSHELL)\n"));
599*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMatTransposeMult(A,Bt,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
600*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T,-1.0,X,SAME_NONZERO_PATTERN));
601*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T,NULL));
602*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
60375ab9b9fSStefano Zampini     }
60475ab9b9fSStefano Zampini   }
605*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&T2));
606456288a8SStefano Zampini 
6076280154eSStefano Zampini   if (testnest) { /* test with MatNest */
6086280154eSStefano Zampini     Mat NA;
6096280154eSStefano Zampini 
610*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateNest(PETSC_COMM_WORLD,1,NULL,1,NULL,&A,&NA));
611*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatViewFromOptions(NA,NULL,"-NA_view"));
612*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMult(NA,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X));
613*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(B,X,aB,aX));
614*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMultEqual(NA,B,X,10,&flg));
6156280154eSStefano Zampini     if (!flg) {
616*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with Nest\n"));
617*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMatMult(NA,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
618*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T,-1.0,X,SAME_NONZERO_PATTERN));
619*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T,NULL));
620*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
6216280154eSStefano Zampini     }
622*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&NA));
6236280154eSStefano Zampini   }
6246280154eSStefano Zampini 
6256280154eSStefano Zampini   if (testtranspose) { /* test with Transpose */
6266280154eSStefano Zampini     Mat TA;
6276280154eSStefano Zampini 
628*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateTranspose(A,&TA));
629*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMult(TA,X,MAT_REUSE_MATRIX,PETSC_DEFAULT,&B));
630*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(B,X,aB,aX));
631*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMultEqual(TA,X,B,10,&flg));
6326280154eSStefano Zampini     if (!flg) {
633*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with Transpose\n"));
634*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMatMult(TA,X,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
635*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T,-1.0,B,SAME_NONZERO_PATTERN));
636*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T,NULL));
637*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
6386280154eSStefano Zampini     }
639*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&TA));
6406280154eSStefano Zampini   }
6416280154eSStefano Zampini 
6423604c0aeSStefano Zampini   if (testhtranspose) { /* test with Hermitian Transpose */
6433604c0aeSStefano Zampini     Mat TA;
6443604c0aeSStefano Zampini 
645*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateHermitianTranspose(A,&TA));
646*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMult(TA,X,MAT_REUSE_MATRIX,PETSC_DEFAULT,&B));
647*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(B,X,aB,aX));
648*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMultEqual(TA,X,B,10,&flg));
6493604c0aeSStefano Zampini     if (!flg) {
650*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with Transpose\n"));
651*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMatMult(TA,X,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
652*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T,-1.0,B,SAME_NONZERO_PATTERN));
653*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T,NULL));
654*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
6553604c0aeSStefano Zampini     }
656*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&TA));
6573604c0aeSStefano Zampini   }
6583604c0aeSStefano Zampini 
6596280154eSStefano Zampini   if (testtt) { /* test with Transpose(Transpose) */
6606280154eSStefano Zampini     Mat TA, TTA;
6616280154eSStefano Zampini 
662*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateTranspose(A,&TA));
663*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateTranspose(TA,&TTA));
664*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMult(TTA,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X));
665*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(B,X,aB,aX));
666*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMultEqual(TTA,B,X,10,&flg));
6676280154eSStefano Zampini     if (!flg) {
668*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error with Transpose(Transpose)\n"));
669*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMatMult(TTA,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
670*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T,-1.0,X,SAME_NONZERO_PATTERN));
671*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T,NULL));
672*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
6736280154eSStefano Zampini     }
674*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&TA));
675*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&TTA));
6766280154eSStefano Zampini   }
6776280154eSStefano Zampini 
6786280154eSStefano Zampini   if (testcircular) { /* test circular */
6796280154eSStefano Zampini     Mat AB;
6806280154eSStefano Zampini 
681*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AB));
682*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X));
683*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(B,X,aB,aX));
6846280154eSStefano Zampini     if (M == N && N == K) {
685*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMatMult(A,X,MAT_REUSE_MATRIX,PETSC_DEFAULT,&B));
6866280154eSStefano Zampini     } else {
687*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatTransposeMatMult(A,X,MAT_REUSE_MATRIX,PETSC_DEFAULT,&B));
6886280154eSStefano Zampini     }
689*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLocal(B,X,aB,aX));
690*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&AB));
6916280154eSStefano Zampini   }
6922b723ba2SStefano Zampini 
6932b723ba2SStefano Zampini   /* Test by Pierre Jolivet */
6942b723ba2SStefano Zampini   {
6952b723ba2SStefano Zampini     Mat C,D,D2,AtA;
696*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateNormal(A,&AtA));
697*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDuplicate(X,MAT_DO_NOT_COPY_VALUES,&C));
698*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDuplicate(B,MAT_DO_NOT_COPY_VALUES,&D));
699*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDuplicate(B,MAT_DO_NOT_COPY_VALUES,&D2));
700*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetRandom(B,NULL));
701*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetRandom(C,NULL));
702*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetRandom(D,NULL));
703*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetRandom(D2,NULL));
704*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductCreateWithMat(A,B,NULL,C));
705*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductSetType(C,MATPRODUCT_AB));
706*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductSetFromOptions(C));
707*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductSymbolic(C));
708*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductCreateWithMat(A,C,NULL,D));
709*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductSetType(D, MATPRODUCT_AtB));
710*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductSetFromOptions(D));
711*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductSymbolic(D));
712*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductNumeric(C));
713*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductNumeric(D));
714*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMatMultEqual(AtA,B,D,10,&flg));
7152b723ba2SStefano Zampini     if (!flg) {
716*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMatMult(AtA,C,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&T));
717*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatAXPY(T,-1.0,D,SAME_NONZERO_PATTERN));
718*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(T,NULL));
719*5f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&T));
7202b723ba2SStefano Zampini     }
721*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&C));
722*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&D));
723*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&D2));
724*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&AtA));
7252b723ba2SStefano Zampini   }
7262b723ba2SStefano Zampini 
727*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&X));
728*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&Bt));
729*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&B));
730*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&A));
731*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&R));
732*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&PtAP));
733*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&RARt));
734*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(dataX));
735*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(dataB));
736*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(dataR));
737*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(dataBt));
7386280154eSStefano Zampini   ierr = PetscFinalize();
7396280154eSStefano Zampini   return ierr;
7406280154eSStefano Zampini }
7416280154eSStefano Zampini 
7426280154eSStefano Zampini /*TEST
7436280154eSStefano Zampini 
7446280154eSStefano Zampini   test:
7456280154eSStefano Zampini     suffix: 1
74675ab9b9fSStefano Zampini     args: -local {{0 1}} -testshellops
7476280154eSStefano Zampini 
7486280154eSStefano Zampini   test:
7496280154eSStefano Zampini     output_file: output/ex70_1.out
750456288a8SStefano Zampini     requires: cuda
751456288a8SStefano Zampini     suffix: 1_cuda
752686594dbSStefano Zampini     args: -local {{0 1}} -xgpu {{0 1}} -bgpu {{0 1}} -A_mat_type {{seqaijcusparse seqaij}} -testshellops {{0 1}}
753456288a8SStefano Zampini 
754456288a8SStefano Zampini   test:
755456288a8SStefano Zampini     output_file: output/ex70_1.out
7566280154eSStefano Zampini     nsize: 2
7576280154eSStefano Zampini     suffix: 1_par
75875ab9b9fSStefano Zampini     args: -local {{0 1}} -testmatmatt 0
7596280154eSStefano Zampini 
7606280154eSStefano Zampini   test:
761456288a8SStefano Zampini     output_file: output/ex70_1.out
762456288a8SStefano Zampini     requires: cuda
763456288a8SStefano Zampini     nsize: 2
764456288a8SStefano Zampini     suffix: 1_par_cuda
76575ab9b9fSStefano Zampini     args: -local {{0 1}} -xgpu {{0 1}} -bgpu {{0 1}} -A_mat_type {{mpiaijcusparse mpiaij}} -testnest 0 -testmatmatt 0 -matmatmult_Bbn 3
766456288a8SStefano Zampini 
767456288a8SStefano Zampini   test:
7686280154eSStefano Zampini     output_file: output/ex70_1.out
7696280154eSStefano Zampini     suffix: 2
7706280154eSStefano Zampini     nsize: 1
7716280154eSStefano Zampini     args: -M {{7 11}} -N {{12 9}} -K {{1 3}} -local {{0 1}}
7726280154eSStefano Zampini 
7738a311839SJunchao Zhang   testset:
774456288a8SStefano Zampini     requires: cuda
775456288a8SStefano Zampini     output_file: output/ex70_1.out
776456288a8SStefano Zampini     nsize: 1
777456288a8SStefano Zampini     args: -M 7 -N 9 -K 2 -local {{0 1}} -testnest 0 -A_mat_type {{seqdensecuda seqdense}} -xgpu {{0 1}} -bgpu {{0 1}}
7788a311839SJunchao Zhang     test:
7798a311839SJunchao Zhang       requires: !complex
7808a311839SJunchao Zhang       suffix: 2_cuda_real
7818a311839SJunchao Zhang     test:
7828a311839SJunchao Zhang       # complex+single gives a little bigger error in the MatDenseGetColumnVec test
7838a311839SJunchao Zhang       requires: complex !single
7848a311839SJunchao Zhang       suffix: 2_cuda_complex
785456288a8SStefano Zampini 
786456288a8SStefano Zampini   test:
7876280154eSStefano Zampini     output_file: output/ex70_1.out
7886280154eSStefano Zampini     suffix: 2_par
7896280154eSStefano Zampini     nsize: 2
79075ab9b9fSStefano Zampini     args: -M {{7 11}} -N {{12 9}} -K {{1 3}} -local {{0 1}} -testcircular -testmatmatt 0
7916280154eSStefano Zampini 
7926280154eSStefano Zampini   test:
793456288a8SStefano Zampini     requires: cuda
794456288a8SStefano Zampini     output_file: output/ex70_1.out
795456288a8SStefano Zampini     suffix: 2_par_cuda
796456288a8SStefano Zampini     nsize: 2
79775ab9b9fSStefano Zampini     args: -M 11 -N 9 -K 1 -local {{0 1}} -testcircular 0 -A_mat_type mpiaijcusparse -xgpu -bgpu -testnest 0 -testmatmatt 0
798456288a8SStefano Zampini 
799456288a8SStefano Zampini   test:
8006280154eSStefano Zampini     output_file: output/ex70_1.out
8016280154eSStefano Zampini     suffix: 3
802456288a8SStefano Zampini     nsize: {{1 3}}
80375ab9b9fSStefano Zampini     args: -M 13 -N 13 -K {{1 3}} -local {{0 1}} -A_mat_type sbaij -symm -testproj 0 -testmatmatt 0
8046280154eSStefano Zampini 
8056280154eSStefano Zampini   test:
8066280154eSStefano Zampini     output_file: output/ex70_1.out
8076280154eSStefano Zampini     suffix: 4
8086280154eSStefano Zampini     nsize: 1
8096280154eSStefano Zampini     args: -M 3 -N 3 -K 3 -local {{0 1}} -testcircular
8106280154eSStefano Zampini 
8116280154eSStefano Zampini   test:
8126280154eSStefano Zampini     output_file: output/ex70_1.out
8136280154eSStefano Zampini     suffix: 5
8146280154eSStefano Zampini     nsize: {{2 4}}
815a0638e9dSStefano Zampini     args: -M 3 -N 3 -K 3 -local {{0 1}} -testcircular -testmatmatt 0
8166280154eSStefano Zampini 
8176280154eSStefano Zampini   test:
8186280154eSStefano Zampini     output_file: output/ex70_1.out
8196280154eSStefano Zampini     suffix: 6
8206280154eSStefano Zampini     nsize: 1
82175ab9b9fSStefano Zampini     args: -M {{1 3}} -N {{2 5}} -K {{1 2}} -local {{0 1}} -testcircular
8226280154eSStefano Zampini 
8236280154eSStefano Zampini   test:
8246280154eSStefano Zampini     output_file: output/ex70_1.out
8256280154eSStefano Zampini     suffix: 7
8266280154eSStefano Zampini     nsize: 1
827456288a8SStefano Zampini     args: -M 13 -N 13 -K {{1 3}} -local {{0 1}} -A_mat_type dense -testnest -testcircular
8286718818eSStefano Zampini 
8296280154eSStefano Zampini TEST*/
830