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; }
int main(int argc, char *argv[]) { PetscReal r,dt; PetscInt n; unsigned long i,myNumSim,totalNumSim,numdim; PetscReal *vol, *St0, x, totalx; PetscMPIInt size,rank; PetscReal *eps; himaInfo hinfo; PetscRandom ran; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = PetscRandomCreate(PETSC_COMM_WORLD,&ran);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(ran);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD, &size);CHKERRQ(ierr); /* number of nodes */ ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank);CHKERRQ(ierr); /* my ranking */ hinfo.n = 31; hinfo.r = 0.04; hinfo.dt = 1.0/12; /* a month as a period */ hinfo.totalNumSim = 1000; ierr = PetscOptionsGetInt(NULL,NULL,"-num_of_stocks",&(hinfo.n),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(NULL,NULL,"-interest_rate",&(hinfo.r),NULL);CHKERRQ(ierr); ierr = PetscOptionsGetReal(NULL,NULL,"-time_interval",&(hinfo.dt),NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-num_of_simulations",&(hinfo.totalNumSim),NULL);CHKERRQ(ierr); n = hinfo.n; r = hinfo.r; dt = hinfo.dt; totalNumSim = hinfo.totalNumSim; ierr = PetscMalloc1(2*n+1,&hinfo.vol);CHKERRQ(ierr); vol = hinfo.vol; St0 = hinfo.St0 = hinfo.vol + n; ierr = readData(PETSC_COMM_WORLD,&hinfo);CHKERRQ(ierr); numdim = n*(n+1)/2; if (numdim%2 == 1) numdim++; ierr = PetscMalloc1(numdim,&eps);CHKERRQ(ierr); myNumSim = divWork(rank,totalNumSim,size); x = 0; for (i=0; i<myNumSim; i++) { ierr = stdNormalArray(eps,numdim,ran);CHKERRQ(ierr); x += basketPayoff(vol,St0,n,r,dt,eps); } ierr = MPI_Reduce(&x, &totalx, 1, MPIU_REAL, MPIU_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); /* 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",size,"processors",n,(int)(1/dt),r);CHKERRQ(ierr); */ ierr = PetscFree(vol);CHKERRQ(ierr); ierr = PetscFree(eps);CHKERRQ(ierr); ierr = PetscRandomDestroy(&ran);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }