Actual source code: ex12.c
2: /*
3: Simple example to show how PETSc programs can be run from MATLAB.
4: See ex12.m.
5: */
7: static char help[] = "Solves the one dimensional heat equation.\n\n";
9: #include <petscdm.h>
10: #include <petscdmda.h>
12: int main(int argc,char **argv)
13: {
14: PetscMPIInt rank,size;
15: PetscInt M = 14,time_steps = 20,w=1,s=1,localsize,j,i,mybase,myend,globalsize;
16: DM da;
17: Vec global,local;
18: PetscScalar *globalptr,*localptr;
19: PetscReal h,k;
21: PetscInitialize(&argc,&argv,(char*)0,help);
22: PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);
23: PetscOptionsGetInt(NULL,NULL,"-time",&time_steps,NULL);
25: /* Set up the array */
26: DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,M,w,s,NULL,&da);
27: DMSetFromOptions(da);
28: DMSetUp(da);
29: DMCreateGlobalVector(da,&global);
30: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
31: MPI_Comm_size(PETSC_COMM_WORLD,&size);
33: /* Make copy of local array for doing updates */
34: DMCreateLocalVector(da,&local);
36: /* determine starting point of each processor */
37: VecGetOwnershipRange(global,&mybase,&myend);
39: /* Initialize the Array */
40: VecGetLocalSize (global,&globalsize);
41: VecGetArray (global,&globalptr);
43: for (i=0; i<globalsize; i++) {
44: j = i + mybase;
46: globalptr[i] = PetscSinReal((PETSC_PI*j*6)/((PetscReal)M) + 1.2 * PetscSinReal((PETSC_PI*j*2)/((PetscReal)M))) * 4+4;
47: }
49: VecRestoreArray(global,&localptr);
51: /* Assign Parameters */
52: h= 1.0/M;
53: k= h*h/2.2;
54: VecGetLocalSize(local,&localsize);
56: for (j=0; j<time_steps; j++) {
58: /* Global to Local */
59: DMGlobalToLocalBegin(da,global,INSERT_VALUES,local);
60: DMGlobalToLocalEnd(da,global,INSERT_VALUES,local);
62: /*Extract local array */
63: VecGetArray(local,&localptr);
64: VecGetArray (global,&globalptr);
66: /* Update Locally - Make array of new values */
67: /* Note: I don't do anything for the first and last entry */
68: for (i=1; i< localsize-1; i++) {
69: globalptr[i-1] = localptr[i] + (k/(h*h)) * (localptr[i+1]-2.0*localptr[i]+localptr[i-1]);
70: }
72: VecRestoreArray (global,&globalptr);
73: VecRestoreArray(local,&localptr);
75: /* View Wave */
76: /* Set Up Display to Show Heat Graph */
77: #if defined(PETSC_USE_SOCKET_VIEWER)
78: VecView(global,PETSC_VIEWER_SOCKET_WORLD);
79: #endif
80: }
82: VecDestroy(&local);
83: VecDestroy(&global);
84: DMDestroy(&da);
85: PetscFinalize();
86: return 0;
87: }