186a22c91SHong Zhang 2b45d2f2cSJed Brown #include <petsc-private/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 @*/ 237087cfbeSBarry Smith PetscErrorCode MatMultEqual(Mat A,Mat B,PetscInt n,PetscBool *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; 30e6e6b1bdSHong Zhang PetscScalar none = -1.0; 3186a22c91SHong Zhang 3286a22c91SHong Zhang PetscFunctionBegin; 330700a824SBarry Smith PetscValidHeaderSpecific(A,MAT_CLASSID,1); 340700a824SBarry Smith PetscValidHeaderSpecific(B,MAT_CLASSID,2); 3586a22c91SHong Zhang ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); 3686a22c91SHong Zhang ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); 37e32f2f54SBarry Smith if (am != bm || an != bn) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); 38cb5d8e9eSHong Zhang PetscCheckSameComm(A,1,B,2); 394fcfbe5fSBarry Smith 40ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 414fcfbe5fSBarry Smith tol = 1.e-5; 424fcfbe5fSBarry Smith #endif 43*ce94432eSBarry Smith ierr = PetscRandomCreate(PetscObjectComm((PetscObject)A),&rctx);CHKERRQ(ierr); 44c77d6671SHong Zhang ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); 45*ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)A),&x);CHKERRQ(ierr); 4686a22c91SHong Zhang ierr = VecSetSizes(x,an,PETSC_DECIDE);CHKERRQ(ierr); 4786a22c91SHong Zhang ierr = VecSetFromOptions(x);CHKERRQ(ierr); 48cb5d8e9eSHong Zhang 49*ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)A),&s1);CHKERRQ(ierr); 50cb5d8e9eSHong Zhang ierr = VecSetSizes(s1,am,PETSC_DECIDE);CHKERRQ(ierr); 51cb5d8e9eSHong Zhang ierr = VecSetFromOptions(s1);CHKERRQ(ierr); 52cb5d8e9eSHong Zhang ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); 5386a22c91SHong Zhang 544eb6d288SHong Zhang *flg = PETSC_TRUE; 5586a22c91SHong Zhang for (k=0; k<n; k++) { 56abb0e124SMatthew Knepley ierr = VecSetRandom(x,rctx);CHKERRQ(ierr); 5786a22c91SHong Zhang ierr = MatMult(A,x,s1);CHKERRQ(ierr); 5886a22c91SHong Zhang ierr = MatMult(B,x,s2);CHKERRQ(ierr); 59e6e6b1bdSHong Zhang ierr = VecNorm(s2,NORM_INFINITY,&r2);CHKERRQ(ierr); 60e6e6b1bdSHong Zhang if (r2 < tol) { 61e6e6b1bdSHong Zhang ierr = VecNorm(s1,NORM_INFINITY,&r1);CHKERRQ(ierr); 62e6e6b1bdSHong Zhang } else { 632dcb1b2aSMatthew Knepley ierr = VecAXPY(s2,none,s1);CHKERRQ(ierr); 64e6e6b1bdSHong Zhang ierr = VecNorm(s2,NORM_INFINITY,&r1);CHKERRQ(ierr); 65e6e6b1bdSHong Zhang r1 /= r2; 66e6e6b1bdSHong Zhang } 67e6e6b1bdSHong Zhang if (r1 > tol) { 6886a22c91SHong Zhang *flg = PETSC_FALSE; 691e2582c4SBarry Smith ierr = PetscInfo2(A,"Error: %D-th MatMult() %G\n",k,r1);CHKERRQ(ierr); 704eb6d288SHong Zhang break; 7186a22c91SHong Zhang } 7286a22c91SHong Zhang } 736bf464f9SBarry Smith ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); 746bf464f9SBarry Smith ierr = VecDestroy(&x);CHKERRQ(ierr); 756bf464f9SBarry Smith ierr = VecDestroy(&s1);CHKERRQ(ierr); 766bf464f9SBarry Smith ierr = VecDestroy(&s2);CHKERRQ(ierr); 7786a22c91SHong Zhang PetscFunctionReturn(0); 7886a22c91SHong Zhang } 7986a22c91SHong Zhang 8086a22c91SHong Zhang #undef __FUNCT__ 8186a22c91SHong Zhang #define __FUNCT__ "MatMultAddEqual" 8286a22c91SHong Zhang /*@ 8386a22c91SHong Zhang MatMultAddEqual - Compares matrix-vector products of two matrices. 8486a22c91SHong Zhang 8586a22c91SHong Zhang Collective on Mat 8686a22c91SHong Zhang 8786a22c91SHong Zhang Input Parameters: 8886a22c91SHong Zhang + A - the first matrix 8986a22c91SHong Zhang - B - the second matrix 9086a22c91SHong Zhang - n - number of random vectors to be tested 9186a22c91SHong Zhang 9286a22c91SHong Zhang Output Parameter: 9386a22c91SHong Zhang . flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise. 9486a22c91SHong Zhang 9586a22c91SHong Zhang Level: intermediate 9686a22c91SHong Zhang 9786a22c91SHong Zhang Concepts: matrices^equality between 9886a22c91SHong Zhang @*/ 997087cfbeSBarry Smith PetscErrorCode MatMultAddEqual(Mat A,Mat B,PetscInt n,PetscBool *flg) 10086a22c91SHong Zhang { 10186a22c91SHong Zhang PetscErrorCode ierr; 10286a22c91SHong Zhang Vec x,y,s1,s2; 10386a22c91SHong Zhang PetscRandom rctx; 10486a22c91SHong Zhang PetscReal r1,r2,tol=1.e-10; 10586a22c91SHong Zhang PetscInt am,an,bm,bn,k; 106e6e6b1bdSHong Zhang PetscScalar none = -1.0; 10786a22c91SHong Zhang 10886a22c91SHong Zhang PetscFunctionBegin; 10986a22c91SHong Zhang ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); 11086a22c91SHong Zhang ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); 111e32f2f54SBarry Smith if (am != bm || an != bn) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); 112cb5d8e9eSHong Zhang PetscCheckSameComm(A,1,B,2); 113*ce94432eSBarry Smith ierr = PetscRandomCreate(PetscObjectComm((PetscObject)A),&rctx);CHKERRQ(ierr); 114c77d6671SHong Zhang ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); 115*ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)A),&x);CHKERRQ(ierr); 11686a22c91SHong Zhang ierr = VecSetSizes(x,an,PETSC_DECIDE);CHKERRQ(ierr); 11786a22c91SHong Zhang ierr = VecSetFromOptions(x);CHKERRQ(ierr); 11863879571SHong Zhang 119*ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)A),&s1);CHKERRQ(ierr); 12063879571SHong Zhang ierr = VecSetSizes(s1,am,PETSC_DECIDE);CHKERRQ(ierr); 12163879571SHong Zhang ierr = VecSetFromOptions(s1);CHKERRQ(ierr); 12263879571SHong Zhang ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); 12363879571SHong Zhang ierr = VecDuplicate(s1,&y);CHKERRQ(ierr); 12486a22c91SHong Zhang 1254eb6d288SHong Zhang *flg = PETSC_TRUE; 12686a22c91SHong Zhang for (k=0; k<n; k++) { 127abb0e124SMatthew Knepley ierr = VecSetRandom(x,rctx);CHKERRQ(ierr); 128abb0e124SMatthew Knepley ierr = VecSetRandom(y,rctx);CHKERRQ(ierr); 12986a22c91SHong Zhang ierr = MatMultAdd(A,x,y,s1);CHKERRQ(ierr); 13086a22c91SHong Zhang ierr = MatMultAdd(B,x,y,s2);CHKERRQ(ierr); 131e6e6b1bdSHong Zhang ierr = VecNorm(s2,NORM_INFINITY,&r2);CHKERRQ(ierr); 132e6e6b1bdSHong Zhang if (r2 < tol) { 133e6e6b1bdSHong Zhang ierr = VecNorm(s1,NORM_INFINITY,&r1);CHKERRQ(ierr); 134e6e6b1bdSHong Zhang } else { 1352dcb1b2aSMatthew Knepley ierr = VecAXPY(s2,none,s1);CHKERRQ(ierr); 136e6e6b1bdSHong Zhang ierr = VecNorm(s2,NORM_INFINITY,&r1);CHKERRQ(ierr); 137e6e6b1bdSHong Zhang r1 /= r2; 138e6e6b1bdSHong Zhang } 139e6e6b1bdSHong Zhang if (r1 > tol) { 14086a22c91SHong Zhang *flg = PETSC_FALSE; 1411e2582c4SBarry Smith ierr = PetscInfo2(A,"Error: %d-th MatMultAdd() %G\n",k,r1);CHKERRQ(ierr); 14263879571SHong Zhang break; 14363879571SHong Zhang } 14463879571SHong Zhang } 1456bf464f9SBarry Smith ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); 1466bf464f9SBarry Smith ierr = VecDestroy(&x);CHKERRQ(ierr); 1476bf464f9SBarry Smith ierr = VecDestroy(&y);CHKERRQ(ierr); 1486bf464f9SBarry Smith ierr = VecDestroy(&s1);CHKERRQ(ierr); 1496bf464f9SBarry Smith ierr = VecDestroy(&s2);CHKERRQ(ierr); 15063879571SHong Zhang PetscFunctionReturn(0); 15163879571SHong Zhang } 15263879571SHong Zhang 15363879571SHong Zhang #undef __FUNCT__ 15463879571SHong Zhang #define __FUNCT__ "MatMultTransposeEqual" 15563879571SHong Zhang /*@ 15663879571SHong Zhang MatMultTransposeEqual - Compares matrix-vector products of two matrices. 15763879571SHong Zhang 15863879571SHong Zhang Collective on Mat 15963879571SHong Zhang 16063879571SHong Zhang Input Parameters: 16163879571SHong Zhang + A - the first matrix 16263879571SHong Zhang - B - the second matrix 16363879571SHong Zhang - n - number of random vectors to be tested 16463879571SHong Zhang 16563879571SHong Zhang Output Parameter: 16663879571SHong Zhang . flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise. 16763879571SHong Zhang 16863879571SHong Zhang Level: intermediate 16963879571SHong Zhang 17063879571SHong Zhang Concepts: matrices^equality between 17163879571SHong Zhang @*/ 1727087cfbeSBarry Smith PetscErrorCode MatMultTransposeEqual(Mat A,Mat B,PetscInt n,PetscBool *flg) 17363879571SHong Zhang { 17463879571SHong Zhang PetscErrorCode ierr; 17563879571SHong Zhang Vec x,s1,s2; 17663879571SHong Zhang PetscRandom rctx; 17763879571SHong Zhang PetscReal r1,r2,tol=1.e-10; 17863879571SHong Zhang PetscInt am,an,bm,bn,k; 179e6e6b1bdSHong Zhang PetscScalar none = -1.0; 18063879571SHong Zhang 18163879571SHong Zhang PetscFunctionBegin; 18263879571SHong Zhang ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); 18363879571SHong Zhang ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); 184e32f2f54SBarry Smith if (am != bm || an != bn) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); 18563879571SHong Zhang PetscCheckSameComm(A,1,B,2); 186*ce94432eSBarry Smith ierr = PetscRandomCreate(PetscObjectComm((PetscObject)A),&rctx);CHKERRQ(ierr); 187c77d6671SHong Zhang ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); 188*ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)A),&x);CHKERRQ(ierr); 18963879571SHong Zhang ierr = VecSetSizes(x,am,PETSC_DECIDE);CHKERRQ(ierr); 19063879571SHong Zhang ierr = VecSetFromOptions(x);CHKERRQ(ierr); 19163879571SHong Zhang 192*ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)A),&s1);CHKERRQ(ierr); 19363879571SHong Zhang ierr = VecSetSizes(s1,an,PETSC_DECIDE);CHKERRQ(ierr); 19463879571SHong Zhang ierr = VecSetFromOptions(s1);CHKERRQ(ierr); 19563879571SHong Zhang ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); 19663879571SHong Zhang 19763879571SHong Zhang *flg = PETSC_TRUE; 19863879571SHong Zhang for (k=0; k<n; k++) { 199abb0e124SMatthew Knepley ierr = VecSetRandom(x,rctx);CHKERRQ(ierr); 20063879571SHong Zhang ierr = MatMultTranspose(A,x,s1);CHKERRQ(ierr); 20163879571SHong Zhang ierr = MatMultTranspose(B,x,s2);CHKERRQ(ierr); 202e6e6b1bdSHong Zhang ierr = VecNorm(s2,NORM_INFINITY,&r2);CHKERRQ(ierr); 203e6e6b1bdSHong Zhang if (r2 < tol) { 204e6e6b1bdSHong Zhang ierr = VecNorm(s1,NORM_INFINITY,&r1);CHKERRQ(ierr); 205e6e6b1bdSHong Zhang } else { 2062dcb1b2aSMatthew Knepley ierr = VecAXPY(s2,none,s1);CHKERRQ(ierr); 207e6e6b1bdSHong Zhang ierr = VecNorm(s2,NORM_INFINITY,&r1);CHKERRQ(ierr); 208e6e6b1bdSHong Zhang r1 /= r2; 209e6e6b1bdSHong Zhang } 210e6e6b1bdSHong Zhang if (r1 > tol) { 21163879571SHong Zhang *flg = PETSC_FALSE; 2121e2582c4SBarry Smith ierr = PetscInfo2(A,"Error: %d-th MatMultTranspose() %G\n",k,r1);CHKERRQ(ierr); 21363879571SHong Zhang break; 21463879571SHong Zhang } 21563879571SHong Zhang } 2166bf464f9SBarry Smith ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); 2176bf464f9SBarry Smith ierr = VecDestroy(&x);CHKERRQ(ierr); 2186bf464f9SBarry Smith ierr = VecDestroy(&s1);CHKERRQ(ierr); 2196bf464f9SBarry Smith ierr = VecDestroy(&s2);CHKERRQ(ierr); 22063879571SHong Zhang PetscFunctionReturn(0); 22163879571SHong Zhang } 22263879571SHong Zhang 22363879571SHong Zhang #undef __FUNCT__ 22463879571SHong Zhang #define __FUNCT__ "MatMultTransposeAddEqual" 22563879571SHong Zhang /*@ 22663879571SHong Zhang MatMultTransposeAddEqual - Compares matrix-vector products of two matrices. 22763879571SHong Zhang 22863879571SHong Zhang Collective on Mat 22963879571SHong Zhang 23063879571SHong Zhang Input Parameters: 23163879571SHong Zhang + A - the first matrix 23263879571SHong Zhang - B - the second matrix 23363879571SHong Zhang - n - number of random vectors to be tested 23463879571SHong Zhang 23563879571SHong Zhang Output Parameter: 23663879571SHong Zhang . flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise. 23763879571SHong Zhang 23863879571SHong Zhang Level: intermediate 23963879571SHong Zhang 24063879571SHong Zhang Concepts: matrices^equality between 24163879571SHong Zhang @*/ 2427087cfbeSBarry Smith PetscErrorCode MatMultTransposeAddEqual(Mat A,Mat B,PetscInt n,PetscBool *flg) 24363879571SHong Zhang { 24463879571SHong Zhang PetscErrorCode ierr; 24563879571SHong Zhang Vec x,y,s1,s2; 24663879571SHong Zhang PetscRandom rctx; 24763879571SHong Zhang PetscReal r1,r2,tol=1.e-10; 24863879571SHong Zhang PetscInt am,an,bm,bn,k; 249e6e6b1bdSHong Zhang PetscScalar none = -1.0; 25063879571SHong Zhang 25163879571SHong Zhang PetscFunctionBegin; 25263879571SHong Zhang ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); 25363879571SHong Zhang ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); 254e32f2f54SBarry Smith if (am != bm || an != bn) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); 25563879571SHong Zhang PetscCheckSameComm(A,1,B,2); 256*ce94432eSBarry Smith ierr = PetscRandomCreate(PetscObjectComm((PetscObject)A),&rctx);CHKERRQ(ierr); 257c77d6671SHong Zhang ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); 258*ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)A),&x);CHKERRQ(ierr); 25963879571SHong Zhang ierr = VecSetSizes(x,am,PETSC_DECIDE);CHKERRQ(ierr); 26063879571SHong Zhang ierr = VecSetFromOptions(x);CHKERRQ(ierr); 26163879571SHong Zhang 262*ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)A),&s1);CHKERRQ(ierr); 26363879571SHong Zhang ierr = VecSetSizes(s1,an,PETSC_DECIDE);CHKERRQ(ierr); 26463879571SHong Zhang ierr = VecSetFromOptions(s1);CHKERRQ(ierr); 26563879571SHong Zhang ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); 26663879571SHong Zhang ierr = VecDuplicate(s1,&y);CHKERRQ(ierr); 26763879571SHong Zhang 26863879571SHong Zhang *flg = PETSC_TRUE; 26963879571SHong Zhang for (k=0; k<n; k++) { 270abb0e124SMatthew Knepley ierr = VecSetRandom(x,rctx);CHKERRQ(ierr); 271abb0e124SMatthew Knepley ierr = VecSetRandom(y,rctx);CHKERRQ(ierr); 27263879571SHong Zhang ierr = MatMultTransposeAdd(A,x,y,s1);CHKERRQ(ierr); 27363879571SHong Zhang ierr = MatMultTransposeAdd(B,x,y,s2);CHKERRQ(ierr); 274e6e6b1bdSHong Zhang ierr = VecNorm(s2,NORM_INFINITY,&r2);CHKERRQ(ierr); 275e6e6b1bdSHong Zhang if (r2 < tol) { 276e6e6b1bdSHong Zhang ierr = VecNorm(s1,NORM_INFINITY,&r1);CHKERRQ(ierr); 277e6e6b1bdSHong Zhang } else { 2782dcb1b2aSMatthew Knepley ierr = VecAXPY(s2,none,s1);CHKERRQ(ierr); 279e6e6b1bdSHong Zhang ierr = VecNorm(s2,NORM_INFINITY,&r1);CHKERRQ(ierr); 280e6e6b1bdSHong Zhang r1 /= r2; 281e6e6b1bdSHong Zhang } 282e6e6b1bdSHong Zhang if (r1 > tol) { 28363879571SHong Zhang *flg = PETSC_FALSE; 2841e2582c4SBarry Smith ierr = PetscInfo2(A,"Error: %d-th MatMultTransposeAdd() %G\n",k,r1);CHKERRQ(ierr); 2854eb6d288SHong Zhang break; 28686a22c91SHong Zhang } 28786a22c91SHong Zhang } 2886bf464f9SBarry Smith ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); 2896bf464f9SBarry Smith ierr = VecDestroy(&x);CHKERRQ(ierr); 2906bf464f9SBarry Smith ierr = VecDestroy(&y);CHKERRQ(ierr); 2916bf464f9SBarry Smith ierr = VecDestroy(&s1);CHKERRQ(ierr); 2926bf464f9SBarry Smith ierr = VecDestroy(&s2);CHKERRQ(ierr); 29386a22c91SHong Zhang PetscFunctionReturn(0); 29486a22c91SHong Zhang } 295