/* PetscRandomSetTypeFromOptions_Private - Sets the type of random generator from user options. Defaults to type PETSCRAND48 or PETSCRAND. Collective on PetscRandom Input Parameter: . rnd - The random number generator context Level: intermediate .keywords: PetscRandom, set, options, database, type .seealso: PetscRandomSetFromOptions(), PetscRandomSetType() */ static PetscErrorCode PetscRandomSetTypeFromOptions_Private(PetscRandom rnd) { PetscBool opt; const char *defaultType; char typeName[256]; PetscErrorCode ierr; PetscFunctionBegin; if (((PetscObject)rnd)->type_name) { defaultType = ((PetscObject)rnd)->type_name; } else { #if defined(PETSC_HAVE_DRAND48) defaultType = PETSCRAND48; #elif defined(PETSC_HAVE_RAND) defaultType = PETSCRAND; #endif } if (!PetscRandomRegisterAllCalled) {ierr = PetscRandomRegisterAll();CHKERRQ(ierr);} ierr = PetscOptionsFList("-random_type","PetscRandom type","PetscRandomSetType",PetscRandomList,defaultType,typeName,256,&opt);CHKERRQ(ierr); if (opt) { ierr = PetscRandomSetType(rnd, typeName);CHKERRQ(ierr); } else { ierr = PetscRandomSetType(rnd, defaultType);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/* PetscRandomSetTypeFromOptions_Private - Sets the type of random generator from user options. Defaults to type PETSCRAND48 or PETSCRAND. Collective on PetscRandom Input Parameter: . rnd - The random number generator context Level: intermediate .keywords: PetscRandom, set, options, database, type .seealso: PetscRandomSetFromOptions(), PetscRandomSetType() */ static PetscErrorCode PetscRandomSetTypeFromOptions_Private(PetscOptions *PetscOptionsObject,PetscRandom rnd) { PetscBool opt; const char *defaultType; char typeName[256]; PetscErrorCode ierr; PetscFunctionBegin; if (((PetscObject)rnd)->type_name) { defaultType = ((PetscObject)rnd)->type_name; } else { defaultType = PETSCRANDER48; } ierr = PetscRandomRegisterAll(); CHKERRQ(ierr); ierr = PetscOptionsFList("-random_type","PetscRandom type","PetscRandomSetType",PetscRandomList,defaultType,typeName,256,&opt); CHKERRQ(ierr); if (opt) { ierr = PetscRandomSetType(rnd, typeName); CHKERRQ(ierr); } else { ierr = PetscRandomSetType(rnd, defaultType); CHKERRQ(ierr); } PetscFunctionReturn(0); }
PetscErrorCode PetscRandomCreate(MPI_Comm comm,PetscRandom *r) { PetscRandom rr; PetscErrorCode ierr; PetscMPIInt rank; PetscFunctionBegin; PetscValidPointer(r,3); *r = NULL; ierr = PetscRandomInitializePackage(); CHKERRQ(ierr); ierr = PetscHeaderCreate(rr,PETSC_RANDOM_CLASSID,"PetscRandom","Random number generator","Sys",comm,PetscRandomDestroy,NULL); CHKERRQ(ierr); ierr = MPI_Comm_rank(comm,&rank); CHKERRQ(ierr); rr->data = NULL; rr->low = 0.0; rr->width = 1.0; rr->iset = PETSC_FALSE; rr->seed = 0x12345678 + 76543*rank; ierr = PetscRandomSetType(rr,PETSCRANDER48); CHKERRQ(ierr); *r = rr; PetscFunctionReturn(0); }
PetscErrorCode ComputeMatrix(DM da,Mat B) { PetscErrorCode ierr; PetscInt i,j,k,mx,my,mz,xm,ym,zm,xs,ys,zs,dof,k1,k2,k3; PetscScalar *v,*v_neighbor,Hx,Hy,Hz,HxHydHz,HyHzdHx,HxHzdHy,r1,r2; MatStencil row,col; PetscRandom rand; PetscFunctionBegin; ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rand);CHKERRQ(ierr); ierr = PetscRandomSetType(rand,PETSCRAND);CHKERRQ(ierr); ierr = PetscRandomSetSeed(rand,1);CHKERRQ(ierr); ierr = PetscRandomSetInterval(rand,-.001,.001);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); ierr = DMDAGetInfo(da,0,&mx,&my,&mz,0,0,0,&dof,0,0,0,0,0);CHKERRQ(ierr); /* For simplicity, this example only works on mx=my=mz */ if ( mx != my || mx != mz) SETERRQ3(PETSC_COMM_SELF,1,"This example only works with mx %d = my %d = mz %d\n",mx,my,mz); Hx = 1.0 / (PetscReal)(mx-1); Hy = 1.0 / (PetscReal)(my-1); Hz = 1.0 / (PetscReal)(mz-1); HxHydHz = Hx*Hy/Hz; HxHzdHy = Hx*Hz/Hy; HyHzdHx = Hy*Hz/Hx; ierr = PetscMalloc((2*dof*dof+1)*sizeof(PetscScalar),&v);CHKERRQ(ierr); v_neighbor = v + dof*dof; ierr = PetscMemzero(v,(2*dof*dof+1)*sizeof(PetscScalar));CHKERRQ(ierr); k3 = 0; for (k1=0; k1<dof; k1++){ for (k2=0; k2<dof; k2++){ if (k1 == k2){ v[k3] = 2.0*(HxHydHz + HxHzdHy + HyHzdHx); v_neighbor[k3] = -HxHydHz; } else { ierr = PetscRandomGetValue(rand,&r1);CHKERRQ(ierr); ierr = PetscRandomGetValue(rand,&r2);CHKERRQ(ierr); v[k3] = r1; v_neighbor[k3] = r2; } k3++; } } ierr = DMDAGetCorners(da,&xs,&ys,&zs,&xm,&ym,&zm);CHKERRQ(ierr); for (k=zs; k<zs+zm; k++){ for (j=ys; j<ys+ym; j++){ for (i=xs; i<xs+xm; i++){ row.i = i; row.j = j; row.k = k; if (i==0 || j==0 || k==0 || i==mx-1 || j==my-1 || k==mz-1){ /* boudary points */ ierr = MatSetValuesBlockedStencil(B,1,&row,1,&row,v,INSERT_VALUES);CHKERRQ(ierr); } else { /* interior points */ /* center */ col.i = i; col.j = j; col.k = k; ierr = MatSetValuesBlockedStencil(B,1,&row,1,&col,v,INSERT_VALUES);CHKERRQ(ierr); /* x neighbors */ col.i = i-1; col.j = j; col.k = k; ierr = MatSetValuesBlockedStencil(B,1,&row,1,&col,v_neighbor,INSERT_VALUES);CHKERRQ(ierr); col.i = i+1; col.j = j; col.k = k; ierr = MatSetValuesBlockedStencil(B,1,&row,1,&col,v_neighbor,INSERT_VALUES);CHKERRQ(ierr); /* y neighbors */ col.i = i; col.j = j-1; col.k = k; ierr = MatSetValuesBlockedStencil(B,1,&row,1,&col,v_neighbor,INSERT_VALUES);CHKERRQ(ierr); col.i = i; col.j = j+1; col.k = k; ierr = MatSetValuesBlockedStencil(B,1,&row,1,&col,v_neighbor,INSERT_VALUES);CHKERRQ(ierr); /* z neighbors */ col.i = i; col.j = j; col.k = k-1; ierr = MatSetValuesBlockedStencil(B,1,&row,1,&col,v_neighbor,INSERT_VALUES);CHKERRQ(ierr); col.i = i; col.j = j; col.k = k+1; ierr = MatSetValuesBlockedStencil(B,1,&row,1,&col,v_neighbor,INSERT_VALUES);CHKERRQ(ierr); } } } } ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = PetscFree(v);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rand);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc, char *argv[]) { double r,dt; int n; unsigned long i,myNumSim,totalNumSim,numdim; /* double payoff; */ double *vol, *St0, x, totalx; int np,myid; time_t start,stop; double *eps; himaInfo hinfo; PetscRandom ran; PetscErrorCode ierr; PetscBool flg; PetscInitialize(&argc,&argv,(char *)0,help); #if defined(PETSC_USE_COMPLEX) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This example does not work for scalar type complex\n"); #endif time(&start); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&ran);CHKERRQ(ierr); #if defined(PETSC_HAVE_SPRNG) ierr = PetscRandomSetType(ran,PETSCSPRNG);CHKERRQ(ierr); #elif defined(PETSC_HAVE_RAND) ierr = PetscRandomSetType(ran,PETSCRAND);CHKERRQ(ierr); #endif ierr = PetscRandomSetFromOptions(ran);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD, &np);CHKERRQ(ierr); /* number of nodes */ ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &myid);CHKERRQ(ierr); /* my ranking */ ierr = PetscOptionsHasName(PETSC_NULL, "-check_generators", &flg);CHKERRQ(ierr); if (flg){ ierr = PetscRandomGetValue(ran,(PetscScalar *)&r); ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] rval: %g\n",myid,r); ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD); } hinfo.n = 31; hinfo.r = 0.04; hinfo.dt = 1.0/12; /* a month as a period */ hinfo.totalNumSim = 1000; ierr = PetscOptionsGetInt(PETSC_NULL,"-num_of_stocks",&(hinfo.n),PETSC_NULL);CHKERRQ(ierr); if (hinfo.n <1 || hinfo.n > 31) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only 31 stocks listed in stock.txt. num_of_stocks %D must between 1 and 31",hinfo.n); ierr = PetscOptionsGetReal(PETSC_NULL,"-interest_rate",&(hinfo.r),PETSC_NULL);CHKERRQ(ierr); ierr = PetscOptionsGetReal(PETSC_NULL,"-time_interval",&(hinfo.dt),PETSC_NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(PETSC_NULL,"-num_of_simulations",&(hinfo.totalNumSim),PETSC_NULL);CHKERRQ(ierr); n = hinfo.n; r = hinfo.r; dt = hinfo.dt; totalNumSim = hinfo.totalNumSim; vol = hinfo.vol = (double *)malloc(sizeof(double)*(2*n+1)); St0 = hinfo.St0 = hinfo.vol + n; ierr = readData(PETSC_COMM_WORLD,&hinfo);CHKERRQ(ierr); numdim = n*(n+1)/2; if (numdim%2 == 1){ numdim++; } eps = (double *)malloc(sizeof(double)*numdim); myNumSim = divWork(myid,totalNumSim,np); x = 0; for (i=0;i<myNumSim;i++){ stdNormalArray(eps,numdim,ran); x += basketPayoff(vol,St0,n,r,dt,eps); } ierr = MPI_Reduce(&x, &totalx, 1, MPI_DOUBLE, MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); time(&stop); /* payoff = exp(-r*dt*n)*(totalx/totalNumSim); ierr = PetscPrintf(PETSC_COMM_WORLD,"Option price = $%.3f using %ds of %s computation with %d %s for %d stocks, %d trading period per year, %.2f%% interest rate\n", payoff,(int)(stop - start),"parallel",np,"processors",n,(int)(1/dt),r);CHKERRQ(ierr); */ free(vol); free(eps); ierr = PetscRandomDestroy(&ran);CHKERRQ(ierr); PetscFinalize(); return 0; }