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;
17: DM da;
18: Vec global,local;
19: PetscScalar *globalptr,*localptr;
20: PetscReal h,k;
22: PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
23: PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);
24: PetscOptionsGetInt(NULL,NULL,"-time",&time_steps,NULL);
26: /* Set up the array */
27: DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,M,w,s,NULL,&da);
28: DMSetFromOptions(da);
29: DMSetUp(da);
30: DMCreateGlobalVector(da,&global);
31: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
32: MPI_Comm_size(PETSC_COMM_WORLD,&size);
34: /* Make copy of local array for doing updates */
35: DMCreateLocalVector(da,&local);
37: /* determine starting point of each processor */
38: VecGetOwnershipRange(global,&mybase,&myend);
40: /* Initialize the Array */
41: VecGetLocalSize (global,&globalsize);
42: VecGetArray (global,&globalptr);
44: for (i=0; i<globalsize; i++) {
45: j = i + mybase;
47: globalptr[i] = PetscSinReal((PETSC_PI*j*6)/((PetscReal)M) + 1.2 * PetscSinReal((PETSC_PI*j*2)/((PetscReal)M))) * 4+4;
48: }
50: VecRestoreArray(global,&localptr);
52: /* Assign Parameters */
53: h= 1.0/M;
54: k= h*h/2.2;
55: VecGetLocalSize(local,&localsize);
57: for (j=0; j<time_steps; j++) {
59: /* Global to Local */
60: DMGlobalToLocalBegin(da,global,INSERT_VALUES,local);
61: DMGlobalToLocalEnd(da,global,INSERT_VALUES,local);
63: /*Extract local array */
64: VecGetArray(local,&localptr);
65: VecGetArray (global,&globalptr);
67: /* Update Locally - Make array of new values */
68: /* Note: I don't do anything for the first and last entry */
69: for (i=1; i< localsize-1; i++) {
70: globalptr[i-1] = localptr[i] + (k/(h*h)) * (localptr[i+1]-2.0*localptr[i]+localptr[i-1]);
71: }
73: VecRestoreArray (global,&globalptr);
74: VecRestoreArray(local,&localptr);
76: /* View Wave */
77: /* Set Up Display to Show Heat Graph */
78: #if defined(PETSC_USE_SOCKET_VIEWER)
79: VecView(global,PETSC_VIEWER_SOCKET_WORLD);
80: #endif
81: }
83: VecDestroy(&local);
84: VecDestroy(&global);
85: DMDestroy(&da);
86: PetscFinalize();
87: return ierr;
88: }