186a22c91SHong Zhang 286a22c91SHong Zhang #include "src/mat/matimpl.h" /*I "petscmat.h" I*/ 386a22c91SHong Zhang 486a22c91SHong Zhang #undef __FUNCT__ 586a22c91SHong Zhang #define __FUNCT__ "MatMultEqual" 686a22c91SHong Zhang /*@ 786a22c91SHong Zhang MatMultEqual - Compares matrix-vector products of two matrices. 886a22c91SHong Zhang 986a22c91SHong Zhang Collective on Mat 1086a22c91SHong Zhang 1186a22c91SHong Zhang Input Parameters: 1286a22c91SHong Zhang + A - the first matrix 1386a22c91SHong Zhang - B - the second matrix 1486a22c91SHong Zhang - n - number of random vectors to be tested 1586a22c91SHong Zhang 1686a22c91SHong Zhang Output Parameter: 1786a22c91SHong Zhang . flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise. 1886a22c91SHong Zhang 1986a22c91SHong Zhang Level: intermediate 2086a22c91SHong Zhang 2186a22c91SHong Zhang Concepts: matrices^equality between 2286a22c91SHong Zhang @*/ 2386a22c91SHong Zhang PetscErrorCode MatMultEqual(Mat A,Mat B,PetscInt n,PetscTruth *flg) 2486a22c91SHong Zhang { 2586a22c91SHong Zhang PetscErrorCode ierr; 2686a22c91SHong Zhang Vec x,s1,s2; 2786a22c91SHong Zhang PetscRandom rctx; 2886a22c91SHong Zhang PetscReal r1,r2,tol=1.e-10; 2986a22c91SHong Zhang PetscInt am,an,bm,bn,k; 3086a22c91SHong Zhang 3186a22c91SHong Zhang PetscFunctionBegin; 32*4b497936SBarry Smith PetscValidHeaderSpecific(A,MAT_COOKIE,1); 33*4b497936SBarry Smith PetscValidHeaderSpecific(B,MAT_COOKIE,2); 3486a22c91SHong Zhang ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); 3586a22c91SHong Zhang ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); 3686a22c91SHong Zhang if (am != bm || an != bn) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); 37cb5d8e9eSHong Zhang PetscCheckSameComm(A,1,B,2); 38cb5d8e9eSHong Zhang ierr = PetscRandomCreate(A->comm,RANDOM_DEFAULT,&rctx);CHKERRQ(ierr); 39cb5d8e9eSHong Zhang ierr = VecCreate(A->comm,&x);CHKERRQ(ierr); 4086a22c91SHong Zhang ierr = VecSetSizes(x,an,PETSC_DECIDE);CHKERRQ(ierr); 4186a22c91SHong Zhang ierr = VecSetFromOptions(x);CHKERRQ(ierr); 42cb5d8e9eSHong Zhang 43cb5d8e9eSHong Zhang ierr = VecCreate(A->comm,&s1);CHKERRQ(ierr); 44cb5d8e9eSHong Zhang ierr = VecSetSizes(s1,am,PETSC_DECIDE);CHKERRQ(ierr); 45cb5d8e9eSHong Zhang ierr = VecSetFromOptions(s1);CHKERRQ(ierr); 46cb5d8e9eSHong Zhang ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); 4786a22c91SHong Zhang 484eb6d288SHong Zhang *flg = PETSC_TRUE; 4986a22c91SHong Zhang for (k=0; k<n; k++) { 5086a22c91SHong Zhang ierr = VecSetRandom(rctx,x);CHKERRQ(ierr); 5186a22c91SHong Zhang ierr = MatMult(A,x,s1);CHKERRQ(ierr); 5286a22c91SHong Zhang ierr = MatMult(B,x,s2);CHKERRQ(ierr); 5386a22c91SHong Zhang ierr = VecNorm(s1,NORM_1,&r1);CHKERRQ(ierr); 5486a22c91SHong Zhang ierr = VecNorm(s2,NORM_1,&r2);CHKERRQ(ierr); 5586a22c91SHong Zhang r1 -= r2; 5686a22c91SHong Zhang if (r1<-tol || r1>tol) { 5786a22c91SHong Zhang *flg = PETSC_FALSE; 5863879571SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF,"Error: %d-th MatMult() %g\n",k,r1); 594eb6d288SHong Zhang break; 6086a22c91SHong Zhang } 6186a22c91SHong Zhang } 6286a22c91SHong Zhang ierr = PetscRandomDestroy(rctx);CHKERRQ(ierr); 6386a22c91SHong Zhang ierr = VecDestroy(x);CHKERRQ(ierr); 6486a22c91SHong Zhang ierr = VecDestroy(s1);CHKERRQ(ierr); 6586a22c91SHong Zhang ierr = VecDestroy(s2);CHKERRQ(ierr); 6686a22c91SHong Zhang PetscFunctionReturn(0); 6786a22c91SHong Zhang } 6886a22c91SHong Zhang 6986a22c91SHong Zhang #undef __FUNCT__ 7086a22c91SHong Zhang #define __FUNCT__ "MatMultAddEqual" 7186a22c91SHong Zhang /*@ 7286a22c91SHong Zhang MatMultAddEqual - Compares matrix-vector products of two matrices. 7386a22c91SHong Zhang 7486a22c91SHong Zhang Collective on Mat 7586a22c91SHong Zhang 7686a22c91SHong Zhang Input Parameters: 7786a22c91SHong Zhang + A - the first matrix 7886a22c91SHong Zhang - B - the second matrix 7986a22c91SHong Zhang - n - number of random vectors to be tested 8086a22c91SHong Zhang 8186a22c91SHong Zhang Output Parameter: 8286a22c91SHong Zhang . flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise. 8386a22c91SHong Zhang 8486a22c91SHong Zhang Level: intermediate 8586a22c91SHong Zhang 8686a22c91SHong Zhang Concepts: matrices^equality between 8786a22c91SHong Zhang @*/ 8886a22c91SHong Zhang PetscErrorCode MatMultAddEqual(Mat A,Mat B,PetscInt n,PetscTruth *flg) 8986a22c91SHong Zhang { 9086a22c91SHong Zhang PetscErrorCode ierr; 9186a22c91SHong Zhang Vec x,y,s1,s2; 9286a22c91SHong Zhang PetscRandom rctx; 9386a22c91SHong Zhang PetscReal r1,r2,tol=1.e-10; 9486a22c91SHong Zhang PetscInt am,an,bm,bn,k; 9586a22c91SHong Zhang 9686a22c91SHong Zhang PetscFunctionBegin; 9786a22c91SHong Zhang ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); 9886a22c91SHong Zhang ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); 9986a22c91SHong Zhang if (am != bm || an != bn) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); 100cb5d8e9eSHong Zhang PetscCheckSameComm(A,1,B,2); 101cb5d8e9eSHong Zhang ierr = PetscRandomCreate(A->comm,RANDOM_DEFAULT,&rctx);CHKERRQ(ierr); 102cb5d8e9eSHong Zhang ierr = VecCreate(A->comm,&x);CHKERRQ(ierr); 10386a22c91SHong Zhang ierr = VecSetSizes(x,an,PETSC_DECIDE);CHKERRQ(ierr); 10486a22c91SHong Zhang ierr = VecSetFromOptions(x);CHKERRQ(ierr); 10563879571SHong Zhang 10663879571SHong Zhang ierr = VecCreate(A->comm,&s1);CHKERRQ(ierr); 10763879571SHong Zhang ierr = VecSetSizes(s1,am,PETSC_DECIDE);CHKERRQ(ierr); 10863879571SHong Zhang ierr = VecSetFromOptions(s1);CHKERRQ(ierr); 10963879571SHong Zhang ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); 11063879571SHong Zhang ierr = VecDuplicate(s1,&y);CHKERRQ(ierr); 11186a22c91SHong Zhang 1124eb6d288SHong Zhang *flg = PETSC_TRUE; 11386a22c91SHong Zhang for (k=0; k<n; k++) { 11486a22c91SHong Zhang ierr = VecSetRandom(rctx,x);CHKERRQ(ierr); 11586a22c91SHong Zhang ierr = VecSetRandom(rctx,y);CHKERRQ(ierr); 11686a22c91SHong Zhang ierr = MatMultAdd(A,x,y,s1);CHKERRQ(ierr); 11786a22c91SHong Zhang ierr = MatMultAdd(B,x,y,s2);CHKERRQ(ierr); 11886a22c91SHong Zhang ierr = VecNorm(s1,NORM_1,&r1);CHKERRQ(ierr); 11986a22c91SHong Zhang ierr = VecNorm(s2,NORM_1,&r2);CHKERRQ(ierr); 12086a22c91SHong Zhang r1 -= r2; 12186a22c91SHong Zhang if (r1<-tol || r1>tol) { 12286a22c91SHong Zhang *flg = PETSC_FALSE; 12363879571SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF,"Error: %d-th MatMultAdd() %g\n",k,r1); 12463879571SHong Zhang break; 12563879571SHong Zhang } 12663879571SHong Zhang } 12763879571SHong Zhang ierr = PetscRandomDestroy(rctx);CHKERRQ(ierr); 12863879571SHong Zhang ierr = VecDestroy(x);CHKERRQ(ierr); 12963879571SHong Zhang ierr = VecDestroy(y);CHKERRQ(ierr); 13063879571SHong Zhang ierr = VecDestroy(s1);CHKERRQ(ierr); 13163879571SHong Zhang ierr = VecDestroy(s2);CHKERRQ(ierr); 13263879571SHong Zhang PetscFunctionReturn(0); 13363879571SHong Zhang } 13463879571SHong Zhang 13563879571SHong Zhang #undef __FUNCT__ 13663879571SHong Zhang #define __FUNCT__ "MatMultTransposeEqual" 13763879571SHong Zhang /*@ 13863879571SHong Zhang MatMultTransposeEqual - Compares matrix-vector products of two matrices. 13963879571SHong Zhang 14063879571SHong Zhang Collective on Mat 14163879571SHong Zhang 14263879571SHong Zhang Input Parameters: 14363879571SHong Zhang + A - the first matrix 14463879571SHong Zhang - B - the second matrix 14563879571SHong Zhang - n - number of random vectors to be tested 14663879571SHong Zhang 14763879571SHong Zhang Output Parameter: 14863879571SHong Zhang . flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise. 14963879571SHong Zhang 15063879571SHong Zhang Level: intermediate 15163879571SHong Zhang 15263879571SHong Zhang Concepts: matrices^equality between 15363879571SHong Zhang @*/ 15463879571SHong Zhang PetscErrorCode MatMultTransposeEqual(Mat A,Mat B,PetscInt n,PetscTruth *flg) 15563879571SHong Zhang { 15663879571SHong Zhang PetscErrorCode ierr; 15763879571SHong Zhang Vec x,s1,s2; 15863879571SHong Zhang PetscRandom rctx; 15963879571SHong Zhang PetscReal r1,r2,tol=1.e-10; 16063879571SHong Zhang PetscInt am,an,bm,bn,k; 16163879571SHong Zhang 16263879571SHong Zhang PetscFunctionBegin; 16363879571SHong Zhang ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); 16463879571SHong Zhang ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); 16563879571SHong Zhang if (am != bm || an != bn) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); 16663879571SHong Zhang PetscCheckSameComm(A,1,B,2); 16763879571SHong Zhang ierr = PetscRandomCreate(A->comm,RANDOM_DEFAULT,&rctx);CHKERRQ(ierr); 16863879571SHong Zhang ierr = VecCreate(A->comm,&x);CHKERRQ(ierr); 16963879571SHong Zhang ierr = VecSetSizes(x,am,PETSC_DECIDE);CHKERRQ(ierr); 17063879571SHong Zhang ierr = VecSetFromOptions(x);CHKERRQ(ierr); 17163879571SHong Zhang 17263879571SHong Zhang ierr = VecCreate(A->comm,&s1);CHKERRQ(ierr); 17363879571SHong Zhang ierr = VecSetSizes(s1,an,PETSC_DECIDE);CHKERRQ(ierr); 17463879571SHong Zhang ierr = VecSetFromOptions(s1);CHKERRQ(ierr); 17563879571SHong Zhang ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); 17663879571SHong Zhang 17763879571SHong Zhang *flg = PETSC_TRUE; 17863879571SHong Zhang for (k=0; k<n; k++) { 17963879571SHong Zhang ierr = VecSetRandom(rctx,x);CHKERRQ(ierr); 18063879571SHong Zhang ierr = MatMultTranspose(A,x,s1);CHKERRQ(ierr); 18163879571SHong Zhang ierr = MatMultTranspose(B,x,s2);CHKERRQ(ierr); 18263879571SHong Zhang ierr = VecNorm(s1,NORM_1,&r1);CHKERRQ(ierr); 18363879571SHong Zhang ierr = VecNorm(s2,NORM_1,&r2);CHKERRQ(ierr); 18463879571SHong Zhang r1 -= r2; 18563879571SHong Zhang if (r1<-tol || r1>tol) { 18663879571SHong Zhang *flg = PETSC_FALSE; 18763879571SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF,"Error: %d-th MatMultTranspose() %g\n",k,r1); 18863879571SHong Zhang break; 18963879571SHong Zhang } 19063879571SHong Zhang } 19163879571SHong Zhang ierr = PetscRandomDestroy(rctx);CHKERRQ(ierr); 19263879571SHong Zhang ierr = VecDestroy(x);CHKERRQ(ierr); 19363879571SHong Zhang ierr = VecDestroy(s1);CHKERRQ(ierr); 19463879571SHong Zhang ierr = VecDestroy(s2);CHKERRQ(ierr); 19563879571SHong Zhang PetscFunctionReturn(0); 19663879571SHong Zhang } 19763879571SHong Zhang 19863879571SHong Zhang #undef __FUNCT__ 19963879571SHong Zhang #define __FUNCT__ "MatMultTransposeAddEqual" 20063879571SHong Zhang /*@ 20163879571SHong Zhang MatMultTransposeAddEqual - Compares matrix-vector products of two matrices. 20263879571SHong Zhang 20363879571SHong Zhang Collective on Mat 20463879571SHong Zhang 20563879571SHong Zhang Input Parameters: 20663879571SHong Zhang + A - the first matrix 20763879571SHong Zhang - B - the second matrix 20863879571SHong Zhang - n - number of random vectors to be tested 20963879571SHong Zhang 21063879571SHong Zhang Output Parameter: 21163879571SHong Zhang . flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise. 21263879571SHong Zhang 21363879571SHong Zhang Level: intermediate 21463879571SHong Zhang 21563879571SHong Zhang Concepts: matrices^equality between 21663879571SHong Zhang @*/ 21763879571SHong Zhang PetscErrorCode MatMultTransposeAddEqual(Mat A,Mat B,PetscInt n,PetscTruth *flg) 21863879571SHong Zhang { 21963879571SHong Zhang PetscErrorCode ierr; 22063879571SHong Zhang Vec x,y,s1,s2; 22163879571SHong Zhang PetscRandom rctx; 22263879571SHong Zhang PetscReal r1,r2,tol=1.e-10; 22363879571SHong Zhang PetscInt am,an,bm,bn,k; 22463879571SHong Zhang 22563879571SHong Zhang PetscFunctionBegin; 22663879571SHong Zhang ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); 22763879571SHong Zhang ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); 22863879571SHong Zhang if (am != bm || an != bn) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); 22963879571SHong Zhang PetscCheckSameComm(A,1,B,2); 23063879571SHong Zhang ierr = PetscRandomCreate(A->comm,RANDOM_DEFAULT,&rctx);CHKERRQ(ierr); 23163879571SHong Zhang ierr = VecCreate(A->comm,&x);CHKERRQ(ierr); 23263879571SHong Zhang ierr = VecSetSizes(x,am,PETSC_DECIDE);CHKERRQ(ierr); 23363879571SHong Zhang ierr = VecSetFromOptions(x);CHKERRQ(ierr); 23463879571SHong Zhang 23563879571SHong Zhang ierr = VecCreate(A->comm,&s1);CHKERRQ(ierr); 23663879571SHong Zhang ierr = VecSetSizes(s1,an,PETSC_DECIDE);CHKERRQ(ierr); 23763879571SHong Zhang ierr = VecSetFromOptions(s1);CHKERRQ(ierr); 23863879571SHong Zhang ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); 23963879571SHong Zhang ierr = VecDuplicate(s1,&y);CHKERRQ(ierr); 24063879571SHong Zhang 24163879571SHong Zhang *flg = PETSC_TRUE; 24263879571SHong Zhang for (k=0; k<n; k++) { 24363879571SHong Zhang ierr = VecSetRandom(rctx,x);CHKERRQ(ierr); 24463879571SHong Zhang ierr = VecSetRandom(rctx,y);CHKERRQ(ierr); 24563879571SHong Zhang ierr = MatMultTransposeAdd(A,x,y,s1);CHKERRQ(ierr); 24663879571SHong Zhang ierr = MatMultTransposeAdd(B,x,y,s2);CHKERRQ(ierr); 24763879571SHong Zhang ierr = VecNorm(s1,NORM_1,&r1);CHKERRQ(ierr); 24863879571SHong Zhang ierr = VecNorm(s2,NORM_1,&r2);CHKERRQ(ierr); 24963879571SHong Zhang r1 -= r2; 25063879571SHong Zhang if (r1<-tol || r1>tol) { 25163879571SHong Zhang *flg = PETSC_FALSE; 25263879571SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF,"Error: %d-th MatMultTransposeAdd() %g\n",k,r1); 2534eb6d288SHong Zhang break; 25486a22c91SHong Zhang } 25586a22c91SHong Zhang } 25686a22c91SHong Zhang ierr = PetscRandomDestroy(rctx);CHKERRQ(ierr); 25786a22c91SHong Zhang ierr = VecDestroy(x);CHKERRQ(ierr); 25886a22c91SHong Zhang ierr = VecDestroy(y);CHKERRQ(ierr); 25986a22c91SHong Zhang ierr = VecDestroy(s1);CHKERRQ(ierr); 26086a22c91SHong Zhang ierr = VecDestroy(s2);CHKERRQ(ierr); 26186a22c91SHong Zhang PetscFunctionReturn(0); 26286a22c91SHong Zhang } 263