Actual source code: ex47.c
1: static char help[] = "Test VTK structured grid (.vts) viewer support\n\n";
3: #include <petscdm.h>
4: #include <petscdmda.h>
6: /*
7: Write 3D DMDA vector with coordinates in VTK .vts format
9: */
10: PetscErrorCode test_3d(const char filename[])
11: {
12: MPI_Comm comm = MPI_COMM_WORLD;
13: const PetscInt M=10,N=15,P=30,dof=1,sw=1;
14: const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0;
15: DM da;
16: Vec v;
17: PetscViewer view;
18: DMDALocalInfo info;
19: PetscScalar ***va;
20: PetscInt i,j,k;
21: PetscErrorCode ierr;
23: DMDACreate3d(comm,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR, M,N,P,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,dof,sw,NULL,NULL,NULL,&da);
24: DMSetFromOptions(da);
25: DMSetUp(da);
27: DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);
28: DMDAGetLocalInfo(da,&info);
29: DMCreateGlobalVector(da,&v);
30: DMDAVecGetArray(da,v,&va);
31: for (k=info.zs; k<info.zs+info.zm; k++) {
32: for (j=info.ys; j<info.ys+info.ym; j++) {
33: for (i=info.xs; i<info.xs+info.xm; i++) {
34: PetscScalar x = (Lx*i)/M;
35: PetscScalar y = (Ly*j)/N;
36: PetscScalar z = (Lz*k)/P;
37: va[k][j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2)+PetscPowScalarInt(z-0.5*Lz,2);
38: }
39: }
40: }
41: DMDAVecRestoreArray(da,v,&va);
42: PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);
43: VecView(v,view);
44: PetscViewerDestroy(&view);
45: VecDestroy(&v);
46: DMDestroy(&da);
47: return 0;
48: }
50: /*
51: Write 2D DMDA vector with coordinates in VTK .vts format
53: */
54: PetscErrorCode test_2d(const char filename[])
55: {
56: MPI_Comm comm = MPI_COMM_WORLD;
57: const PetscInt M=10,N=20,dof=1,sw=1;
58: const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0;
59: DM da;
60: Vec v;
61: PetscViewer view;
62: DMDALocalInfo info;
63: PetscScalar **va;
64: PetscInt i,j;
65: PetscErrorCode ierr;
67: DMDACreate2d(comm,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR, M,N,PETSC_DECIDE,PETSC_DECIDE,dof,sw,NULL,NULL,&da);
68: DMSetFromOptions(da);
69: DMSetUp(da);
70: DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);
71: DMDAGetLocalInfo(da,&info);
72: DMCreateGlobalVector(da,&v);
73: DMDAVecGetArray(da,v,&va);
74: for (j=info.ys; j<info.ys+info.ym; j++) {
75: for (i=info.xs; i<info.xs+info.xm; i++) {
76: PetscScalar x = (Lx*i)/M;
77: PetscScalar y = (Ly*j)/N;
78: va[j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2);
79: }
80: }
81: DMDAVecRestoreArray(da,v,&va);
82: PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);
83: VecView(v,view);
84: PetscViewerDestroy(&view);
85: VecDestroy(&v);
86: DMDestroy(&da);
87: return 0;
88: }
90: /*
91: Write 2D DMDA vector without coordinates in VTK .vts format
93: */
94: PetscErrorCode test_2d_nocoord(const char filename[])
95: {
96: MPI_Comm comm = MPI_COMM_WORLD;
97: const PetscInt M=10,N=20,dof=1,sw=1;
98: const PetscScalar Lx=1.0,Ly=1.0;
99: DM da;
100: Vec v;
101: PetscViewer view;
102: DMDALocalInfo info;
103: PetscScalar **va;
104: PetscInt i,j;
105: PetscErrorCode ierr;
107: DMDACreate2d(comm,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR,M,N,PETSC_DECIDE,PETSC_DECIDE,dof,sw,NULL,NULL,&da);
108: DMSetFromOptions(da);
109: DMSetUp(da);
110: DMDAGetLocalInfo(da,&info);
111: DMCreateGlobalVector(da,&v);
112: DMDAVecGetArray(da,v,&va);
113: for (j=info.ys; j<info.ys+info.ym; j++) {
114: for (i=info.xs; i<info.xs+info.xm; i++) {
115: PetscScalar x = (Lx*i)/M;
116: PetscScalar y = (Ly*j)/N;
117: va[j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2);
118: }
119: }
120: DMDAVecRestoreArray(da,v,&va);
121: PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);
122: VecView(v,view);
123: PetscViewerDestroy(&view);
124: VecDestroy(&v);
125: DMDestroy(&da);
126: return 0;
127: }
129: /*
130: Write 3D DMDA vector without coordinates in VTK .vts format
132: */
133: PetscErrorCode test_3d_nocoord(const char filename[])
134: {
135: MPI_Comm comm = MPI_COMM_WORLD;
136: const PetscInt M=10,N=20,P=30,dof=1,sw=1;
137: const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0;
138: DM da;
139: Vec v;
140: PetscViewer view;
141: DMDALocalInfo info;
142: PetscScalar ***va;
143: PetscInt i,j,k;
144: PetscErrorCode ierr;
146: DMDACreate3d(comm,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR, M,N,P,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,dof,sw,NULL,NULL,NULL,&da);
147: DMSetFromOptions(da);
148: DMSetUp(da);
150: DMDAGetLocalInfo(da,&info);
151: DMCreateGlobalVector(da,&v);
152: DMDAVecGetArray(da,v,&va);
153: for (k=info.zs; k<info.zs+info.zm; k++) {
154: for (j=info.ys; j<info.ys+info.ym; j++) {
155: for (i=info.xs; i<info.xs+info.xm; i++) {
156: PetscScalar x = (Lx*i)/M;
157: PetscScalar y = (Ly*j)/N;
158: PetscScalar z = (Lz*k)/P;
159: va[k][j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2)+PetscPowScalarInt(z-0.5*Lz,2);
160: }
161: }
162: }
163: DMDAVecRestoreArray(da,v,&va);
164: PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);
165: VecView(v,view);
166: PetscViewerDestroy(&view);
167: VecDestroy(&v);
168: DMDestroy(&da);
169: return 0;
170: }
172: int main(int argc, char *argv[])
173: {
176: PetscInitialize(&argc,&argv,0,help);if (ierr) return ierr;
177: test_3d("3d.vts");
178: test_2d("2d.vts");
179: test_2d_nocoord("2d_nocoord.vts");
180: test_3d_nocoord("3d_nocoord.vts");
181: PetscFinalize();
182: return ierr;
183: }
185: /*TEST
187: build:
188: requires: !complex
190: test:
191: nsize: 2
193: TEST*/