PetscErrorCode Monitor(SNES snes,PetscInt its,PetscReal rnorm,void *dummy) { UserCtx *user; PetscErrorCode ierr; PetscInt m,N; PetscScalar *w,*dw; Vec u_lambda,U,F,Uexact; DM packer; PetscReal norm; DM da; PetscFunctionBeginUser; ierr = SNESGetDM(snes,&packer);CHKERRQ(ierr); ierr = DMGetApplicationContext(packer,&user);CHKERRQ(ierr); ierr = SNESGetSolution(snes,&U);CHKERRQ(ierr); ierr = DMCompositeGetAccess(packer,U,&w,&u_lambda);CHKERRQ(ierr); ierr = VecView(u_lambda,user->u_lambda_viewer);CHKERRQ(ierr); ierr = DMCompositeRestoreAccess(packer,U,&w,&u_lambda);CHKERRQ(ierr); ierr = SNESGetFunction(snes,&F,0,0);CHKERRQ(ierr); ierr = DMCompositeGetAccess(packer,F,&w,&u_lambda);CHKERRQ(ierr); /* ierr = VecView(u_lambda,user->fu_lambda_viewer); */ ierr = DMCompositeRestoreAccess(packer,U,&w,&u_lambda);CHKERRQ(ierr); ierr = DMCompositeGetEntries(packer,&m,&da);CHKERRQ(ierr); ierr = DMDAGetInfo(da,0,&N,0,0,0,0,0,0,0,0,0,0,0);CHKERRQ(ierr); ierr = VecDuplicate(U,&Uexact);CHKERRQ(ierr); ierr = ExactSolution(packer,Uexact);CHKERRQ(ierr); ierr = VecAXPY(Uexact,-1.0,U);CHKERRQ(ierr); ierr = DMCompositeGetAccess(packer,Uexact,&dw,&u_lambda);CHKERRQ(ierr); ierr = VecStrideNorm(u_lambda,0,NORM_2,&norm);CHKERRQ(ierr); norm = norm/PetscSqrtReal((PetscReal)N-1.); if (dw) ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of error %g Error at x = 0 %g\n",(double)norm,(double)PetscRealPart(dw[0]));CHKERRQ(ierr); ierr = VecView(u_lambda,user->fu_lambda_viewer);CHKERRQ(ierr); ierr = DMCompositeRestoreAccess(packer,Uexact,&dw,&u_lambda);CHKERRQ(ierr); ierr = VecDestroy(&Uexact);CHKERRQ(ierr); 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); }
int main(int argc,char **argv) { Vec x; /* vectors */ PetscReal norm; PetscInt n = 20; PetscErrorCode ierr; PetscScalar one = 1.0; PetscInitialize(&argc,&argv,(char*)0,help); ierr = PetscOptionsGetInt(NULL,"-n",&n,NULL);CHKERRQ(ierr); /* Create a vector, specifying only its global dimension. When using VecCreate(), VecSetSizes() and VecSetFromOptions(), the vector format (currently parallel, shared, or sequential) is determined at runtime. Also, the parallel partitioning of the vector is determined by PETSc at runtime. Routines for creating particular vector types directly are: VecCreateSeq() - uniprocessor vector VecCreateMPI() - distributed vector, where the user can determine the parallel partitioning VecCreateShared() - parallel vector that uses shared memory (available only on the SGI); otherwise, is the same as VecCreateMPI() With VecCreate(), VecSetSizes() and VecSetFromOptions() the option -vec_type mpi or -vec_type shared causes the particular type of vector to be formed. */ ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,n);CHKERRQ(ierr); ierr = VecSetBlockSize(x,2);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); /* Set the vectors to entries to a constant value. */ ierr = VecSet(x,one);CHKERRQ(ierr); ierr = VecNorm(x,NORM_2,&norm);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of entire vector %G\n",norm);CHKERRQ(ierr); ierr = VecStrideNorm(x,0,NORM_2,&norm);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of sub-vector %G\n",norm);CHKERRQ(ierr); ierr = VecStrideNorm(x,1,NORM_2,&norm);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of sub-vector %G\n",norm);CHKERRQ(ierr); ierr = VecStrideNorm(x,1,NORM_1,&norm);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of sub-vector %G\n",norm);CHKERRQ(ierr); ierr = VecStrideNorm(x,1,NORM_INFINITY,&norm);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of sub-vector %G\n",norm);CHKERRQ(ierr); /* Free work space. All PETSc objects should be destroyed when they are no longer needed. */ ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }