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