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