xref: /petsc/src/vec/vec/tests/ex43.c (revision 327415f76d85372a4417cf1aaa14db707d4d6c04)
1 static char help[] = "Tests VecMDot(),VecDot(),VecMTDot(), and VecTDot()\n";
2 
3 #include <petscvec.h>
4 
5 int main(int argc, char **argv)
6 {
7   Vec            *V,t;
8   PetscInt       i,j,reps,n=15,k=6;
9   PetscRandom    rctx;
10   PetscScalar    *val_dot,*val_mdot,*tval_dot,*tval_mdot;
11 
12   PetscFunctionBeginUser;
13   PetscCall(PetscInitialize(&argc,&argv,(char*)0,help));
14   PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
15   PetscCall(PetscOptionsGetInt(NULL,NULL,"-k",&k,NULL));
16   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Test with %" PetscInt_FMT " random vectors of length %" PetscInt_FMT "\n",k,n));
17   PetscCall(PetscRandomCreate(PETSC_COMM_WORLD,&rctx));
18   PetscCall(PetscRandomSetFromOptions(rctx));
19 #if defined(PETSC_USE_COMPLEX)
20   PetscCall(PetscRandomSetInterval(rctx,-1.+4.*PETSC_i,1.+5.*PETSC_i));
21 #else
22   PetscCall(PetscRandomSetInterval(rctx,-1.,1.));
23 #endif
24   PetscCall(VecCreate(PETSC_COMM_WORLD,&t));
25   PetscCall(VecSetSizes(t,n,PETSC_DECIDE));
26   PetscCall(VecSetFromOptions(t));
27   PetscCall(VecDuplicateVecs(t,k,&V));
28   PetscCall(VecSetRandom(t,rctx));
29   PetscCall(VecViewFromOptions(t,NULL,"-t_view"));
30   PetscCall(PetscMalloc1(k,&val_dot));
31   PetscCall(PetscMalloc1(k,&val_mdot));
32   PetscCall(PetscMalloc1(k,&tval_dot));
33   PetscCall(PetscMalloc1(k,&tval_mdot));
34   for (i=0; i<k; i++) PetscCall(VecSetRandom(V[i],rctx));
35   for (reps=0; reps<20; reps++) {
36     for (i=1; i<k; i++) {
37       PetscCall(VecMDot(t,i,V,val_mdot));
38       PetscCall(VecMTDot(t,i,V,tval_mdot));
39       for (j=0;j<i;j++) {
40         PetscCall(VecDot(t,V[j],&val_dot[j]));
41         PetscCall(VecTDot(t,V[j],&tval_dot[j]));
42       }
43       /* Check result */
44       for (j=0;j<i;j++) {
45         if (PetscAbsScalar(val_mdot[j] - val_dot[j])/PetscAbsScalar(val_dot[j]) > 1e-5) {
46           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "[TEST FAILED] i=%" PetscInt_FMT ", j=%" PetscInt_FMT ", val_mdot[j]=%g, val_dot[j]=%g\n",i,j,(double)PetscAbsScalar(val_mdot[j]), (double)PetscAbsScalar(val_dot[j])));
47           break;
48         }
49         if (PetscAbsScalar(tval_mdot[j] - tval_dot[j])/PetscAbsScalar(tval_dot[j]) > 1e-5) {
50           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "[TEST FAILED] i=%" PetscInt_FMT ", j=%" PetscInt_FMT ", tval_mdot[j]=%g, tval_dot[j]=%g\n",i,j,(double)PetscAbsScalar(tval_mdot[j]), (double)PetscAbsScalar(tval_dot[j])));
51           break;
52         }
53       }
54     }
55   }
56   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Test completed successfully!\n"));
57   PetscCall(PetscFree(val_dot));
58   PetscCall(PetscFree(val_mdot));
59   PetscCall(PetscFree(tval_dot));
60   PetscCall(PetscFree(tval_mdot));
61   PetscCall(VecDestroyVecs(k,&V));
62   PetscCall(VecDestroy(&t));
63   PetscCall(PetscRandomDestroy(&rctx));
64   PetscCall(PetscFinalize());
65   return 0;
66 }
67 
68 /*TEST
69 
70    test:
71 
72    testset:
73       output_file: output/ex43_1.out
74 
75       test:
76          suffix: cuda
77          args: -vec_type cuda -random_type curand
78          requires: cuda
79 
80       test:
81          suffix: kokkos
82          args: -vec_type kokkos
83          requires: kokkos_kernels
84 
85       test:
86          suffix: hip
87          args: -vec_type hip
88          requires: hip
89 TEST*/
90