153022affSStefano Zampini static char help[] = "Tests MATH2OPUS\n\n"; 2c4fb69feSStefano Zampini 3c4fb69feSStefano Zampini #include <petscmat.h> 4c4fb69feSStefano Zampini #include <petscsf.h> 5c4fb69feSStefano Zampini 6c4fb69feSStefano Zampini static PetscScalar GenEntry_Symm(PetscInt sdim, PetscReal x[], PetscReal y[], void *ctx) 7c4fb69feSStefano Zampini { 8c4fb69feSStefano Zampini PetscInt d; 9c4fb69feSStefano Zampini PetscReal clength = sdim == 3 ? 0.2 : 0.1; 10c4fb69feSStefano Zampini PetscReal dist, diff = 0.0; 11c4fb69feSStefano Zampini 12c4fb69feSStefano Zampini for (d = 0; d < sdim; d++) { diff += (x[d] - y[d]) * (x[d] - y[d]); } 13c4fb69feSStefano Zampini dist = PetscSqrtReal(diff); 14c4fb69feSStefano Zampini return PetscExpReal(-dist / clength); 15c4fb69feSStefano Zampini } 16c4fb69feSStefano Zampini 17c4fb69feSStefano Zampini static PetscScalar GenEntry_Unsymm(PetscInt sdim, PetscReal x[], PetscReal y[], void *ctx) 18c4fb69feSStefano Zampini { 19c4fb69feSStefano Zampini PetscInt d; 20c4fb69feSStefano Zampini PetscReal clength = sdim == 3 ? 0.2 : 0.1; 21c4fb69feSStefano Zampini PetscReal dist, diff = 0.0, nx = 0.0, ny = 0.0; 22c4fb69feSStefano Zampini 23c4fb69feSStefano Zampini for (d = 0; d < sdim; d++) { nx += x[d]*x[d]; } 24c4fb69feSStefano Zampini for (d = 0; d < sdim; d++) { ny += y[d]*y[d]; } 25c4fb69feSStefano Zampini for (d = 0; d < sdim; d++) { diff += (x[d] - y[d]) * (x[d] - y[d]); } 26c4fb69feSStefano Zampini dist = PetscSqrtReal(diff); 27c4fb69feSStefano Zampini return nx > ny ? PetscExpReal(-dist / clength) : PetscExpReal(-dist / clength) + 1.; 28c4fb69feSStefano Zampini } 29c4fb69feSStefano Zampini 30c4fb69feSStefano Zampini int main(int argc,char **argv) 31c4fb69feSStefano Zampini { 32c4fb69feSStefano Zampini Mat A,B,C,D; 33c4fb69feSStefano Zampini Vec v,x,y,Ax,Ay,Bx,By; 34c4fb69feSStefano Zampini PetscRandom r; 35c4fb69feSStefano Zampini PetscLayout map; 36c4fb69feSStefano Zampini PetscScalar *Adata = NULL, *Cdata = NULL, scale = 1.0; 37c4fb69feSStefano Zampini PetscReal *coords,nA,nD,nB,err,nX,norms[3]; 38300d917bSStefano Zampini PetscInt N, n = 64, dim = 1, i, j, nrhs = 11, lda = 0, ldc = 0, ldu = 0, nlr = 7, nt, ntrials = 2; 39c4fb69feSStefano Zampini PetscMPIInt size,rank; 40c4fb69feSStefano Zampini PetscBool testlayout = PETSC_FALSE, flg, symm = PETSC_FALSE, Asymm = PETSC_TRUE, kernel = PETSC_TRUE; 4153022affSStefano Zampini PetscBool checkexpl = PETSC_FALSE, agpu = PETSC_FALSE, bgpu = PETSC_FALSE, cgpu = PETSC_FALSE, flgglob; 42300d917bSStefano Zampini PetscBool testtrans, testnorm, randommat = PETSC_TRUE, testorthog, testcompress, testhlru; 43c4fb69feSStefano Zampini void (*approxnormfunc)(void); 44c4fb69feSStefano Zampini void (*Anormfunc)(void); 45c4fb69feSStefano Zampini 4653022affSStefano Zampini #if defined(PETSC_HAVE_MPI_INIT_THREAD) 47c4fb69feSStefano Zampini PETSC_MPI_THREAD_REQUIRED = MPI_THREAD_MULTIPLE; 4853022affSStefano Zampini #endif 49*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&argv,(char*) 0,help)); 505f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-ng",&N,&flgglob)); 515f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); 525f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-nrhs",&nrhs,NULL)); 535f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-dim",&dim,NULL)); 545f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-lda",&lda,NULL)); 555f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-ldc",&ldc,NULL)); 565f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-nlr",&nlr,NULL)); 575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-ldu",&ldu,NULL)); 585f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-matmattrials",&ntrials,NULL)); 595f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-randommat",&randommat,NULL)); 605f80ce2aSJacob Faibussowitsch if (!flgglob) CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-testlayout",&testlayout,NULL)); 615f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-Asymm",&Asymm,NULL)); 625f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-symm",&symm,NULL)); 635f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-kernel",&kernel,NULL)); 645f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-checkexpl",&checkexpl,NULL)); 655f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-agpu",&agpu,NULL)); 665f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-bgpu",&bgpu,NULL)); 675f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-cgpu",&cgpu,NULL)); 685f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetScalar(NULL,NULL,"-scale",&scale,NULL)); 69c4fb69feSStefano Zampini if (!Asymm) symm = PETSC_FALSE; 70c4fb69feSStefano Zampini 715f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 72300d917bSStefano Zampini 73300d917bSStefano Zampini /* Disable tests for unimplemented variants */ 74c4fb69feSStefano Zampini testtrans = (PetscBool)(size == 1 || symm); 75c4fb69feSStefano Zampini testnorm = (PetscBool)(size == 1 || symm); 7653022affSStefano Zampini testorthog = (PetscBool)(size == 1 || symm); 7753022affSStefano Zampini testcompress = (PetscBool)(size == 1 || symm); 78300d917bSStefano Zampini testhlru = (PetscBool)(size == 1); 79c4fb69feSStefano Zampini 805f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 815f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutCreate(PETSC_COMM_WORLD,&map)); 82c4fb69feSStefano Zampini if (testlayout) { 83c4fb69feSStefano Zampini if (rank%2) n = PetscMax(2*n-5*rank,0); 84c4fb69feSStefano Zampini else n = 2*n+rank; 85c4fb69feSStefano Zampini } 8653022affSStefano Zampini if (!flgglob) { 875f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutSetLocalSize(map,n)); 885f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutSetUp(map)); 895f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutGetSize(map,&N)); 9053022affSStefano Zampini } else { 915f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutSetSize(map,N)); 925f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutSetUp(map)); 935f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutGetLocalSize(map,&n)); 9453022affSStefano Zampini } 955f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutDestroy(&map)); 96c4fb69feSStefano Zampini 97c4fb69feSStefano Zampini if (lda) { 985f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(N*(n+lda),&Adata)); 99c4fb69feSStefano Zampini } 1005f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateDense(PETSC_COMM_WORLD,n,n,N,N,Adata,&A)); 1015f80ce2aSJacob Faibussowitsch CHKERRQ(MatDenseSetLDA(A,n+lda)); 102c4fb69feSStefano Zampini 10353022affSStefano Zampini /* Create random points; these are replicated in order to populate a dense matrix and to compare sequential and dense runs 10453022affSStefano Zampini The constructor for MATH2OPUS can take as input the distributed coordinates and replicates them internally in case 10553022affSStefano Zampini a kernel construction is requested */ 1065f80ce2aSJacob Faibussowitsch CHKERRQ(PetscRandomCreate(PETSC_COMM_WORLD,&r)); 1075f80ce2aSJacob Faibussowitsch CHKERRQ(PetscRandomSetFromOptions(r)); 1085f80ce2aSJacob Faibussowitsch CHKERRQ(PetscRandomSetSeed(r,123456)); 1095f80ce2aSJacob Faibussowitsch CHKERRQ(PetscRandomSeed(r)); 1105f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(N*dim,&coords)); 1115f80ce2aSJacob Faibussowitsch CHKERRQ(PetscRandomGetValuesReal(r,N*dim,coords)); 1125f80ce2aSJacob Faibussowitsch CHKERRQ(PetscRandomDestroy(&r)); 11353022affSStefano Zampini 114c4fb69feSStefano Zampini if (kernel || !randommat) { 11553022affSStefano Zampini MatH2OpusKernel k = Asymm ? GenEntry_Symm : GenEntry_Unsymm; 116c4fb69feSStefano Zampini PetscInt ist,ien; 117c4fb69feSStefano Zampini 1185f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetOwnershipRange(A,&ist,&ien)); 119c4fb69feSStefano Zampini for (i = ist; i < ien; i++) { 120c4fb69feSStefano Zampini for (j = 0; j < N; j++) { 1215f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValue(A,i,j,(*k)(dim,coords + i*dim,coords + j*dim,NULL),INSERT_VALUES)); 122c4fb69feSStefano Zampini } 123c4fb69feSStefano Zampini } 1245f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY)); 1255f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY)); 126c4fb69feSStefano Zampini if (kernel) { 1275f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateH2OpusFromKernel(PETSC_COMM_WORLD,n,n,N,N,dim,coords + ist*dim,PETSC_TRUE,k,NULL,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,&B)); 128c4fb69feSStefano Zampini } else { 1295f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateH2OpusFromMat(A,dim,coords + ist*dim,PETSC_TRUE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,&B)); 130c4fb69feSStefano Zampini } 131c4fb69feSStefano Zampini } else { 13253022affSStefano Zampini PetscInt ist; 13353022affSStefano Zampini 1345f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetOwnershipRange(A,&ist,NULL)); 1355f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetRandom(A,NULL)); 136c4fb69feSStefano Zampini if (Asymm) { 1375f80ce2aSJacob Faibussowitsch CHKERRQ(MatTranspose(A,MAT_INITIAL_MATRIX,&B)); 1385f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(A,1.0,B,SAME_NONZERO_PATTERN)); 1395f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B)); 1405f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOption(A,MAT_SYMMETRIC,PETSC_TRUE)); 141c4fb69feSStefano Zampini } 1425f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateH2OpusFromMat(A,dim,coords + ist*dim,PETSC_TRUE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,&B)); 143c4fb69feSStefano Zampini } 1445f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(coords)); 145c4fb69feSStefano Zampini if (agpu) { 1465f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(A,MATDENSECUDA,MAT_INPLACE_MATRIX,&A)); 147c4fb69feSStefano Zampini } 1485f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(A,NULL,"-A_view")); 149c4fb69feSStefano Zampini 1505f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOption(B,MAT_SYMMETRIC,symm)); 151c4fb69feSStefano Zampini 152c4fb69feSStefano Zampini /* assemble the H-matrix */ 1535f80ce2aSJacob Faibussowitsch CHKERRQ(MatBindToCPU(B,(PetscBool)!bgpu)); 1545f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetFromOptions(B)); 1555f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY)); 1565f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY)); 1575f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(B,NULL,"-B_view")); 158c4fb69feSStefano Zampini 159c4fb69feSStefano Zampini /* Test MatScale */ 1605f80ce2aSJacob Faibussowitsch CHKERRQ(MatScale(A,scale)); 1615f80ce2aSJacob Faibussowitsch CHKERRQ(MatScale(B,scale)); 162c4fb69feSStefano Zampini 163c4fb69feSStefano Zampini /* Test MatMult */ 1645f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateVecs(A,&Ax,&Ay)); 1655f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateVecs(B,&Bx,&By)); 1665f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetRandom(Ax,NULL)); 1675f80ce2aSJacob Faibussowitsch CHKERRQ(VecCopy(Ax,Bx)); 1685f80ce2aSJacob Faibussowitsch CHKERRQ(MatMult(A,Ax,Ay)); 1695f80ce2aSJacob Faibussowitsch CHKERRQ(MatMult(B,Bx,By)); 1705f80ce2aSJacob Faibussowitsch CHKERRQ(VecViewFromOptions(Ay,NULL,"-mult_vec_view")); 1715f80ce2aSJacob Faibussowitsch CHKERRQ(VecViewFromOptions(By,NULL,"-mult_vec_view")); 1725f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(Ay,NORM_INFINITY,&nX)); 1735f80ce2aSJacob Faibussowitsch CHKERRQ(VecAXPY(Ay,-1.0,By)); 1745f80ce2aSJacob Faibussowitsch CHKERRQ(VecViewFromOptions(Ay,NULL,"-mult_vec_view")); 1755f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(Ay,NORM_INFINITY,&err)); 1765f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMult err %g\n",err/nX)); 1775f80ce2aSJacob Faibussowitsch CHKERRQ(VecScale(By,-1.0)); 1785f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultAdd(B,Bx,By,By)); 1795f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(By,NORM_INFINITY,&err)); 1805f80ce2aSJacob Faibussowitsch CHKERRQ(VecViewFromOptions(By,NULL,"-mult_vec_view")); 1814c3a5f3cSStefano Zampini if (err > 10.*PETSC_SMALL) { 1825f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMultAdd err %g\n",err)); 183c4fb69feSStefano Zampini } 184c4fb69feSStefano Zampini 185c4fb69feSStefano Zampini /* Test MatNorm */ 1865f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(A,NORM_INFINITY,&norms[0])); 1875f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(A,NORM_1,&norms[1])); 188c4fb69feSStefano Zampini norms[2] = -1.; /* NORM_2 not supported */ 1895f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"A Matrix norms: infty=%g, norm_1=%g, norm_2=%g\n",(double)norms[0],(double)norms[1],(double)norms[2])); 1905f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetOperation(A,MATOP_NORM,&Anormfunc)); 1915f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetOperation(B,MATOP_NORM,&approxnormfunc)); 1925f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOperation(A,MATOP_NORM,approxnormfunc)); 1935f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(A,NORM_INFINITY,&norms[0])); 1945f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(A,NORM_1,&norms[1])); 1955f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(A,NORM_2,&norms[2])); 1965f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"A Approx Matrix norms: infty=%g, norm_1=%g, norm_2=%g\n",(double)norms[0],(double)norms[1],(double)norms[2])); 197c4fb69feSStefano Zampini if (testnorm) { 1985f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(B,NORM_INFINITY,&norms[0])); 1995f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(B,NORM_1,&norms[1])); 2005f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(B,NORM_2,&norms[2])); 201c4fb69feSStefano Zampini } else { 202c4fb69feSStefano Zampini norms[0] = -1.; 203c4fb69feSStefano Zampini norms[1] = -1.; 204c4fb69feSStefano Zampini norms[2] = -1.; 205c4fb69feSStefano Zampini } 2065f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"B Approx Matrix norms: infty=%g, norm_1=%g, norm_2=%g\n",(double)norms[0],(double)norms[1],(double)norms[2])); 2075f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOperation(A,MATOP_NORM,Anormfunc)); 208c4fb69feSStefano Zampini 209c4fb69feSStefano Zampini /* Test MatDuplicate */ 2105f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(B,MAT_COPY_VALUES,&D)); 2115f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOption(D,MAT_SYMMETRIC,symm)); 2125f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(B,D,10,&flg)); 213c4fb69feSStefano Zampini if (!flg) { 2145f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMult error after MatDuplicate\n")); 215c4fb69feSStefano Zampini } 216c4fb69feSStefano Zampini if (testtrans) { 2175f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultTransposeEqual(B,D,10,&flg)); 218c4fb69feSStefano Zampini if (!flg) { 2195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMultTranspose error after MatDuplicate\n")); 220c4fb69feSStefano Zampini } 221c4fb69feSStefano Zampini } 2225f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 223c4fb69feSStefano Zampini 224c4fb69feSStefano Zampini if (testtrans) { /* MatMultTranspose for nonsymmetric matrices not implemented */ 2255f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetRandom(Ay,NULL)); 2265f80ce2aSJacob Faibussowitsch CHKERRQ(VecCopy(Ay,By)); 2275f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultTranspose(A,Ay,Ax)); 2285f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultTranspose(B,By,Bx)); 2295f80ce2aSJacob Faibussowitsch CHKERRQ(VecViewFromOptions(Ax,NULL,"-multtrans_vec_view")); 2305f80ce2aSJacob Faibussowitsch CHKERRQ(VecViewFromOptions(Bx,NULL,"-multtrans_vec_view")); 2315f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(Ax,NORM_INFINITY,&nX)); 2325f80ce2aSJacob Faibussowitsch CHKERRQ(VecAXPY(Ax,-1.0,Bx)); 2335f80ce2aSJacob Faibussowitsch CHKERRQ(VecViewFromOptions(Ax,NULL,"-multtrans_vec_view")); 2345f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(Ax,NORM_INFINITY,&err)); 2355f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMultTranspose err %g\n",err/nX)); 2365f80ce2aSJacob Faibussowitsch CHKERRQ(VecScale(Bx,-1.0)); 2375f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultTransposeAdd(B,By,Bx,Bx)); 2385f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(Bx,NORM_INFINITY,&err)); 2394c3a5f3cSStefano Zampini if (err > 10.*PETSC_SMALL) { 2405f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMultTransposeAdd err %g\n",err)); 241c4fb69feSStefano Zampini } 242c4fb69feSStefano Zampini } 2435f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&Ax)); 2445f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&Ay)); 2455f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&Bx)); 2465f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&By)); 247c4fb69feSStefano Zampini 248c4fb69feSStefano Zampini /* Test MatMatMult */ 249c4fb69feSStefano Zampini if (ldc) { 2505f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(nrhs*(n+ldc),&Cdata)); 251c4fb69feSStefano Zampini } 2525f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateDense(PETSC_COMM_WORLD,n,PETSC_DECIDE,N,nrhs,Cdata,&C)); 2535f80ce2aSJacob Faibussowitsch CHKERRQ(MatDenseSetLDA(C,n+ldc)); 2545f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetRandom(C,NULL)); 255c4fb69feSStefano Zampini if (cgpu) { 2565f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(C,MATDENSECUDA,MAT_INPLACE_MATRIX,&C)); 257c4fb69feSStefano Zampini } 258c4fb69feSStefano Zampini for (nt = 0; nt < ntrials; nt++) { 2595f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMult(B,C,nt ? MAT_REUSE_MATRIX : MAT_INITIAL_MATRIX,PETSC_DEFAULT,&D)); 2605f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(D,NULL,"-bc_view")); 2615f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectBaseTypeCompareAny((PetscObject)D,&flg,MATSEQDENSE,MATMPIDENSE,"")); 262c4fb69feSStefano Zampini if (flg) { 2635f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateVecs(B,&x,&y)); 2645f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateVecs(D,NULL,&v)); 265c4fb69feSStefano Zampini for (i = 0; i < nrhs; i++) { 2665f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetColumnVector(D,v,i)); 2675f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetColumnVector(C,x,i)); 2685f80ce2aSJacob Faibussowitsch CHKERRQ(MatMult(B,x,y)); 2695f80ce2aSJacob Faibussowitsch CHKERRQ(VecAXPY(y,-1.0,v)); 2705f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(y,NORM_INFINITY,&err)); 2715f80ce2aSJacob Faibussowitsch if (err > 10.*PETSC_SMALL) CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMat err %" PetscInt_FMT " %g\n",i,err)); 272c4fb69feSStefano Zampini } 2735f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&y)); 2745f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&x)); 2755f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&v)); 276c4fb69feSStefano Zampini } 277c4fb69feSStefano Zampini } 2785f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 279c4fb69feSStefano Zampini 280c4fb69feSStefano Zampini /* Test MatTransposeMatMult */ 281c4fb69feSStefano Zampini if (testtrans) { /* MatMultTranspose for nonsymmetric matrices not implemented */ 282c4fb69feSStefano Zampini for (nt = 0; nt < ntrials; nt++) { 2835f80ce2aSJacob Faibussowitsch CHKERRQ(MatTransposeMatMult(B,C,nt ? MAT_REUSE_MATRIX : MAT_INITIAL_MATRIX,PETSC_DEFAULT,&D)); 2845f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(D,NULL,"-btc_view")); 2855f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectBaseTypeCompareAny((PetscObject)D,&flg,MATSEQDENSE,MATMPIDENSE,"")); 286c4fb69feSStefano Zampini if (flg) { 2875f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateVecs(B,&y,&x)); 2885f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateVecs(D,NULL,&v)); 289c4fb69feSStefano Zampini for (i = 0; i < nrhs; i++) { 2905f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetColumnVector(D,v,i)); 2915f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetColumnVector(C,x,i)); 2925f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultTranspose(B,x,y)); 2935f80ce2aSJacob Faibussowitsch CHKERRQ(VecAXPY(y,-1.0,v)); 2945f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(y,NORM_INFINITY,&err)); 2955f80ce2aSJacob Faibussowitsch if (err > 10.*PETSC_SMALL) CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatTransMat err %" PetscInt_FMT " %g\n",i,err)); 296c4fb69feSStefano Zampini } 2975f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&y)); 2985f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&x)); 2995f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&v)); 300c4fb69feSStefano Zampini } 301c4fb69feSStefano Zampini } 3025f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 303c4fb69feSStefano Zampini } 304c4fb69feSStefano Zampini 305300d917bSStefano Zampini /* Test basis orthogonalization */ 30653022affSStefano Zampini if (testorthog) { 3075f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(B,MAT_COPY_VALUES,&D)); 3085f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOption(D,MAT_SYMMETRIC,symm)); 3095f80ce2aSJacob Faibussowitsch CHKERRQ(MatH2OpusOrthogonalize(D)); 3105f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(B,D,10,&flg)); 31153022affSStefano Zampini if (!flg) { 3125f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMult error after basis ortogonalization\n")); 31353022affSStefano Zampini } 3145f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 31553022affSStefano Zampini } 31653022affSStefano Zampini 317300d917bSStefano Zampini /* Test matrix compression */ 31853022affSStefano Zampini if (testcompress) { 3195f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(B,MAT_COPY_VALUES,&D)); 3205f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOption(D,MAT_SYMMETRIC,symm)); 3215f80ce2aSJacob Faibussowitsch CHKERRQ(MatH2OpusCompress(D,PETSC_SMALL)); 3225f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 32353022affSStefano Zampini } 32453022affSStefano Zampini 325300d917bSStefano Zampini /* Test low-rank update */ 326300d917bSStefano Zampini if (testhlru) { 327300d917bSStefano Zampini Mat U, V; 328300d917bSStefano Zampini PetscScalar *Udata = NULL, *Vdata = NULL; 329300d917bSStefano Zampini 330300d917bSStefano Zampini if (ldu) { 3315f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(nlr*(n+ldu),&Udata)); 3325f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(nlr*(n+ldu+2),&Vdata)); 333300d917bSStefano Zampini } 3345f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(B,MAT_COPY_VALUES,&D)); 3355f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateDense(PetscObjectComm((PetscObject)D),n,PETSC_DECIDE,N,nlr,Udata,&U)); 3365f80ce2aSJacob Faibussowitsch CHKERRQ(MatDenseSetLDA(U,n+ldu)); 3375f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateDense(PetscObjectComm((PetscObject)D),n,PETSC_DECIDE,N,nlr,Vdata,&V)); 3385f80ce2aSJacob Faibussowitsch if (ldu) CHKERRQ(MatDenseSetLDA(V,n+ldu+2)); 3395f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetRandom(U,NULL)); 3405f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetRandom(V,NULL)); 3415f80ce2aSJacob Faibussowitsch CHKERRQ(MatH2OpusLowRankUpdate(D,U,V,0.5)); 3425f80ce2aSJacob Faibussowitsch CHKERRQ(MatH2OpusLowRankUpdate(D,U,V,-0.5)); 3435f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(B,D,10,&flg)); 344300d917bSStefano Zampini if (!flg) { 3455f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMult error after low-rank update\n")); 346300d917bSStefano Zampini } 3475f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 3485f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&U)); 3495f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(Udata)); 3505f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&V)); 3515f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(Vdata)); 352300d917bSStefano Zampini } 353300d917bSStefano Zampini 354c4fb69feSStefano Zampini /* check explicit operator */ 355c4fb69feSStefano Zampini if (checkexpl) { 356c4fb69feSStefano Zampini Mat Be, Bet; 357c4fb69feSStefano Zampini 3585f80ce2aSJacob Faibussowitsch CHKERRQ(MatComputeOperator(B,MATDENSE,&D)); 3595f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(D,MAT_COPY_VALUES,&Be)); 3605f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(D,NORM_FROBENIUS,&nB)); 3615f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(D,NULL,"-expl_view")); 3625f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(D,-1.0,A,SAME_NONZERO_PATTERN)); 3635f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(D,NULL,"-diff_view")); 3645f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(D,NORM_FROBENIUS,&nD)); 3655f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(A,NORM_FROBENIUS,&nA)); 3665f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Approximation error %g (%g / %g, %g)\n",nD/nA,nD,nA,nB)); 3675f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 368c4fb69feSStefano Zampini 369c4fb69feSStefano Zampini if (testtrans) { /* MatMultTranspose for nonsymmetric matrices not implemented */ 3705f80ce2aSJacob Faibussowitsch CHKERRQ(MatTranspose(A,MAT_INPLACE_MATRIX,&A)); 3715f80ce2aSJacob Faibussowitsch CHKERRQ(MatComputeOperatorTranspose(B,MATDENSE,&D)); 3725f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(D,MAT_COPY_VALUES,&Bet)); 3735f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(D,NORM_FROBENIUS,&nB)); 3745f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(D,NULL,"-expl_trans_view")); 3755f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(D,-1.0,A,SAME_NONZERO_PATTERN)); 3765f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(D,NULL,"-diff_trans_view")); 3775f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(D,NORM_FROBENIUS,&nD)); 3785f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(A,NORM_FROBENIUS,&nA)); 3795f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Approximation error transpose %g (%g / %g, %g)\n",nD/nA,nD,nA,nB)); 3805f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 381c4fb69feSStefano Zampini 3825f80ce2aSJacob Faibussowitsch CHKERRQ(MatTranspose(Bet,MAT_INPLACE_MATRIX,&Bet)); 3835f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(Be,-1.0,Bet,SAME_NONZERO_PATTERN)); 3845f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(Be,NULL,"-diff_expl_view")); 3855f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(Be,NORM_FROBENIUS,&nB)); 3865f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Approximation error B - (B^T)^T %g\n",nB)); 3875f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&Be)); 3885f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&Bet)); 389c4fb69feSStefano Zampini } 390c4fb69feSStefano Zampini } 3915f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A)); 3925f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B)); 3935f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 3945f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(Cdata)); 3955f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(Adata)); 396*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 397*b122ec5aSJacob Faibussowitsch return 0; 398c4fb69feSStefano Zampini } 399c4fb69feSStefano Zampini 400c4fb69feSStefano Zampini /*TEST 401c4fb69feSStefano Zampini 402c4fb69feSStefano Zampini build: 40353022affSStefano Zampini requires: h2opus 404c4fb69feSStefano Zampini 405c4fb69feSStefano Zampini #tests from kernel 406c4fb69feSStefano Zampini test: 40753022affSStefano Zampini requires: h2opus 408c4fb69feSStefano Zampini nsize: 1 409c4fb69feSStefano Zampini suffix: 1 410c4fb69feSStefano Zampini args: -n {{17 33}} -kernel 1 -dim {{1 2 3}} -symm {{0 1}} -checkexpl -bgpu 0 411c4fb69feSStefano Zampini 412c4fb69feSStefano Zampini test: 41353022affSStefano Zampini requires: h2opus 414c4fb69feSStefano Zampini nsize: 1 415c4fb69feSStefano Zampini suffix: 1_ld 416c4fb69feSStefano Zampini output_file: output/ex66_1.out 417300d917bSStefano Zampini args: -n 33 -kernel 1 -dim 1 -lda 13 -ldc 11 -ldu 17 -symm 0 -checkexpl -bgpu 0 418c4fb69feSStefano Zampini 419c4fb69feSStefano Zampini test: 42053022affSStefano Zampini requires: h2opus cuda 421c4fb69feSStefano Zampini nsize: 1 422c4fb69feSStefano Zampini suffix: 1_cuda 423c4fb69feSStefano Zampini output_file: output/ex66_1.out 424c4fb69feSStefano Zampini args: -n {{17 33}} -kernel 1 -dim {{1 2 3}} -symm {{0 1}} -checkexpl -bgpu 1 425c4fb69feSStefano Zampini 426c4fb69feSStefano Zampini test: 42753022affSStefano Zampini requires: h2opus cuda 428c4fb69feSStefano Zampini nsize: 1 429c4fb69feSStefano Zampini suffix: 1_cuda_ld 430c4fb69feSStefano Zampini output_file: output/ex66_1.out 431300d917bSStefano Zampini args: -n 33 -kernel 1 -dim 1 -lda 13 -ldc 11 -ldu 17 -symm 0 -checkexpl -bgpu 1 432c4fb69feSStefano Zampini 433c4fb69feSStefano Zampini test: 43453022affSStefano Zampini requires: h2opus 43553022affSStefano Zampini nsize: {{2 3}} 436c4fb69feSStefano Zampini suffix: 1_par 43753022affSStefano Zampini args: -n 64 -symm -kernel 1 -dim 1 -ldc 12 -testlayout {{0 1}} -bgpu 0 -cgpu 0 438c4fb69feSStefano Zampini 439c4fb69feSStefano Zampini test: 44053022affSStefano Zampini requires: h2opus cuda 44153022affSStefano Zampini nsize: {{2 3}} 442c4fb69feSStefano Zampini suffix: 1_par_cuda 44353022affSStefano Zampini args: -n 64 -symm -kernel 1 -dim 1 -ldc 12 -testlayout {{0 1}} -bgpu {{0 1}} -cgpu {{0 1}} 444c4fb69feSStefano Zampini output_file: output/ex66_1_par.out 445c4fb69feSStefano Zampini 446c4fb69feSStefano Zampini #tests from matrix sampling (parallel or unsymmetric not supported) 447c4fb69feSStefano Zampini test: 44853022affSStefano Zampini requires: h2opus 449c4fb69feSStefano Zampini nsize: 1 450c4fb69feSStefano Zampini suffix: 2 451c4fb69feSStefano Zampini args: -n {{17 33}} -kernel 0 -dim 2 -symm 1 -checkexpl -bgpu 0 452c4fb69feSStefano Zampini 453c4fb69feSStefano Zampini test: 45453022affSStefano Zampini requires: h2opus cuda 455c4fb69feSStefano Zampini nsize: 1 456c4fb69feSStefano Zampini suffix: 2_cuda 457c4fb69feSStefano Zampini output_file: output/ex66_2.out 458c4fb69feSStefano Zampini args: -n {{17 33}} -kernel 0 -dim 2 -symm 1 -checkexpl -bgpu {{0 1}} -agpu {{0 1}} 459c4fb69feSStefano Zampini 46053022affSStefano Zampini #tests view operation 46153022affSStefano Zampini test: 46253022affSStefano Zampini requires: h2opus !cuda 46353022affSStefano Zampini filter: grep -v "MPI processes" | grep -v "\[" | grep -v "\]" 46453022affSStefano Zampini nsize: {{1 2 3}} 46553022affSStefano Zampini suffix: view 46653022affSStefano Zampini args: -ng 64 -kernel 1 -dim 2 -symm 1 -checkexpl -B_view -mat_h2opus_leafsize 17 -mat_h2opus_normsamples 13 -mat_h2opus_indexmap_view ::ascii_matlab -mat_approximate_norm_samples 2 -mat_h2opus_normsamples 2 46753022affSStefano Zampini 46853022affSStefano Zampini test: 46953022affSStefano Zampini requires: h2opus cuda 47053022affSStefano Zampini filter: grep -v "MPI processes" | grep -v "\[" | grep -v "\]" 47153022affSStefano Zampini nsize: {{1 2 3}} 47253022affSStefano Zampini suffix: view_cuda 47353022affSStefano Zampini args: -ng 64 -kernel 1 -dim 2 -symm 1 -checkexpl -bgpu -B_view -mat_h2opus_leafsize 17 -mat_h2opus_normsamples 13 -mat_h2opus_indexmap_view ::ascii_matlab -mat_approximate_norm_samples 2 -mat_h2opus_normsamples 2 47453022affSStefano Zampini 475c4fb69feSStefano Zampini TEST*/ 476