xref: /petsc/src/mat/utils/multequal.c (revision cb5d8e9ef36bd5726d5c4e38d977490d990864c9)
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;
3286a22c91SHong Zhang   ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr);
3386a22c91SHong Zhang   ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr);
3486a22c91SHong 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);
35*cb5d8e9eSHong Zhang   PetscCheckSameComm(A,1,B,2);
36*cb5d8e9eSHong Zhang   ierr = PetscRandomCreate(A->comm,RANDOM_DEFAULT,&rctx);CHKERRQ(ierr);
37*cb5d8e9eSHong Zhang   ierr = VecCreate(A->comm,&x);CHKERRQ(ierr);
3886a22c91SHong Zhang   ierr = VecSetSizes(x,an,PETSC_DECIDE);CHKERRQ(ierr);
3986a22c91SHong Zhang   ierr = VecSetFromOptions(x);CHKERRQ(ierr);
40*cb5d8e9eSHong Zhang 
41*cb5d8e9eSHong Zhang   ierr = VecCreate(A->comm,&s1);CHKERRQ(ierr);
42*cb5d8e9eSHong Zhang   ierr = VecSetSizes(s1,am,PETSC_DECIDE);CHKERRQ(ierr);
43*cb5d8e9eSHong Zhang   ierr = VecSetFromOptions(s1);CHKERRQ(ierr);
44*cb5d8e9eSHong Zhang   ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr);
4586a22c91SHong Zhang 
4686a22c91SHong Zhang   for (k=0; k<n; k++) {
4786a22c91SHong Zhang     ierr = VecSetRandom(rctx,x);CHKERRQ(ierr);
4886a22c91SHong Zhang     ierr = MatMult(A,x,s1);CHKERRQ(ierr);
4986a22c91SHong Zhang     ierr = MatMult(B,x,s2);CHKERRQ(ierr);
5086a22c91SHong Zhang     ierr = VecNorm(s1,NORM_1,&r1);CHKERRQ(ierr);
5186a22c91SHong Zhang     ierr = VecNorm(s2,NORM_1,&r2);CHKERRQ(ierr);
5286a22c91SHong Zhang     r1 -= r2;
5386a22c91SHong Zhang     if (r1<-tol || r1>tol) {
5486a22c91SHong Zhang       *flg = PETSC_FALSE;
5586a22c91SHong Zhang     } else {
5686a22c91SHong Zhang       *flg = PETSC_TRUE;
5786a22c91SHong Zhang     }
5886a22c91SHong Zhang   }
5986a22c91SHong Zhang   ierr = PetscRandomDestroy(rctx);CHKERRQ(ierr);
6086a22c91SHong Zhang   ierr = VecDestroy(x);CHKERRQ(ierr);
6186a22c91SHong Zhang   ierr = VecDestroy(s1);CHKERRQ(ierr);
6286a22c91SHong Zhang   ierr = VecDestroy(s2);CHKERRQ(ierr);
6386a22c91SHong Zhang   PetscFunctionReturn(0);
6486a22c91SHong Zhang }
6586a22c91SHong Zhang 
6686a22c91SHong Zhang #undef __FUNCT__
6786a22c91SHong Zhang #define __FUNCT__ "MatMultAddEqual"
6886a22c91SHong Zhang /*@
6986a22c91SHong Zhang    MatMultAddEqual - Compares matrix-vector products of two matrices.
7086a22c91SHong Zhang 
7186a22c91SHong Zhang    Collective on Mat
7286a22c91SHong Zhang 
7386a22c91SHong Zhang    Input Parameters:
7486a22c91SHong Zhang +  A - the first matrix
7586a22c91SHong Zhang -  B - the second matrix
7686a22c91SHong Zhang -  n - number of random vectors to be tested
7786a22c91SHong Zhang 
7886a22c91SHong Zhang    Output Parameter:
7986a22c91SHong Zhang .  flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise.
8086a22c91SHong Zhang 
8186a22c91SHong Zhang    Level: intermediate
8286a22c91SHong Zhang 
8386a22c91SHong Zhang    Concepts: matrices^equality between
8486a22c91SHong Zhang @*/
8586a22c91SHong Zhang PetscErrorCode MatMultAddEqual(Mat A,Mat B,PetscInt n,PetscTruth *flg)
8686a22c91SHong Zhang {
8786a22c91SHong Zhang   PetscErrorCode ierr;
8886a22c91SHong Zhang   Vec            x,y,s1,s2;
8986a22c91SHong Zhang   PetscRandom    rctx;
9086a22c91SHong Zhang   PetscReal      r1,r2,tol=1.e-10;
9186a22c91SHong Zhang   PetscInt       am,an,bm,bn,k;
9286a22c91SHong Zhang 
9386a22c91SHong Zhang   PetscFunctionBegin;
9486a22c91SHong Zhang   ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr);
9586a22c91SHong Zhang   ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr);
9686a22c91SHong 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);
97*cb5d8e9eSHong Zhang   PetscCheckSameComm(A,1,B,2);
98*cb5d8e9eSHong Zhang   ierr = PetscRandomCreate(A->comm,RANDOM_DEFAULT,&rctx);CHKERRQ(ierr);
99*cb5d8e9eSHong Zhang   ierr = VecCreate(A->comm,&x);CHKERRQ(ierr);
10086a22c91SHong Zhang   ierr = VecSetSizes(x,an,PETSC_DECIDE);CHKERRQ(ierr);
10186a22c91SHong Zhang   ierr = VecSetFromOptions(x);CHKERRQ(ierr);
10286a22c91SHong Zhang   ierr = VecDuplicate(x,&y);CHKERRQ(ierr);
10386a22c91SHong Zhang   ierr = VecDuplicate(x,&s1);CHKERRQ(ierr);
10486a22c91SHong Zhang   ierr = VecDuplicate(x,&s2);CHKERRQ(ierr);
10586a22c91SHong Zhang 
10686a22c91SHong Zhang   for (k=0; k<n; k++) {
10786a22c91SHong Zhang     ierr = VecSetRandom(rctx,x);CHKERRQ(ierr);
10886a22c91SHong Zhang     ierr = VecSetRandom(rctx,y);CHKERRQ(ierr);
10986a22c91SHong Zhang     ierr = MatMultAdd(A,x,y,s1);CHKERRQ(ierr);
11086a22c91SHong Zhang     ierr = MatMultAdd(B,x,y,s2);CHKERRQ(ierr);
11186a22c91SHong Zhang     ierr = VecNorm(s1,NORM_1,&r1);CHKERRQ(ierr);
11286a22c91SHong Zhang     ierr = VecNorm(s2,NORM_1,&r2);CHKERRQ(ierr);
11386a22c91SHong Zhang     r1 -= r2;
11486a22c91SHong Zhang     if (r1<-tol || r1>tol) {
11586a22c91SHong Zhang       *flg = PETSC_FALSE;
11686a22c91SHong Zhang     } else {
11786a22c91SHong Zhang       *flg = PETSC_TRUE;
11886a22c91SHong Zhang     }
11986a22c91SHong Zhang   }
12086a22c91SHong Zhang   ierr = PetscRandomDestroy(rctx);CHKERRQ(ierr);
12186a22c91SHong Zhang   ierr = VecDestroy(x);CHKERRQ(ierr);
12286a22c91SHong Zhang   ierr = VecDestroy(y);CHKERRQ(ierr);
12386a22c91SHong Zhang   ierr = VecDestroy(s1);CHKERRQ(ierr);
12486a22c91SHong Zhang   ierr = VecDestroy(s2);CHKERRQ(ierr);
12586a22c91SHong Zhang   PetscFunctionReturn(0);
12686a22c91SHong Zhang }
127