1 2 static char help[] = "Tests PetscRandom functions.\n\n"; 3 4 #include <petscsys.h> 5 6 /* Usage: 7 mpiexec -n <np> ./ex1 -n <num_of_random_numbers> -random_type <type> -log_view 8 -view_randomvalues <view_rank> 9 -random_view ascii -random_view :filename 10 */ 11 12 int main(int argc,char **argv) 13 { 14 PetscInt i,n = 1000,*values; 15 PetscRandom rnd; 16 PetscScalar value,avg = 0.0; 17 PetscErrorCode ierr; 18 PetscMPIInt rank; 19 PetscInt view_rank=-1; 20 #if defined(PETSC_USE_LOG) 21 PetscLogEvent event; 22 #endif 23 24 ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 25 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 26 ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr); 27 ierr = PetscOptionsGetInt(NULL,NULL,"-view_randomvalues",&view_rank,NULL);CHKERRQ(ierr); 28 29 ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rnd);CHKERRQ(ierr); 30 /* force imaginary part of random number to always be zero; thus obtain reproducible results with real and complex numbers */ 31 ierr = PetscRandomSetInterval(rnd,0.0,1.0);CHKERRQ(ierr); 32 ierr = PetscRandomSetFromOptions(rnd);CHKERRQ(ierr); 33 34 ierr = PetscMalloc1(n,&values);CHKERRQ(ierr); 35 for (i=0; i<n; i++) { 36 ierr = PetscRandomGetValue(rnd,&value);CHKERRQ(ierr); 37 avg += value; 38 if (view_rank == (PetscInt)rank) { 39 ierr = PetscPrintf(PETSC_COMM_SELF,"[%d] value[%D] = %6.4e\n",rank,i,(double)PetscRealPart(value));CHKERRQ(ierr); 40 } 41 values[i] = (PetscInt)(n*PetscRealPart(value) + 2.0); 42 } 43 avg = avg/((PetscReal)n); 44 if (view_rank == (PetscInt)rank) { 45 ierr = PetscPrintf(PETSC_COMM_SELF,"[%d] Average value %6.4e\n",rank,(double)PetscRealPart(avg));CHKERRQ(ierr); 46 } 47 48 ierr = PetscSortInt(n,values);CHKERRQ(ierr); 49 50 ierr = PetscLogEventRegister("Sort",0,&event);CHKERRQ(ierr); 51 ierr = PetscLogEventBegin(event,0,0,0,0);CHKERRQ(ierr); 52 53 ierr = PetscRandomSeed(rnd);CHKERRQ(ierr); 54 for (i=0; i<n; i++) { 55 ierr = PetscRandomGetValue(rnd,&value);CHKERRQ(ierr); 56 values[i] = (PetscInt)(n*PetscRealPart(value) + 2.0); 57 /* printf("value[%d] = %g\n",i,value); */ 58 } 59 ierr = PetscSortInt(n,values);CHKERRQ(ierr); 60 ierr = PetscLogEventEnd(event,0,0,0,0);CHKERRQ(ierr); 61 62 for (i=1; i<n; i++) { 63 if (values[i] < values[i-1]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Values not sorted"); 64 } 65 ierr = PetscFree(values);CHKERRQ(ierr); 66 ierr = PetscRandomDestroy(&rnd);CHKERRQ(ierr); 67 68 ierr = PetscFinalize(); 69 return ierr; 70 } 71 72 73 74 /*TEST 75 76 test: 77 78 test: 79 suffix: 2 80 nsize: 2 81 output_file: output/ex1_1.out 82 83 test: 84 suffix: 3 85 args: -view_randomvalues 0 86 87 TEST*/ 88