PetscErrorCode MatColoringCreateLargestFirstWeights(MatColoring mc,PetscReal *weights) { PetscErrorCode ierr; PetscInt i,s,e,n,ncols; PetscRandom rand; PetscReal r; PetscInt *degrees; Mat G = mc->mat; PetscFunctionBegin; /* each weight should be the degree plus a random perturbation */ ierr = PetscRandomCreate(PetscObjectComm((PetscObject)mc),&rand);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); ierr = MatGetOwnershipRange(G,&s,&e);CHKERRQ(ierr); n=e-s; ierr = PetscMalloc1(n,°rees);CHKERRQ(ierr); ierr = MatColoringGetDegrees(G,mc->dist,degrees);CHKERRQ(ierr); for (i=s;i<e;i++) { ierr = MatGetRow(G,i,&ncols,NULL,NULL);CHKERRQ(ierr); ierr = PetscRandomGetValueReal(rand,&r);CHKERRQ(ierr); weights[i-s] = ncols + PetscAbsReal(r); ierr = MatRestoreRow(G,i,&ncols,NULL,NULL);CHKERRQ(ierr); } ierr = PetscRandomDestroy(&rand);CHKERRQ(ierr); ierr = PetscFree(degrees);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode TestSetup(DMLabel label, AppCtx *user) { PetscRandom r; PetscInt n = (PetscInt) (user->fill*(user->pEnd - user->pStart)), i; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscRandomCreate(PETSC_COMM_SELF, &r);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);/* -random_type <> */ ierr = PetscRandomSetInterval(r, user->pStart, user->pEnd);CHKERRQ(ierr); ierr = PetscRandomSetSeed(r, 123456789L);CHKERRQ(ierr); ierr = PetscRandomSeed(r);CHKERRQ(ierr); user->size = 0; for(i = 0; i < n; ++i) { PetscReal p; PetscInt val; ierr = PetscRandomGetValueReal(r, &p);CHKERRQ(ierr); ierr = DMLabelGetValue(label, (PetscInt) p, &val);CHKERRQ(ierr); if (val < 0) { ++user->size; ierr = DMLabelSetValue(label, (PetscInt) p, i % user->numStrata);CHKERRQ(ierr); } } ierr = PetscRandomDestroy(&r);CHKERRQ(ierr); ierr = DMLabelCreateIndex(label, user->pStart, user->pEnd);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF, "Created label with chart [%D, %D) and set %D values\n", user->pStart, user->pEnd, user->size);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode ComputeRHSMatrix(PetscInt m,PetscInt nrhs,Mat* C) { PetscErrorCode ierr; PetscRandom rand; Mat RHS; PetscScalar *array,rval; PetscInt i,k; PetscFunctionBegin; ierr = MatCreate(PETSC_COMM_WORLD,&RHS);CHKERRQ(ierr); ierr = MatSetSizes(RHS,m,PETSC_DECIDE,PETSC_DECIDE,nrhs);CHKERRQ(ierr); ierr = MatSetType(RHS,MATSEQDENSE);CHKERRQ(ierr); ierr = MatSetUp(RHS);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rand);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); ierr = MatDenseGetArray(RHS,&array);CHKERRQ(ierr); for (i=0; i<m; i++){ ierr = PetscRandomGetValue(rand,&rval);CHKERRQ(ierr); array[i] = rval; } if (nrhs > 1){ for (k=1; k<nrhs; k++){ for (i=0; i<m; i++){ array[m*k+i] = array[i]; } } } ierr = MatDenseRestoreArray(RHS,&array);CHKERRQ(ierr); ierr = MatAssemblyBegin(RHS,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(RHS,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); *C = RHS; ierr = PetscRandomDestroy(&rand);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscInt i,n = 1000,*values; PetscRandom rnd; PetscScalar value,avg = 0.0; PetscErrorCode ierr; PetscMPIInt rank; PetscInt view_rank=-1; #if defined(PETSC_USE_LOG) PetscLogEvent event; #endif ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-view_randomvalues",&view_rank,NULL);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rnd);CHKERRQ(ierr); /* force imaginary part of random number to always be zero; thus obtain reproducible results with real and complex numbers */ ierr = PetscRandomSetInterval(rnd,0.0,1.0);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rnd);CHKERRQ(ierr); ierr = PetscMalloc1(n,&values);CHKERRQ(ierr); for (i=0; i<n; i++) { ierr = PetscRandomGetValue(rnd,&value);CHKERRQ(ierr); avg += value; if (view_rank == (PetscInt)rank) { ierr = PetscPrintf(PETSC_COMM_SELF,"[%d] value[%D] = %6.4e\n",rank,i,(double)PetscRealPart(value));CHKERRQ(ierr); } values[i] = (PetscInt)(n*PetscRealPart(value) + 2.0); } avg = avg/((PetscReal)n); if (view_rank == (PetscInt)rank) { ierr = PetscPrintf(PETSC_COMM_SELF,"[%d] Average value %6.4e\n",rank,(double)PetscRealPart(avg));CHKERRQ(ierr); } ierr = PetscSortInt(n,values);CHKERRQ(ierr); ierr = PetscLogEventRegister("Sort",0,&event);CHKERRQ(ierr); ierr = PetscLogEventBegin(event,0,0,0,0);CHKERRQ(ierr); ierr = PetscRandomSeed(rnd);CHKERRQ(ierr); for (i=0; i<n; i++) { ierr = PetscRandomGetValue(rnd,&value);CHKERRQ(ierr); values[i] = (PetscInt)(n*PetscRealPart(value) + 2.0); /* printf("value[%d] = %g\n",i,value); */ } ierr = PetscSortInt(n,values);CHKERRQ(ierr); ierr = PetscLogEventEnd(event,0,0,0,0);CHKERRQ(ierr); for (i=1; i<n; i++) { if (values[i] < values[i-1]) SETERRQ(PETSC_COMM_SELF,1,"Values not sorted"); } ierr = PetscFree(values);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rnd);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
int main(int argc,char **argv) { Mat A,B,As; const PetscInt *ai,*aj; PetscInt i,j,k,nz,n,asi[]={0,2,3,4,6,7}; PetscInt asj[]={0,4,1,2,3,4,4}; PetscScalar asa[7],*aa; PetscRandom rctx; PetscErrorCode ierr; PetscMPIInt size; PetscBool flg; PetscInitialize(&argc,&argv,(char *)0,help); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); if (size != 1) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"This is a uniprocessor example only!"); /* Create a aij matrix for checking */ ierr = MatCreateSeqAIJ(PETSC_COMM_SELF,5,5,2,PETSC_NULL,&A);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rctx);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); k = 0; for (i=0; i<5; i++) { nz = asi[i+1] - asi[i]; /* length of i_th row of A */ for (j=0; j<nz; j++){ ierr = PetscRandomGetValue(rctx,&asa[k]);CHKERRQ(ierr); ierr = MatSetValues(A,1,&i,1,&asj[k],&asa[k],INSERT_VALUES);CHKERRQ(ierr); ierr = MatSetValues(A,1,&i,1,&asj[k],&asa[k],INSERT_VALUES);CHKERRQ(ierr); if (i != asj[k]){ /* insert symmetric entry */ ierr = MatSetValues(A,1,&asj[k],1,&i,&asa[k],INSERT_VALUES);CHKERRQ(ierr); } k++; } } ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); /* Create a baij matrix using MatCreateSeqBAIJWithArrays() */ ierr = MatGetRowIJ(A,0,PETSC_FALSE,PETSC_FALSE,&n,&ai,&aj,&flg);CHKERRQ(ierr); ierr = MatSeqAIJGetArray(A,&aa);CHKERRQ(ierr); /* WARNING: This sharing is dangerous if either A or B is later assembled */ ierr = MatCreateSeqBAIJWithArrays(PETSC_COMM_SELF,1,5,5,(PetscInt*)ai,(PetscInt*)aj,aa,&B);CHKERRQ(ierr); ierr = MatSeqAIJRestoreArray(A,&aa);CHKERRQ(ierr); ierr = MatRestoreRowIJ(A,0,PETSC_FALSE,PETSC_FALSE,&n,&ai,&aj,&flg);CHKERRQ(ierr); ierr = MatMultEqual(A,B,10,&flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMETYPE,"MatMult(A,B) are NOT equal"); /* Create a sbaij matrix using MatCreateSeqSBAIJWithArrays() */ ierr = MatCreateSeqSBAIJWithArrays(PETSC_COMM_SELF,1,5,5,asi,asj,asa,&As);CHKERRQ(ierr); ierr = MatMultEqual(A,As,10,&flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMETYPE,"MatMult(A,As) are NOT equal"); /* Free spaces */ ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = MatDestroy(&B);CHKERRQ(ierr); ierr = MatDestroy(&As);CHKERRQ(ierr); ierr = PetscFinalize(); return(0); }
int main(int argc, char **argv) { PetscErrorCode ierr; Vec *V,t; PetscInt i,j,reps,n=15,k=6; PetscRandom rctx; PetscScalar *val_dot,*val_mdot,*tval_dot,*tval_mdot; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-k",&k,NULL);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Test with %D random vectors of length %D",k,n);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"\n",k,n);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rctx);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_WORLD,&t);CHKERRQ(ierr); ierr = VecSetSizes(t,n,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(t);CHKERRQ(ierr); ierr = VecDuplicateVecs(t,k,&V);CHKERRQ(ierr); ierr = VecSetRandom(t,rctx);CHKERRQ(ierr); ierr = PetscMalloc1(k,&val_dot);CHKERRQ(ierr); ierr = PetscMalloc1(k,&val_mdot);CHKERRQ(ierr); ierr = PetscMalloc1(k,&tval_dot);CHKERRQ(ierr); ierr = PetscMalloc1(k,&tval_mdot);CHKERRQ(ierr); for (i=0; i<k; i++) { ierr = VecSetRandom(V[i],rctx);CHKERRQ(ierr); } for (reps=0; reps<20; reps++) { for (i=1; i<k; i++) { ierr = VecMDot(t,i,V,val_mdot);CHKERRQ(ierr); ierr = VecMTDot(t,i,V,tval_mdot);CHKERRQ(ierr); for (j=0;j<i;j++) { ierr = VecDot(t,V[j],&val_dot[j]);CHKERRQ(ierr); ierr = VecTDot(t,V[j],&tval_dot[j]);CHKERRQ(ierr); } /* Check result */ for (j=0;j<i;j++) { if (PetscAbsScalar(val_mdot[j] - val_dot[j])/PetscAbsScalar(val_dot[j]) > 1e-5) { ierr = PetscPrintf(PETSC_COMM_WORLD, "[TEST FAILED] i=%D, j=%D, val_mdot[j]=%g, val_dot[j]=%g\n",i,j,(double)PetscAbsScalar(val_mdot[j]), (double)PetscAbsScalar(val_dot[j]));CHKERRQ(ierr); break; } if (PetscAbsScalar(tval_mdot[j] - tval_dot[j])/PetscAbsScalar(tval_dot[j]) > 1e-5) { ierr = PetscPrintf(PETSC_COMM_WORLD, "[TEST FAILED] i=%D, j=%D, tval_mdot[j]=%g, tval_dot[j]=%g\n",i,j,(double)PetscAbsScalar(tval_mdot[j]), (double)PetscAbsScalar(tval_dot[j]));CHKERRQ(ierr); break; } } } } ierr = PetscPrintf(PETSC_COMM_WORLD,"Test completed successfully!\n",k,n);CHKERRQ(ierr); ierr = PetscFree(val_dot);CHKERRQ(ierr); ierr = PetscFree(val_mdot);CHKERRQ(ierr); ierr = PetscFree(tval_dot);CHKERRQ(ierr); ierr = PetscFree(tval_mdot);CHKERRQ(ierr); ierr = VecDestroyVecs(k,&V);CHKERRQ(ierr); ierr = VecDestroy(&t);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
/*@ MatMultEqual - Compares matrix-vector products of two matrices. Collective on Mat Input Parameters: + A - the first matrix - B - the second matrix - n - number of random vectors to be tested Output Parameter: . flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise. Level: intermediate Concepts: matrices^equality between @*/ PetscErrorCode MatMultEqual(Mat A,Mat B,PetscInt n,PetscBool *flg) { PetscErrorCode ierr; Vec x,s1,s2; PetscRandom rctx; PetscReal r1,r2,tol=1.e-10; PetscInt am,an,bm,bn,k; PetscScalar none = -1.0; PetscFunctionBegin; PetscValidHeaderSpecific(A,MAT_CLASSID,1); PetscValidHeaderSpecific(B,MAT_CLASSID,2); ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); if (am != bm || an != bn) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); PetscCheckSameComm(A,1,B,2); #if defined(PETSC_USE_REAL_SINGLE) tol = 1.e-5; #endif ierr = PetscRandomCreate(((PetscObject)A)->comm,&rctx);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); ierr = VecCreate(((PetscObject)A)->comm,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,an,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecCreate(((PetscObject)A)->comm,&s1);CHKERRQ(ierr); ierr = VecSetSizes(s1,am,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(s1);CHKERRQ(ierr); ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); *flg = PETSC_TRUE; for (k=0; k<n; k++) { ierr = VecSetRandom(x,rctx);CHKERRQ(ierr); ierr = MatMult(A,x,s1);CHKERRQ(ierr); ierr = MatMult(B,x,s2);CHKERRQ(ierr); ierr = VecNorm(s2,NORM_INFINITY,&r2);CHKERRQ(ierr); if (r2 < tol){ ierr = VecNorm(s1,NORM_INFINITY,&r1);CHKERRQ(ierr); } else { ierr = VecAXPY(s2,none,s1);CHKERRQ(ierr); ierr = VecNorm(s2,NORM_INFINITY,&r1);CHKERRQ(ierr); r1 /= r2; } if (r1 > tol) { *flg = PETSC_FALSE; ierr = PetscInfo2(A,"Error: %D-th MatMult() %G\n",k,r1);CHKERRQ(ierr); break; } } ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&s1);CHKERRQ(ierr); ierr = VecDestroy(&s2);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscLogDouble x,y; double value; void *arr[1000],*dummy; int i,rand1[1000],rand2[1000]; PetscErrorCode ierr; PetscRandom r; PetscBool flg; ierr = PetscInitialize(&argc,&argv,0,0);if (ierr) return ierr; ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr); for (i=0; i<1000; i++) { ierr = PetscRandomGetValue(r,&value);CHKERRQ(ierr); rand1[i] = (int)(value* 144327); ierr = PetscRandomGetValue(r,&value);CHKERRQ(ierr); rand2[i] = (int)(value* 144327); } /* Take care of paging effects */ ierr = PetscMalloc1(100,&dummy);CHKERRQ(ierr); ierr = PetscFree(dummy);CHKERRQ(ierr); ierr = PetscTime(&x);CHKERRQ(ierr); /* Do all mallocs */ for (i=0; i< 1000; i++) { ierr = PetscMalloc1(rand1[i],&arr[i]);CHKERRQ(ierr); } ierr = PetscTime(&x);CHKERRQ(ierr); /* Do some frees */ for (i=0; i< 1000; i+=2) { ierr = PetscFree(arr[i]);CHKERRQ(ierr); } /* Do some mallocs */ for (i=0; i< 1000; i+=2) { ierr = PetscMalloc1(rand2[i],&arr[i]);CHKERRQ(ierr); } ierr = PetscTime(&y);CHKERRQ(ierr); for (i=0; i< 1000; i++) { ierr = PetscFree(arr[i]);CHKERRQ(ierr); } fprintf(stdout,"%-15s : %e sec, with options : ","PetscMalloc",(y-x)/500.0); ierr = PetscOptionsHasName(NULL,"-malloc",&flg);CHKERRQ(ierr); if (flg) fprintf(stdout,"-malloc "); fprintf(stdout,"\n"); ierr = PetscRandomDestroy(&r);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
PetscErrorCode KSPSetFromOptions_Chebyshev(KSP ksp) { KSP_Chebyshev *cheb = (KSP_Chebyshev*)ksp->data; PetscErrorCode ierr; PetscInt two = 2,four = 4; PetscReal tform[4] = {PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE}; PetscBool flg; PetscFunctionBegin; ierr = PetscOptionsHead("KSP Chebyshev Options");CHKERRQ(ierr); ierr = PetscOptionsInt("-ksp_chebyshev_eststeps","Number of est steps in Chebyshev","",cheb->eststeps,&cheb->eststeps,NULL);CHKERRQ(ierr); ierr = PetscOptionsRealArray("-ksp_chebyshev_eigenvalues","extreme eigenvalues","KSPChebyshevSetEigenvalues",&cheb->emin,&two,0);CHKERRQ(ierr); ierr = PetscOptionsRealArray("-ksp_chebyshev_estimate_eigenvalues","estimate eigenvalues using a Krylov method, then use this transform for Chebyshev eigenvalue bounds","KSPChebyshevSetEstimateEigenvalues",tform,&four,&flg);CHKERRQ(ierr); if (flg) { switch (four) { case 0: ierr = KSPChebyshevSetEstimateEigenvalues(ksp,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); break; case 2: /* Base everything on the max eigenvalues */ ierr = KSPChebyshevSetEstimateEigenvalues(ksp,PETSC_DECIDE,tform[0],PETSC_DECIDE,tform[1]);CHKERRQ(ierr); break; case 4: /* Use the full 2x2 linear transformation */ ierr = KSPChebyshevSetEstimateEigenvalues(ksp,tform[0],tform[1],tform[2],tform[3]);CHKERRQ(ierr); break; default: SETERRQ(PetscObjectComm((PetscObject)ksp),PETSC_ERR_ARG_INCOMP,"Must specify either 0, 2, or 4 parameters for eigenvalue estimation"); } } if (cheb->kspest) { PetscBool estrand = PETSC_FALSE; ierr = PetscOptionsBool("-ksp_chebyshev_estimate_eigenvalues_random","Use Random right hand side for eigenvalue estimation","KSPChebyshevEstEigSetRandom",estrand,&estrand,NULL);CHKERRQ(ierr); if (estrand) { PetscRandom random; ierr = PetscRandomCreate(PetscObjectComm((PetscObject)ksp),&random);CHKERRQ(ierr); ierr = PetscObjectSetOptionsPrefix((PetscObject)random,((PetscObject)ksp)->prefix);CHKERRQ(ierr); ierr = PetscObjectAppendOptionsPrefix((PetscObject)random,"ksp_chebyshev_estimate_eigenvalues_");CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(random);CHKERRQ(ierr); ierr = KSPChebyshevEstEigSetRandom(ksp,random);CHKERRQ(ierr); ierr = PetscRandomDestroy(&random);CHKERRQ(ierr); } } if (cheb->kspest) { /* Mask the PC so that PCSetFromOptions does not do anything */ ierr = KSPSetPC(cheb->kspest,cheb->pcnone);CHKERRQ(ierr); ierr = KSPSetOptionsPrefix(cheb->kspest,((PetscObject)ksp)->prefix);CHKERRQ(ierr); ierr = KSPAppendOptionsPrefix(cheb->kspest,"est_");CHKERRQ(ierr); if (!((PetscObject)cheb->kspest)->type_name) { ierr = KSPSetType(cheb->kspest,KSPGMRES);CHKERRQ(ierr); } ierr = KSPSetFromOptions(cheb->kspest);CHKERRQ(ierr); ierr = KSPSetPC(cheb->kspest,ksp->pc);CHKERRQ(ierr); } ierr = PetscOptionsTail();CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PCDestroy_Noise(PC pc) { PetscErrorCode ierr; PCNoise_Ctx *ctx; PetscFunctionBeginUser; ierr = PCShellGetContext(pc,(void**)&ctx);CHKERRQ(ierr); ierr = PetscRandomDestroy(&ctx->random);CHKERRQ(ierr); PetscFunctionReturn(0); }
/* MSA_InitialPoint - Calculates the initial guess in one of three ways. Input Parameters: . user - user-defined application context . X - vector for initial guess Output Parameters: . X - newly computed initial guess */ static int MSA_InitialPoint(AppCtx * user, Vec X) { int info; PetscInt start2=-1,i,j; PetscReal start1=0; PetscTruth flg1,flg2; info = PetscOptionsGetReal(PETSC_NULL,"-start",&start1,&flg1); CHKERRQ(info); info = PetscOptionsGetInt(PETSC_NULL,"-random",&start2,&flg2); CHKERRQ(info); if (flg1){ /* The zero vector is reasonable */ info = VecSet(X, start1); CHKERRQ(info); } else if (flg2 && start2>0){ /* Try a random start between -0.5 and 0.5 */ PetscRandom rctx; PetscScalar np5=-0.5; info = PetscRandomCreate(PETSC_COMM_WORLD,&rctx); CHKERRQ(info); for (i=0; i<start2; i++){ info = VecSetRandom(X, rctx); CHKERRQ(info); } info = PetscRandomDestroy(rctx); CHKERRQ(info); info = VecShift(X, np5); CHKERRQ(info); } else { /* Take an average of the boundary conditions */ PetscInt xs,xm,ys,ym; PetscInt mx=user->mx,my=user->my; PetscScalar **x; /* Get local mesh boundaries */ info = DAGetCorners(user->da,&xs,&ys,PETSC_NULL,&xm,&ym,PETSC_NULL); CHKERRQ(info); /* Get pointers to vector data */ info = DAVecGetArray(user->da,X,(void**)&x); /* Perform local computations */ for (j=ys; j<ys+ym; j++){ for (i=xs; i< xs+xm; i++){ x[j][i] = ( ((j+1)*user->bottom[i-xs+1]+(my-j+1)*user->top[i-xs+1])/(my+2)+ ((i+1)*user->left[j-ys+1]+(mx-i+1)*user->right[j-ys+1])/(mx+2))/2.0; } } /* Restore vectors */ info = DAVecRestoreArray(user->da,X,(void**)&x); CHKERRQ(info); info = PetscLogFlops(9*xm*ym); CHKERRQ(info); } return 0; }
static PetscErrorCode KSPChebyshevEstEigSetRandom_Chebyshev(KSP ksp,PetscRandom random) { KSP_Chebyshev *cheb = (KSP_Chebyshev*)ksp->data; PetscErrorCode ierr; PetscFunctionBegin; if (random) {ierr = PetscObjectReference((PetscObject)random);CHKERRQ(ierr);} ierr = PetscRandomDestroy(&cheb->random);CHKERRQ(ierr); cheb->random = random; PetscFunctionReturn(0); }
/*@C TSMonitorSPEigCtxDestroy - Destroys a scatter plot context that was created with TSMonitorSPEigCtxCreate(). Collective on TSMonitorSPEigCtx Input Parameter: . ctx - the monitor context Level: intermediate .keywords: TS, monitor, line graph, destroy .seealso: TSMonitorSPEigCtxCreate(), TSMonitorSet(), TSMonitorSPEig(); @*/ PetscErrorCode TSMonitorSPEigCtxDestroy(TSMonitorSPEigCtx *ctx) { PetscDraw draw; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscDrawSPGetDraw((*ctx)->drawsp,&draw);CHKERRQ(ierr); ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr); ierr = PetscDrawSPDestroy(&(*ctx)->drawsp);CHKERRQ(ierr); ierr = KSPDestroy(&(*ctx)->ksp);CHKERRQ(ierr); ierr = PetscRandomDestroy(&(*ctx)->rand);CHKERRQ(ierr); ierr = PetscFree(*ctx);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscRandom rand1,rand2; /* Every PETSc routine should begin with the PetscInitialize() routine. argc, argv - These command line arguments are taken to extract the options supplied to PETSc and options supplied to MPI. help - When PETSc executable is invoked with the option -help, it prints the various options that can be applied at runtime. The user can use the "help" variable place additional help messages in this printout. */ ierr = PetscInitialize(&argc,&argv,(char *)0,help);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rand1);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand1);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rand2);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand2);CHKERRQ(ierr); #if defined(PETSC_USE_SERVER) ierr = PetscPrintf(PETSC_COMM_WORLD,"Starting up PetscWebServe()\n");CHKERRQ(ierr); ierr = PetscWebServe(PETSC_COMM_WORLD,PETSC_DEFAULT);CHKERRQ(ierr); while (1) {;} #endif ierr = PetscRandomDestroy(&rand1);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rand2);CHKERRQ(ierr); /* Always call PetscFinalize() before exiting a program. This routine - finalizes the PETSc libraries as well as MPI - provides summary and diagnostic information if certain runtime options are chosen (e.g., -log_summary). See PetscFinalize() manpage for more information. */ ierr = PetscFinalize(); return 0; }
static PetscErrorCode KSPDestroy_Chebyshev(KSP ksp) { KSP_Chebyshev *cheb = (KSP_Chebyshev*)ksp->data; PetscErrorCode ierr; PetscFunctionBegin; ierr = KSPDestroy(&cheb->kspest);CHKERRQ(ierr); ierr = PetscRandomDestroy(&cheb->random);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPChebyshevSetEigenvalues_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPChebyshevEstEigSet_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPChebyshevEstEigSetRandom_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPChebyshevEstEigGetKSP_C",NULL);CHKERRQ(ierr); ierr = KSPDestroyDefault(ksp);CHKERRQ(ierr); PetscFunctionReturn(0); }
void PetscVector::randomize( double alpha, double beta, double * /* ix */ ) { int ierr; PetscRandom rctx; ierr = PetscRandomCreate(PETSC_COMM_WORLD,RANDOM_DEFAULT,&rctx); assert(ierr == 0); ierr = PetscRandomSetInterval(rctx, alpha, beta ); assert(ierr == 0); ierr = VecSetRandom(pv, rctx); assert(ierr == 0); ierr = PetscRandomDestroy(rctx); assert(ierr == 0); }
PetscErrorCode FormInitialState(Vec X, AppCtx* user) { PetscErrorCode ierr; PetscRandom R; PetscFunctionBegin; ierr = PetscRandomCreate(PETSC_COMM_WORLD, &R);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(R);CHKERRQ(ierr); ierr = PetscRandomSetInterval(R, 0., 10.);CHKERRQ(ierr); /* * Initialize the state vector */ ierr = VecSetRandom(X, R);CHKERRQ(ierr); ierr = PetscRandomDestroy(&R);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscInt i,n = 1000,*values; int event; PetscRandom rand; PetscReal value; PetscErrorCode ierr; PetscBool values_view=PETSC_FALSE; PetscMPIInt rank; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,0,"-values_view",&values_view,NULL);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_SELF,&rand);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); ierr = PetscMalloc1(n,&values);CHKERRQ(ierr); for (i=0; i<n; i++) { ierr = PetscRandomGetValueReal(rand,&value);CHKERRQ(ierr); values[i] = (PetscInt)(n*value + 2.0); } ierr = PetscSortInt(n,values);CHKERRQ(ierr); ierr = PetscLogEventRegister("Sort",0,&event);CHKERRQ(ierr); ierr = PetscLogEventBegin(event,0,0,0,0);CHKERRQ(ierr); for (i=0; i<n; i++) { ierr = PetscRandomGetValueReal(rand,&value);CHKERRQ(ierr); values[i] = (PetscInt)(n*value + 2.0); } ierr = PetscSortInt(n,values);CHKERRQ(ierr); ierr = PetscLogEventEnd(event,0,0,0,0);CHKERRQ(ierr); for (i=1; i<n; i++) { if (values[i] < values[i-1]) SETERRQ(PETSC_COMM_SELF,1,"Values not sorted"); if (values_view && !rank) {ierr = PetscPrintf(PETSC_COMM_SELF,"%D %D\n",i,values[i]);CHKERRQ(ierr);} } ierr = PetscFree(values);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rand);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
/*@C EPSDestroy - Destroys the EPS context. Collective on EPS Input Parameter: . eps - eigensolver context obtained from EPSCreate() Level: beginner .seealso: EPSCreate(), EPSSetUp(), EPSSolve() @*/ PetscErrorCode EPSDestroy(EPS *eps) { PetscErrorCode ierr; PetscFunctionBegin; if (!*eps) PetscFunctionReturn(0); PetscValidHeaderSpecific(*eps,EPS_CLASSID,1); if (--((PetscObject)(*eps))->refct > 0) { *eps = 0; PetscFunctionReturn(0); } ierr = EPSReset(*eps); CHKERRQ(ierr); if ((*eps)->ops->destroy) { ierr = (*(*eps)->ops->destroy)(*eps); CHKERRQ(ierr); } ierr = STDestroy(&(*eps)->st); CHKERRQ(ierr); ierr = RGDestroy(&(*eps)->rg); CHKERRQ(ierr); ierr = DSDestroy(&(*eps)->ds); CHKERRQ(ierr); ierr = PetscRandomDestroy(&(*eps)->rand); CHKERRQ(ierr); ierr = PetscFree((*eps)->sc); CHKERRQ(ierr); /* just in case the initial vectors have not been used */ ierr = SlepcBasisDestroy_Private(&(*eps)->nds,&(*eps)->defl); CHKERRQ(ierr); ierr = SlepcBasisDestroy_Private(&(*eps)->nini,&(*eps)->IS); CHKERRQ(ierr); if ((*eps)->convergeddestroy) { ierr = (*(*eps)->convergeddestroy)((*eps)->convergedctx); CHKERRQ(ierr); } ierr = EPSMonitorCancel(*eps); CHKERRQ(ierr); ierr = PetscHeaderDestroy(eps); CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatColoringCreateRandomWeights(MatColoring mc,PetscReal *weights) { PetscErrorCode ierr; PetscInt i,s,e; PetscRandom rand; PetscReal r; Mat G = mc->mat; PetscFunctionBegin; /* each weight should be the degree plus a random perturbation */ ierr = PetscRandomCreate(PetscObjectComm((PetscObject)mc),&rand);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); ierr = MatGetOwnershipRange(G,&s,&e);CHKERRQ(ierr); for (i=s;i<e;i++) { ierr = PetscRandomGetValueReal(rand,&r);CHKERRQ(ierr); weights[i-s] = PetscAbsReal(r); } ierr = PetscRandomDestroy(&rand);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscInt i,n = 1000,*values; int event; PetscRandom rand; PetscScalar value; PetscErrorCode ierr; PetscInitialize(&argc,&argv,(char *)0,help); ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_SELF,&rand);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); ierr = PetscMalloc(n*sizeof(PetscInt),&values);CHKERRQ(ierr); for (i=0; i<n; i++) { ierr = PetscRandomGetValue(rand,&value);CHKERRQ(ierr); values[i] = (PetscInt)(n*PetscRealPart(value) + 2.0); } ierr = PetscSortInt(n,values);CHKERRQ(ierr); ierr = PetscLogEventRegister("Sort",0,&event);CHKERRQ(ierr); ierr = PetscLogEventBegin(event,0,0,0,0);CHKERRQ(ierr); for (i=0; i<n; i++) { ierr = PetscRandomGetValue(rand,&value);CHKERRQ(ierr); values[i] = (PetscInt)(n*PetscRealPart(value) + 2.0); } ierr = PetscSortInt(n,values);CHKERRQ(ierr); ierr = PetscLogEventEnd(event,0,0,0,0);CHKERRQ(ierr); for (i=1; i<n; i++) { if (values[i] < values[i-1]) SETERRQ(1,"Values not sorted"); } ierr = PetscFree(values);CHKERRQ(ierr); ierr = PetscRandomDestroy(rand);CHKERRQ(ierr); ierr = PetscFinalize();CHKERRQ(ierr); return 0; }
PetscErrorCode SNESDiffParameterCreate_More(SNES snes,Vec x,void **outneP) { DIFFPAR_MORE *neP; Vec w; PetscRandom rctx; /* random number generator context */ PetscErrorCode ierr; PetscBool flg; char noise_file[PETSC_MAX_PATH_LEN]; PetscFunctionBegin; ierr = PetscNewLog(snes,&neP);CHKERRQ(ierr); neP->function_count = 0; neP->fnoise_min = 1.0e-20; neP->hopt_min = 1.0e-8; neP->h_first_try = 1.0e-3; neP->fnoise_resets = 0; neP->hopt_resets = 0; /* Create work vectors */ ierr = VecDuplicateVecs(x,3,&neP->workv);CHKERRQ(ierr); w = neP->workv[0]; /* Set components of vector w to random numbers */ ierr = PetscRandomCreate(PetscObjectComm((PetscObject)snes),&rctx);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); ierr = VecSetRandom(w,rctx);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); /* Open output file */ ierr = PetscOptionsGetString(((PetscObject)snes)->prefix,"-snes_mf_noise_file",noise_file,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); if (flg) neP->fp = fopen(noise_file,"w"); else neP->fp = fopen("noise.out","w"); if (!neP->fp) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file"); ierr = PetscInfo(snes,"Creating Jorge's differencing parameter context\n");CHKERRQ(ierr); *outneP = neP; PetscFunctionReturn(0); }
Ensure(FFT, i_transform_is_inverse_of_transform) { Vec v; PetscInt dim = 5; DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,dim,2,1,NULL,&da); DMCreateGlobalVector(da, &v); PetscRandom rdm; PetscRandomCreate(PETSC_COMM_WORLD, &rdm); PetscRandomSetFromOptions(rdm); VecSetRandom(v, rdm); PetscRandomDestroy(&rdm); Vec vIn; VecDuplicate(v, &vIn); VecCopy(v, vIn); scFftCreate(da, &fft); Vec x, y, z; scFftCreateVecsFFTW(fft, &x, &y, &z); int component = 0; scFftTransform(fft, v, component, y); scFftITransform(fft, v, component, y); VecAXPY(v, -dim, vIn); PetscReal error; VecStrideNorm(v, component, NORM_INFINITY, &error); assert_that(error < 1.0e-6, is_true); VecDestroy(&x); VecDestroy(&y); VecDestroy(&z); VecDestroy(&v); VecDestroy(&vIn); scFftDestroy(&fft); DMDestroy(&da); }
/*@ BVSetRandomColumn - Set one column of a BV to random numbers. Logically Collective on BV Input Parameters: + bv - basis vectors . j - column number to be set - rctx - the random number context, formed by PetscRandomCreate(), or NULL and it will create one internally. Note: This operation is analogue to VecSetRandom - the difference is that the generated random vector is the same irrespective of the size of the communicator (if all processes pass a PetscRandom context initialized with the same seed). Level: advanced .seealso: BVSetRandom(), BVSetActiveColumns() @*/ PetscErrorCode BVSetRandomColumn(BV bv,PetscInt j,PetscRandom rctx) { PetscErrorCode ierr; PetscRandom rand=NULL; PetscInt i,low,high; PetscScalar *px,t; Vec x; PetscFunctionBegin; PetscValidHeaderSpecific(bv,BV_CLASSID,1); PetscValidLogicalCollectiveInt(bv,j,2); if (rctx) PetscValidHeaderSpecific(rctx,PETSC_RANDOM_CLASSID,3); else { ierr = PetscRandomCreate(PetscObjectComm((PetscObject)bv),&rand);CHKERRQ(ierr); ierr = PetscRandomSetSeed(rand,0x12345678);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); rctx = rand; } PetscValidType(bv,1); BVCheckSizes(bv,1); if (j<0 || j>=bv->m) SETERRQ2(PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Argument j has wrong value %D, the number of columns is %D",j,bv->m); ierr = PetscLogEventBegin(BV_SetRandom,bv,rctx,0,0);CHKERRQ(ierr); ierr = BVGetColumn(bv,j,&x);CHKERRQ(ierr); ierr = VecGetOwnershipRange(x,&low,&high);CHKERRQ(ierr); ierr = VecGetArray(x,&px);CHKERRQ(ierr); for (i=0;i<bv->N;i++) { ierr = PetscRandomGetValue(rctx,&t);CHKERRQ(ierr); if (i>=low && i<high) px[i-low] = t; } ierr = VecRestoreArray(x,&px);CHKERRQ(ierr); ierr = BVRestoreColumn(bv,j,&x);CHKERRQ(ierr); ierr = PetscLogEventEnd(BV_SetRandom,bv,rctx,0,0);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rand);CHKERRQ(ierr); ierr = PetscObjectStateIncrease((PetscObject)bv);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ BVSetRandom - Set the columns of a BV to random numbers. Logically Collective on BV Input Parameters: + bv - basis vectors - rctx - the random number context, formed by PetscRandomCreate(), or NULL and it will create one internally. Note: All active columns (except the leading ones) are modified. Level: advanced .seealso: BVSetRandomColumn(), BVSetActiveColumns() @*/ PetscErrorCode BVSetRandom(BV bv,PetscRandom rctx) { PetscErrorCode ierr; PetscRandom rand=NULL; PetscInt i,low,high,k; PetscScalar *px,t; Vec x; PetscFunctionBegin; PetscValidHeaderSpecific(bv,BV_CLASSID,1); if (rctx) PetscValidHeaderSpecific(rctx,PETSC_RANDOM_CLASSID,2); else { ierr = PetscRandomCreate(PetscObjectComm((PetscObject)bv),&rand);CHKERRQ(ierr); ierr = PetscRandomSetSeed(rand,0x12345678);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); rctx = rand; } PetscValidType(bv,1); BVCheckSizes(bv,1); ierr = PetscLogEventBegin(BV_SetRandom,bv,rctx,0,0);CHKERRQ(ierr); for (k=bv->l;k<bv->k;k++) { ierr = BVGetColumn(bv,k,&x);CHKERRQ(ierr); ierr = VecGetOwnershipRange(x,&low,&high);CHKERRQ(ierr); ierr = VecGetArray(x,&px);CHKERRQ(ierr); for (i=0;i<bv->N;i++) { ierr = PetscRandomGetValue(rctx,&t);CHKERRQ(ierr); if (i>=low && i<high) px[i-low] = t; } ierr = VecRestoreArray(x,&px);CHKERRQ(ierr); ierr = BVRestoreColumn(bv,k,&x);CHKERRQ(ierr); } ierr = PetscLogEventEnd(BV_SetRandom,bv,rctx,0,0);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rand);CHKERRQ(ierr); ierr = PetscObjectStateIncrease((PetscObject)bv);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { DM da; /* distributed array */ Vec x,b,u; /* approx solution, RHS, exact solution */ Mat A; /* linear system matrix */ KSP ksp; /* linear solver context */ PetscRandom rctx; /* random number generator context */ PetscReal norm; /* norm of solution error */ PetscInt i,j,its; PetscErrorCode ierr; PetscBool flg = PETSC_FALSE; PetscLogStage stage; DMDALocalInfo info; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); /* Create distributed array to handle parallel distribution. The problem size will default to 8 by 7, but this can be changed using -da_grid_x M -da_grid_y N */ ierr = DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE,DMDA_STENCIL_STAR,-8,-7,PETSC_DECIDE,PETSC_DECIDE,1,1,NULL,NULL,&da);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Compute the matrix and right-hand-side vector that define the linear system, Ax = b. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Create parallel matrix preallocated according to the DMDA, format AIJ by default. To use symmetric storage, run with -dm_mat_type sbaij -mat_ignore_lower_triangular */ ierr = DMSetMatType(da,MATAIJ);CHKERRQ(ierr); ierr = DMCreateMatrix(da,&A);CHKERRQ(ierr); /* Set matrix elements for the 2-D, five-point stencil in parallel. - Each processor needs to insert only elements that it owns locally (but any non-local elements will be sent to the appropriate processor during matrix assembly). - Rows and columns are specified by the stencil - Entries are normalized for a domain [0,1]x[0,1] */ ierr = PetscLogStageRegister("Assembly", &stage);CHKERRQ(ierr); ierr = PetscLogStagePush(stage);CHKERRQ(ierr); ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); for (j=info.ys; j<info.ys+info.ym; j++) { for (i=info.xs; i<info.xs+info.xm; i++) { PetscReal hx = 1./info.mx,hy = 1./info.my; MatStencil row = {0},col[5] = {{0}}; PetscScalar v[5]; PetscInt ncols = 0; row.j = j; row.i = i; col[ncols].j = j; col[ncols].i = i; v[ncols++] = 2*(hx/hy + hy/hx); /* boundaries */ if (i>0) {col[ncols].j = j; col[ncols].i = i-1; v[ncols++] = -hy/hx;} if (i<info.mx-1) {col[ncols].j = j; col[ncols].i = i+1; v[ncols++] = -hy/hx;} if (j>0) {col[ncols].j = j-1; col[ncols].i = i; v[ncols++] = -hx/hy;} if (j<info.my-1) {col[ncols].j = j+1; col[ncols].i = i; v[ncols++] = -hx/hy;} ierr = MatSetValuesStencil(A,1,&row,ncols,col,v,INSERT_VALUES);CHKERRQ(ierr); } } /* Assemble matrix, using the 2-step process: MatAssemblyBegin(), MatAssemblyEnd() Computations can be done while messages are in transition by placing code between these two statements. */ ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = PetscLogStagePop();CHKERRQ(ierr); /* Create parallel vectors compatible with the DMDA. */ ierr = DMCreateGlobalVector(da,&u);CHKERRQ(ierr); ierr = VecDuplicate(u,&b);CHKERRQ(ierr); ierr = VecDuplicate(u,&x);CHKERRQ(ierr); /* Set exact solution; then compute right-hand-side vector. By default we use an exact solution of a vector with all elements of 1.0; Alternatively, using the runtime option -random_sol forms a solution vector with random components. */ ierr = PetscOptionsGetBool(NULL,"-random_exact_sol",&flg,NULL);CHKERRQ(ierr); if (flg) { ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rctx);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); ierr = VecSetRandom(u,rctx);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); } else { ierr = VecSet(u,1.);CHKERRQ(ierr); } ierr = MatMult(A,u,b);CHKERRQ(ierr); /* View the exact solution vector if desired */ flg = PETSC_FALSE; ierr = PetscOptionsGetBool(NULL,"-view_exact_sol",&flg,NULL);CHKERRQ(ierr); if (flg) {ierr = VecView(u,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);} /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create the linear solver and set various options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Create linear solver context */ ierr = KSPCreate(PETSC_COMM_WORLD,&ksp);CHKERRQ(ierr); /* Set operators. Here the matrix that defines the linear system also serves as the preconditioning matrix. */ ierr = KSPSetOperators(ksp,A,A);CHKERRQ(ierr); /* Set runtime options, e.g., -ksp_type <type> -pc_type <type> -ksp_monitor -ksp_rtol <rtol> These options will override those specified above as long as KSPSetFromOptions() is called _after_ any other customization routines. */ ierr = KSPSetFromOptions(ksp);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solve the linear system - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = KSPSolve(ksp,b,x);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Check solution and clean up - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Check the error */ ierr = VecAXPY(x,-1.,u);CHKERRQ(ierr); ierr = VecNorm(x,NORM_2,&norm);CHKERRQ(ierr); ierr = KSPGetIterationNumber(ksp,&its);CHKERRQ(ierr); /* Print convergence information. PetscPrintf() produces a single print statement from all processes that share a communicator. An alternative is PetscFPrintf(), which prints to a file. */ ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of error %g iterations %D\n",(double)norm,its);CHKERRQ(ierr); /* Free work space. All PETSc objects should be destroyed when they are no longer needed. */ ierr = KSPDestroy(&ksp);CHKERRQ(ierr); ierr = VecDestroy(&u);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&b);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = DMDestroy(&da);CHKERRQ(ierr); /* Always call PetscFinalize() before exiting a program. This routine - finalizes the PETSc libraries as well as MPI - provides summary and diagnostic information if certain runtime options are chosen (e.g., -log_summary). */ ierr = PetscFinalize(); return 0; }
PetscInt main(PetscInt argc,char **args) { typedef enum {RANDOM, CONSTANT, TANH, NUM_FUNCS} FuncType; const char *funcNames[NUM_FUNCS] = {"random", "constant", "tanh"}; PetscMPIInt size; PetscInt n = 10,N,Ny,ndim=4,dim[4],DIM,i; Vec x,y,z; PetscScalar s; PetscRandom rdm; PetscReal enorm; PetscInt func=RANDOM; FuncType function = RANDOM; PetscBool view = PETSC_FALSE; PetscErrorCode ierr; PetscScalar *x_array,*y_array,*z_array; fftw_plan fplan,bplan; const ptrdiff_t N0 = 20, N1 = 20; ptrdiff_t alloc_local, local_n0, local_0_start; ierr = PetscInitialize(&argc,&args,(char *)0,help);CHKERRQ(ierr); #if defined(PETSC_USE_COMPLEX) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP, "This example requires real numbers"); #endif ierr = MPI_Comm_size(PETSC_COMM_WORLD, &size);CHKERRQ(ierr); alloc_local=fftw_mpi_local_size_2d(N0, N1, PETSC_COMM_WORLD, &local_n0, &local_0_start); if (size != 1) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP, "This is a uniprocessor example only!"); ierr = PetscOptionsBegin(PETSC_COMM_WORLD, PETSC_NULL, "FFTW Options", "ex142");CHKERRQ(ierr); ierr = PetscOptionsEList("-function", "Function type", "ex142", funcNames, NUM_FUNCS, funcNames[function], &func, PETSC_NULL);CHKERRQ(ierr); ierr = PetscOptionsBool("-vec_view draw", "View the functions", "ex112", view, &view, PETSC_NULL);CHKERRQ(ierr); function = (FuncType) func; ierr = PetscOptionsEnd();CHKERRQ(ierr); for (DIM = 0; DIM < ndim; DIM++){ dim[DIM] = n; /* size of real space vector in DIM-dimension */ } ierr = PetscRandomCreate(PETSC_COMM_SELF, &rdm);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rdm);CHKERRQ(ierr); for (DIM = 1; DIM < 5; DIM++){ /* create vectors of length N=dim[0]*dim[1]* ...*dim[DIM-1] */ /*----------------------------------------------------------*/ N = Ny = 1; for (i = 0; i < DIM-1; i++) { N *= dim[i]; } Ny = N; Ny *= 2*(dim[DIM-1]/2 + 1); /* add padding elements to output vector y */ N *= dim[DIM-1]; ierr = PetscPrintf(PETSC_COMM_SELF, "\n %d-D: FFTW on vector of size %d \n",DIM,N);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,N,&x);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) x, "Real space vector");CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,Ny,&y);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) y, "Frequency space vector");CHKERRQ(ierr); ierr = VecDuplicate(x,&z);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) z, "Reconstructed vector");CHKERRQ(ierr); /* Set fftw plan */ /*----------------------------------*/ ierr = VecGetArray(x,&x_array);CHKERRQ(ierr); ierr = VecGetArray(y,&y_array);CHKERRQ(ierr); ierr = VecGetArray(z,&z_array);CHKERRQ(ierr); unsigned int flags = FFTW_ESTIMATE; //or FFTW_MEASURE /* The data in the in/out arrays is overwritten during FFTW_MEASURE planning, so such planning should be done before the input is initialized by the user. */ printf("DIM: %d, N %d, Ny %d\n",DIM,N,Ny); switch (DIM){ case 1: fplan = fftw_plan_dft_r2c_1d(dim[0], (double *)x_array, (fftw_complex*)y_array, flags); bplan = fftw_plan_dft_c2r_1d(dim[0], (fftw_complex*)y_array, (double *)z_array, flags); break; case 2: fplan = fftw_plan_dft_r2c_2d(dim[0],dim[1],(double *)x_array, (fftw_complex*)y_array,flags); bplan = fftw_plan_dft_c2r_2d(dim[0],dim[1],(fftw_complex*)y_array,(double *)z_array,flags); break; case 3: fplan = fftw_plan_dft_r2c_3d(dim[0],dim[1],dim[2],(double *)x_array, (fftw_complex*)y_array,flags); bplan = fftw_plan_dft_c2r_3d(dim[0],dim[1],dim[2],(fftw_complex*)y_array,(double *)z_array,flags); break; default: fplan = fftw_plan_dft_r2c(DIM,dim,(double *)x_array, (fftw_complex*)y_array,flags); bplan = fftw_plan_dft_c2r(DIM,dim,(fftw_complex*)y_array,(double *)z_array,flags); break; } ierr = VecRestoreArray(x,&x_array);CHKERRQ(ierr); ierr = VecRestoreArray(y,&y_array);CHKERRQ(ierr); ierr = VecRestoreArray(z,&z_array);CHKERRQ(ierr); /* Initialize Real space vector x: The data in the in/out arrays is overwritten during FFTW_MEASURE planning, so planning should be done before the input is initialized by the user. --------------------------------------------------------*/ if (function == RANDOM) { ierr = VecSetRandom(x, rdm);CHKERRQ(ierr); } else if (function == CONSTANT) { ierr = VecSet(x, 1.0);CHKERRQ(ierr); } else if (function == TANH) { ierr = VecGetArray(x, &x_array);CHKERRQ(ierr); for (i = 0; i < N; ++i) { x_array[i] = tanh((i - N/2.0)*(10.0/N)); } ierr = VecRestoreArray(x, &x_array);CHKERRQ(ierr); } if (view) { ierr = VecView(x, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); } /* FFT - also test repeated transformation */ /*-------------------------------------------*/ ierr = VecGetArray(x,&x_array);CHKERRQ(ierr); ierr = VecGetArray(y,&y_array);CHKERRQ(ierr); ierr = VecGetArray(z,&z_array);CHKERRQ(ierr); for (i=0; i<3; i++){ /* FFTW_FORWARD */ fftw_execute(fplan); //printf("\n fout:\n"); //fftw_complex* fout = (fftw_complex*)y_array; //for (i=0; i<N/2+1; i++) printf("%d (%g %g)\n",i,fout[i][0],fout[i][1]); /* FFTW_BACKWARD: destroys its input array 'y_array' even for out-of-place transforms! */ fftw_execute(bplan); } ierr = VecRestoreArray(x,&x_array);CHKERRQ(ierr); ierr = VecRestoreArray(y,&y_array);CHKERRQ(ierr); ierr = VecRestoreArray(z,&z_array);CHKERRQ(ierr); /* Compare x and z. FFTW computes an unnormalized DFT, thus z = N*x */ /*------------------------------------------------------------------*/ s = 1.0/(PetscReal)N; ierr = VecScale(z,s);CHKERRQ(ierr); if (view) {ierr = VecView(x, PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr);} if (view) {ierr = VecView(z, PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr);} ierr = VecAXPY(z,-1.0,x);CHKERRQ(ierr); ierr = VecNorm(z,NORM_1,&enorm);CHKERRQ(ierr); if (enorm > 1.e-11){ ierr = PetscPrintf(PETSC_COMM_SELF," Error norm of |x - z| %G\n",enorm);CHKERRQ(ierr); } /* free spaces */ fftw_destroy_plan(fplan); fftw_destroy_plan(bplan); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&y);CHKERRQ(ierr); ierr = VecDestroy(&z);CHKERRQ(ierr); } ierr = PetscRandomDestroy(&rdm);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
int main(int argc,char **args) { PetscErrorCode ierr; PetscMPIInt rank,size; PetscInt N0=50,N1=20,N=N0*N1,DIM; PetscRandom rdm; PetscScalar a; PetscReal enorm; Vec x,y,z; PetscBool view=PETSC_FALSE,use_interface=PETSC_TRUE; ierr = PetscInitialize(&argc,&args,(char*)0,help);CHKERRQ(ierr); #if !defined(PETSC_USE_COMPLEX) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP, "This example requires complex numbers"); #endif ierr = PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "FFTW Options", "ex143");CHKERRQ(ierr); ierr = PetscOptionsBool("-vec_view draw", "View the vectors", "ex143", view, &view, NULL);CHKERRQ(ierr); ierr = PetscOptionsBool("-use_FFTW_interface", "Use PETSc-FFTW interface", "ex143",use_interface, &use_interface, NULL);CHKERRQ(ierr); ierr = PetscOptionsEnd();CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,"-use_FFTW_interface",&use_interface,NULL);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD, &size);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD, &rdm);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rdm);CHKERRQ(ierr); if (!use_interface) { /* Use mpi FFTW without PETSc-FFTW interface, 2D case only */ /*---------------------------------------------------------*/ fftw_plan fplan,bplan; fftw_complex *data_in,*data_out,*data_out2; ptrdiff_t alloc_local,local_n0,local_0_start; DIM = 2; if (!rank) { ierr = PetscPrintf(PETSC_COMM_SELF,"Use FFTW without PETSc-FFTW interface, DIM %D\n",DIM);CHKERRQ(ierr); } fftw_mpi_init(); N = N0*N1; alloc_local = fftw_mpi_local_size_2d(N0,N1,PETSC_COMM_WORLD,&local_n0,&local_0_start); data_in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*alloc_local); data_out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*alloc_local); data_out2 = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*alloc_local); ierr = VecCreateMPIWithArray(PETSC_COMM_WORLD,1,(PetscInt)local_n0*N1,(PetscInt)N,(const PetscScalar*)data_in,&x);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) x, "Real Space vector");CHKERRQ(ierr); ierr = VecCreateMPIWithArray(PETSC_COMM_WORLD,1,(PetscInt)local_n0*N1,(PetscInt)N,(const PetscScalar*)data_out,&y);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) y, "Frequency space vector");CHKERRQ(ierr); ierr = VecCreateMPIWithArray(PETSC_COMM_WORLD,1,(PetscInt)local_n0*N1,(PetscInt)N,(const PetscScalar*)data_out2,&z);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) z, "Reconstructed vector");CHKERRQ(ierr); fplan = fftw_mpi_plan_dft_2d(N0,N1,data_in,data_out,PETSC_COMM_WORLD,FFTW_FORWARD,FFTW_ESTIMATE); bplan = fftw_mpi_plan_dft_2d(N0,N1,data_out,data_out2,PETSC_COMM_WORLD,FFTW_BACKWARD,FFTW_ESTIMATE); ierr = VecSetRandom(x, rdm);CHKERRQ(ierr); if (view) {ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);} fftw_execute(fplan); if (view) {ierr = VecView(y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);} fftw_execute(bplan); /* Compare x and z. FFTW computes an unnormalized DFT, thus z = N*x */ a = 1.0/(PetscReal)N; ierr = VecScale(z,a);CHKERRQ(ierr); if (view) {ierr = VecView(z, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);} ierr = VecAXPY(z,-1.0,x);CHKERRQ(ierr); ierr = VecNorm(z,NORM_1,&enorm);CHKERRQ(ierr); if (enorm > 1.e-11 && !rank) { ierr = PetscPrintf(PETSC_COMM_SELF," Error norm of |x - z| %g\n",(double)enorm);CHKERRQ(ierr); } /* Free spaces */ fftw_destroy_plan(fplan); fftw_destroy_plan(bplan); fftw_free(data_in); ierr = VecDestroy(&x);CHKERRQ(ierr); fftw_free(data_out); ierr = VecDestroy(&y);CHKERRQ(ierr); fftw_free(data_out2);ierr = VecDestroy(&z);CHKERRQ(ierr); } else { /* Use PETSc-FFTW interface */ /*-------------------------------------------*/ PetscInt i,*dim,k; Mat A; N=1; for (i=1; i<5; i++) { DIM = i; ierr = PetscMalloc1(i,&dim);CHKERRQ(ierr); for (k=0; k<i; k++) { dim[k]=30; } N *= dim[i-1]; /* Create FFTW object */ if (!rank) printf("Use PETSc-FFTW interface...%d-DIM: %d\n",(int)DIM,(int)N); ierr = MatCreateFFT(PETSC_COMM_WORLD,DIM,dim,MATFFTW,&A);CHKERRQ(ierr); /* Create vectors that are compatible with parallel layout of A - must call MatCreateVecs()! */ ierr = MatCreateVecsFFTW(A,&x,&y,&z);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) x, "Real space vector");CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) y, "Frequency space vector");CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) z, "Reconstructed vector");CHKERRQ(ierr); /* Set values of space vector x */ ierr = VecSetRandom(x,rdm);CHKERRQ(ierr); if (view) {ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);} /* Apply FFTW_FORWARD and FFTW_BACKWARD */ ierr = MatMult(A,x,y);CHKERRQ(ierr); if (view) {ierr = VecView(y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);} ierr = MatMultTranspose(A,y,z);CHKERRQ(ierr); /* Compare x and z. FFTW computes an unnormalized DFT, thus z = N*x */ a = 1.0/(PetscReal)N; ierr = VecScale(z,a);CHKERRQ(ierr); if (view) {ierr = VecView(z,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);} ierr = VecAXPY(z,-1.0,x);CHKERRQ(ierr); ierr = VecNorm(z,NORM_1,&enorm);CHKERRQ(ierr); if (enorm > 1.e-9 && !rank) { ierr = PetscPrintf(PETSC_COMM_SELF," Error norm of |x - z| %e\n",enorm);CHKERRQ(ierr); } ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&y);CHKERRQ(ierr); ierr = VecDestroy(&z);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = PetscFree(dim);CHKERRQ(ierr); } } ierr = PetscRandomDestroy(&rdm);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
PetscInt main(PetscInt argc,char **args) { typedef enum {RANDOM, CONSTANT, TANH, NUM_FUNCS} FuncType; const char *funcNames[NUM_FUNCS] = {"random", "constant", "tanh"}; Mat A; PetscMPIInt size; PetscInt n = 10,N,ndim=4,dim[4],DIM,i; Vec x,y,z; PetscScalar s; PetscRandom rdm; PetscReal enorm; PetscInt func; FuncType function = RANDOM; PetscBool view = PETSC_FALSE; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&args,(char *)0,help);CHKERRQ(ierr); #if !defined(PETSC_USE_COMPLEX) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP, "This example requires complex numbers"); #endif ierr = MPI_Comm_size(PETSC_COMM_WORLD, &size);CHKERRQ(ierr); if (size != 1) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP, "This is a uniprocessor example only!"); ierr = PetscOptionsBegin(PETSC_COMM_WORLD, PETSC_NULL, "FFTW Options", "ex112");CHKERRQ(ierr); ierr = PetscOptionsEList("-function", "Function type", "ex112", funcNames, NUM_FUNCS, funcNames[function], &func, PETSC_NULL);CHKERRQ(ierr); ierr = PetscOptionsBool("-vec_view draw", "View the functions", "ex112", view, &view, PETSC_NULL);CHKERRQ(ierr); function = (FuncType) func; ierr = PetscOptionsEnd();CHKERRQ(ierr); for (DIM = 0; DIM < ndim; DIM++){ dim[DIM] = n; /* size of transformation in DIM-dimension */ } ierr = PetscRandomCreate(PETSC_COMM_SELF, &rdm);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rdm);CHKERRQ(ierr); for (DIM = 1; DIM < 5; DIM++){ for (i = 0, N = 1; i < DIM; i++) N *= dim[i]; ierr = PetscPrintf(PETSC_COMM_SELF, "\n %d-D: FFTW on vector of size %d \n",DIM,N);CHKERRQ(ierr); /* create FFTW object */ ierr = MatCreateFFT(PETSC_COMM_SELF,DIM,dim,MATFFTW,&A);CHKERRQ(ierr); /* create vectors of length N=n^DIM */ ierr = MatGetVecs(A,&x,&y);CHKERRQ(ierr); ierr = MatGetVecs(A,&z,PETSC_NULL);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) x, "Real space vector");CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) y, "Frequency space vector");CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) z, "Reconstructed vector");CHKERRQ(ierr); /* set values of space vector x */ if (function == RANDOM) { ierr = VecSetRandom(x, rdm);CHKERRQ(ierr); } else if (function == CONSTANT) { ierr = VecSet(x, 1.0);CHKERRQ(ierr); } else if (function == TANH) { PetscScalar *a; ierr = VecGetArray(x, &a);CHKERRQ(ierr); for (i = 0; i < N; ++i) { a[i] = tanh((i - N/2.0)*(10.0/N)); } ierr = VecRestoreArray(x, &a);CHKERRQ(ierr); } if (view) {ierr = VecView(x, PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr);} /* apply FFTW_FORWARD and FFTW_BACKWARD several times on same x, y, and z */ for (i=0; i<3; i++){ ierr = MatMult(A,x,y);CHKERRQ(ierr); if (view && i == 0) {ierr = VecView(y, PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr);} ierr = MatMultTranspose(A,y,z);CHKERRQ(ierr); /* compare x and z. FFTW computes an unnormalized DFT, thus z = N*x */ s = 1.0/(PetscReal)N; ierr = VecScale(z,s);CHKERRQ(ierr); if (view && i == 0) {ierr = VecView(z, PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr);} ierr = VecAXPY(z,-1.0,x);CHKERRQ(ierr); ierr = VecNorm(z,NORM_1,&enorm);CHKERRQ(ierr); if (enorm > 1.e-11){ ierr = PetscPrintf(PETSC_COMM_SELF," Error norm of |x - z| %G\n",enorm);CHKERRQ(ierr); } } /* apply FFTW_FORWARD and FFTW_BACKWARD several times on different x */ for (i=0; i<3; i++){ ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,N,&x);CHKERRQ(ierr); ierr = VecSetRandom(x, rdm);CHKERRQ(ierr); ierr = MatMult(A,x,y);CHKERRQ(ierr); ierr = MatMultTranspose(A,y,z);CHKERRQ(ierr); /* compare x and z. FFTW computes an unnormalized DFT, thus z = N*x */ s = 1.0/(PetscReal)N; ierr = VecScale(z,s);CHKERRQ(ierr); if (view && i == 0) {ierr = VecView(z, PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr);} ierr = VecAXPY(z,-1.0,x);CHKERRQ(ierr); ierr = VecNorm(z,NORM_1,&enorm);CHKERRQ(ierr); if (enorm > 1.e-11){ ierr = PetscPrintf(PETSC_COMM_SELF," Error norm of new |x - z| %G\n",enorm);CHKERRQ(ierr); } } /* free spaces */ ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&y);CHKERRQ(ierr); ierr = VecDestroy(&z);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); } ierr = PetscRandomDestroy(&rdm);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
PetscErrorCode FormTestMatrix(Mat A,PetscInt n,TestType type) { #if !defined(PETSC_USE_COMPLEX) SETERRQ(((PetscObject)A)->comm,1,"FormTestMatrix: These problems require complex numbers."); #else PetscScalar val[5]; PetscErrorCode ierr; PetscInt i,j,Ii,J,col[5],Istart,Iend; ierr = MatGetOwnershipRange(A,&Istart,&Iend);CHKERRQ(ierr); if (type == TEST_1) { val[0] = 1.0; val[1] = 4.0; val[2] = -2.0; for (i=1; i<n-1; i++) { col[0] = i-1; col[1] = i; col[2] = i+1; ierr = MatSetValues(A,1,&i,3,col,val,INSERT_VALUES);CHKERRQ(ierr); } i = n-1; col[0] = n-2; col[1] = n-1; ierr = MatSetValues(A,1,&i,2,col,val,INSERT_VALUES);CHKERRQ(ierr); i = 0; col[0] = 0; col[1] = 1; val[0] = 4.0; val[1] = -2.0; ierr = MatSetValues(A,1,&i,2,col,val,INSERT_VALUES);CHKERRQ(ierr); } else if (type == TEST_2) { val[0] = 1.0; val[1] = 0.0; val[2] = 2.0; val[3] = 1.0; for (i=2; i<n-1; i++) { col[0] = i-2; col[1] = i-1; col[2] = i; col[3] = i+1; ierr = MatSetValues(A,1,&i,4,col,val,INSERT_VALUES);CHKERRQ(ierr); } i = n-1; col[0] = n-3; col[1] = n-2; col[2] = n-1; ierr = MatSetValues(A,1,&i,3,col,val,INSERT_VALUES);CHKERRQ(ierr); i = 1; col[0] = 0; col[1] = 1; col[2] = 2; ierr = MatSetValues(A,1,&i,3,col,&val[1],INSERT_VALUES);CHKERRQ(ierr); i = 0; ierr = MatSetValues(A,1,&i,2,col,&val[2],INSERT_VALUES);CHKERRQ(ierr); } else if (type == TEST_3) { val[0] = PETSC_i * 2.0; val[1] = 4.0; val[2] = 0.0; val[3] = 1.0; val[4] = 0.7; for (i=1; i<n-3; i++) { col[0] = i-1; col[1] = i; col[2] = i+1; col[3] = i+2; col[4] = i+3; ierr = MatSetValues(A,1,&i,5,col,val,INSERT_VALUES);CHKERRQ(ierr); } i = n-3; col[0] = n-4; col[1] = n-3; col[2] = n-2; col[3] = n-1; ierr = MatSetValues(A,1,&i,4,col,val,INSERT_VALUES);CHKERRQ(ierr); i = n-2; col[0] = n-3; col[1] = n-2; col[2] = n-1; ierr = MatSetValues(A,1,&i,3,col,val,INSERT_VALUES);CHKERRQ(ierr); i = n-1; col[0] = n-2; col[1] = n-1; ierr = MatSetValues(A,1,&i,2,col,val,INSERT_VALUES);CHKERRQ(ierr); i = 0; col[0] = 0; col[1] = 1; col[2] = 2; col[3] = 3; ierr = MatSetValues(A,1,&i,4,col,&val[1],INSERT_VALUES);CHKERRQ(ierr); } else if (type == HELMHOLTZ_1) { /* Problem domain: unit square: (0,1) x (0,1) Solve Helmholtz equation: -delta u - sigma1*u + i*sigma2*u = f, where delta = Laplace operator Dirichlet b.c.'s on all sides */ PetscRandom rctx; PetscReal h2,sigma1 = 5.0; PetscScalar sigma2; ierr = PetscOptionsGetReal(PETSC_NULL,"-sigma1",&sigma1,PETSC_NULL);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rctx);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); ierr = PetscRandomSetInterval(rctx,0.0,PETSC_i);CHKERRQ(ierr); h2 = 1.0/((n+1)*(n+1)); for (Ii=Istart; Ii<Iend; Ii++) { *val = -1.0; i = Ii/n; j = Ii - i*n; if (i>0) { J = Ii-n; ierr = MatSetValues(A,1,&Ii,1,&J,val,ADD_VALUES);CHKERRQ(ierr);} if (i<n-1) { J = Ii+n; ierr = MatSetValues(A,1,&Ii,1,&J,val,ADD_VALUES);CHKERRQ(ierr);} if (j>0) { J = Ii-1; ierr = MatSetValues(A,1,&Ii,1,&J,val,ADD_VALUES);CHKERRQ(ierr);} if (j<n-1) { J = Ii+1; ierr = MatSetValues(A,1,&Ii,1,&J,val,ADD_VALUES);CHKERRQ(ierr);} ierr = PetscRandomGetValue(rctx,&sigma2);CHKERRQ(ierr); *val = 4.0 - sigma1*h2 + sigma2*h2; ierr = MatSetValues(A,1,&Ii,1,&Ii,val,ADD_VALUES);CHKERRQ(ierr); } ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); } else if (type == HELMHOLTZ_2) { /* Problem domain: unit square: (0,1) x (0,1) Solve Helmholtz equation: -delta u - sigma1*u = f, where delta = Laplace operator Dirichlet b.c.'s on 3 sides du/dn = i*alpha*u on (1,y), 0<y<1 */ PetscReal h2,sigma1 = 200.0; PetscScalar alpha_h; ierr = PetscOptionsGetReal(PETSC_NULL,"-sigma1",&sigma1,PETSC_NULL);CHKERRQ(ierr); h2 = 1.0/((n+1)*(n+1)); alpha_h = (PETSC_i * 10.0) / (PetscReal)(n+1); /* alpha_h = alpha * h */ for (Ii=Istart; Ii<Iend; Ii++) { *val = -1.0; i = Ii/n; j = Ii - i*n; if (i>0) { J = Ii-n; ierr = MatSetValues(A,1,&Ii,1,&J,val,ADD_VALUES);CHKERRQ(ierr);} if (i<n-1) { J = Ii+n; ierr = MatSetValues(A,1,&Ii,1,&J,val,ADD_VALUES);CHKERRQ(ierr);} if (j>0) { J = Ii-1; ierr = MatSetValues(A,1,&Ii,1,&J,val,ADD_VALUES);CHKERRQ(ierr);} if (j<n-1) { J = Ii+1; ierr = MatSetValues(A,1,&Ii,1,&J,val,ADD_VALUES);CHKERRQ(ierr);} *val = 4.0 - sigma1*h2; if (!((Ii+1)%n)) *val += alpha_h; ierr = MatSetValues(A,1,&Ii,1,&Ii,val,ADD_VALUES);CHKERRQ(ierr); } } else SETERRQ(((PetscObject)A)->comm,1,"FormTestMatrix: unknown test matrix type"); ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); #endif return 0; }