xref: /petsc/src/mat/utils/multequal.c (revision ce94432eddcd14845bc7e8083b7f8ea723b9bf7d)
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