Actual source code: vcreatea.c
petsc-3.3-p7 2013-05-11
2: #include <../src/sys/viewer/impls/ascii/asciiimpl.h> /*I "petscsys.h" I*/
4: /* ---------------------------------------------------------------------*/
5: /*
6: The variable Petsc_Viewer_Stdout_keyval is used to indicate an MPI attribute that
7: is attached to a communicator, in this case the attribute is a PetscViewer.
8: */
9: static PetscMPIInt Petsc_Viewer_Stdout_keyval = MPI_KEYVAL_INVALID;
13: /*@C
14: PetscViewerASCIIGetStdout - Creates a ASCII PetscViewer shared by all processors
15: in a communicator. Error returning version of PETSC_VIEWER_STDOUT_()
17: Collective on MPI_Comm
19: Input Parameter:
20: . comm - the MPI communicator to share the PetscViewer
22: Level: beginner
24: Notes:
25: This should be used in all PETSc source code instead of PETSC_VIEWER_STDOUT_()
27: .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDOUT_WORLD,
28: PETSC_VIEWER_STDOUT_SELF
30: @*/
31: PetscErrorCode PetscViewerASCIIGetStdout(MPI_Comm comm,PetscViewer *viewer)
32: {
34: PetscBool flg;
35: MPI_Comm ncomm;
38: PetscCommDuplicate(comm,&ncomm,PETSC_NULL);
39: if (Petsc_Viewer_Stdout_keyval == MPI_KEYVAL_INVALID) {
40: MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Stdout_keyval,0);
41: }
42: MPI_Attr_get(ncomm,Petsc_Viewer_Stdout_keyval,(void **)viewer,(PetscMPIInt*)&flg);
43: if (!flg) { /* PetscViewer not yet created */
44: PetscViewerASCIIOpen(ncomm,"stdout",viewer);
45: PetscObjectRegisterDestroy((PetscObject)*viewer);
46: MPI_Attr_put(ncomm,Petsc_Viewer_Stdout_keyval,(void*)*viewer);
47: }
48: PetscCommDestroy(&ncomm);
49: return(0);
50: }
54: /*@C
55: PETSC_VIEWER_STDOUT_ - Creates a ASCII PetscViewer shared by all processors
56: in a communicator.
58: Collective on MPI_Comm
60: Input Parameter:
61: . comm - the MPI communicator to share the PetscViewer
63: Level: beginner
65: Notes:
66: Unlike almost all other PETSc routines, this does not return
67: an error code. Usually used in the form
68: $ XXXView(XXX object,PETSC_VIEWER_STDOUT_(comm));
70: .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDOUT_WORLD,
71: PETSC_VIEWER_STDOUT_SELF
73: @*/
74: PetscViewer PETSC_VIEWER_STDOUT_(MPI_Comm comm)
75: {
77: PetscViewer viewer;
80: PetscViewerASCIIGetStdout(comm,&viewer);
81: if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_STDOUT_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); return(0);}
82: PetscFunctionReturn(viewer);
83: }
85: /* ---------------------------------------------------------------------*/
86: /*
87: The variable Petsc_Viewer_Stderr_keyval is used to indicate an MPI attribute that
88: is attached to a communicator, in this case the attribute is a PetscViewer.
89: */
90: static PetscMPIInt Petsc_Viewer_Stderr_keyval = MPI_KEYVAL_INVALID;
94: /*@C
95: PetscViewerASCIIGetStderr - Creates a ASCII PetscViewer shared by all processors
96: in a communicator. Error returning version of PETSC_VIEWER_STDERR_()
98: Collective on MPI_Comm
100: Input Parameter:
101: . comm - the MPI communicator to share the PetscViewer
103: Level: beginner
105: Notes:
106: This should be used in all PETSc source code instead of PETSC_VIEWER_STDERR_()
108: .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDERR_WORLD,
109: PETSC_VIEWER_STDERR_SELF
111: @*/
112: PetscErrorCode PetscViewerASCIIGetStderr(MPI_Comm comm,PetscViewer *viewer)
113: {
115: PetscBool flg;
116: MPI_Comm ncomm;
119: PetscCommDuplicate(comm,&ncomm,PETSC_NULL);
120: if (Petsc_Viewer_Stderr_keyval == MPI_KEYVAL_INVALID) {
121: MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Stderr_keyval,0);
122: }
123: MPI_Attr_get(ncomm,Petsc_Viewer_Stderr_keyval,(void **)viewer,(PetscMPIInt*)&flg);
124: if (!flg) { /* PetscViewer not yet created */
125: PetscViewerASCIIOpen(ncomm,"stderr",viewer);
126: PetscObjectRegisterDestroy((PetscObject)*viewer);
127: MPI_Attr_put(ncomm,Petsc_Viewer_Stderr_keyval,(void*)*viewer);
128: }
129: PetscCommDestroy(&ncomm);
130: return(0);
131: }
135: /*@C
136: PETSC_VIEWER_STDERR_ - Creates a ASCII PetscViewer shared by all processors
137: in a communicator.
139: Collective on MPI_Comm
141: Input Parameter:
142: . comm - the MPI communicator to share the PetscViewer
144: Level: beginner
146: Note:
147: Unlike almost all other PETSc routines, this does not return
148: an error code. Usually used in the form
149: $ XXXView(XXX object,PETSC_VIEWER_STDERR_(comm));
151: .seealso: PETSC_VIEWER_DRAW_, PetscViewerASCIIOpen(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDOUT_WORLD,
152: PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_STDERR_WORLD, PETSC_VIEWER_STDERR_SELF
153: @*/
154: PetscViewer PETSC_VIEWER_STDERR_(MPI_Comm comm)
155: {
157: PetscViewer viewer;
160: PetscViewerASCIIGetStderr(comm,&viewer);
161: if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_STDERR_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); return(0);}
162: PetscFunctionReturn(viewer);
163: }
166: PetscMPIInt Petsc_Viewer_keyval = MPI_KEYVAL_INVALID;
167: EXTERN_C_BEGIN
170: /*
171: Called with MPI_Comm_free() is called on a communicator that has a viewer as an attribute. The viewer is not actually destroyed because that is managed by
172: PetscObjectDestroyRegisterAll(). PetscViewerASCIIGetStdout() registers the viewer with PetscObjectDestroyRegister() to be destroyed when PetscFinalize() is called.
174: This is called by MPI, not by users.
176: */
177: PetscMPIInt MPIAPI Petsc_DelViewer(MPI_Comm comm,PetscMPIInt keyval,void* attr_val,void* extra_state)
178: {
182: PetscInfo1(0,"Removing viewer data attribute in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
183: PetscFunctionReturn(MPI_SUCCESS);
184: }
185: EXTERN_C_END
189: /*@C
190: PetscViewerASCIIOpen - Opens an ASCII file as a PetscViewer.
192: Collective on MPI_Comm
194: Input Parameters:
195: + comm - the communicator
196: - name - the file name
198: Output Parameter:
199: . lab - the PetscViewer to use with the specified file
201: Level: beginner
203: Notes:
204: This PetscViewer can be destroyed with PetscViewerDestroy().
206: If a multiprocessor communicator is used (such as PETSC_COMM_WORLD),
207: then only the first processor in the group opens the file. All other
208: processors send their data to the first processor to print.
210: Each processor can instead write its own independent output by
211: specifying the communicator PETSC_COMM_SELF.
213: As shown below, PetscViewerASCIIOpen() is useful in conjunction with
214: MatView() and VecView()
215: .vb
216: PetscViewerASCIIOpen(PETSC_COMM_WORLD,"mat.output",&viewer);
217: MatView(matrix,viewer);
218: .ve
220: Concepts: PetscViewerASCII^creating
221: Concepts: printf
222: Concepts: printing
223: Concepts: accessing remote file
224: Concepts: remote file
226: .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerBinaryOpen(),
227: PetscViewerASCIIGetPointer(), PetscViewerSetFormat(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDERR_,
228: PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF,
229: @*/
230: PetscErrorCode PetscViewerASCIIOpen(MPI_Comm comm,const char name[],PetscViewer *lab)
231: {
232: PetscErrorCode ierr;
233: PetscViewerLink *vlink,*nv;
234: PetscBool flg,eq;
235: size_t len;
238: PetscStrlen(name,&len);
239: if (!len) {
240: PetscViewerASCIIGetStdout(comm,lab);
241: PetscObjectReference((PetscObject)*lab);
242: return(0);
243: }
244: if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) {
245: MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelViewer,&Petsc_Viewer_keyval,(void*)0);
246: }
247: /* make sure communicator is a PETSc communicator */
248: PetscCommDuplicate(comm,&comm,PETSC_NULL);
249: /* has file already been opened into a viewer */
250: MPI_Attr_get(comm,Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);
251: if (flg) {
252: while (vlink) {
253: PetscStrcmp(name,((PetscViewer_ASCII*)(vlink->viewer->data))->filename,&eq);
254: if (eq) {
255: PetscObjectReference((PetscObject)vlink->viewer);
256: *lab = vlink->viewer;
257: PetscCommDestroy(&comm);
258: return(0);
259: }
260: vlink = vlink->next;
261: }
262: }
263: PetscViewerCreate(comm,lab);
264: PetscViewerSetType(*lab,PETSCVIEWERASCII);
265: if (name) {
266: PetscViewerFileSetName(*lab,name);
267: }
268: /* save viewer into communicator if needed later */
269: PetscNew(PetscViewerLink,&nv);
270: nv->viewer = *lab;
271: if (!flg) {
272: MPI_Attr_put(comm,Petsc_Viewer_keyval,nv);
273: } else {
274: MPI_Attr_get(comm,Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);
275: if (vlink) {
276: while (vlink->next) vlink = vlink->next;
277: vlink->next = nv;
278: } else {
279: MPI_Attr_put(comm,Petsc_Viewer_keyval,nv);
280: }
281: }
282: PetscCommDestroy(&comm);
283: return(0);
284: }
288: /*@C
289: PetscViewerASCIIOpenWithFILE - Given an open file creates an ASCII viewer that prints to it.
291: Collective on MPI_Comm
293: Input Parameters:
294: + comm - the communicator
295: - fd - the FILE pointer
297: Output Parameter:
298: . lab - the PetscViewer to use with the specified file
300: Level: beginner
302: Notes:
303: This PetscViewer can be destroyed with PetscViewerDestroy(), but the fd will NOT be closed.
305: If a multiprocessor communicator is used (such as PETSC_COMM_WORLD),
306: then only the first processor in the group uses the file. All other
307: processors send their data to the first processor to print.
309: Concepts: PetscViewerASCII^creating
310: Concepts: printf
311: Concepts: printing
312: Concepts: accessing remote file
313: Concepts: remote file
315: .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerBinaryOpen(),
316: PetscViewerASCIIGetPointer(), PetscViewerSetFormat(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDERR_,
317: PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF, PetscViewerASCIIOpen()
318: @*/
319: PetscErrorCode PetscViewerASCIIOpenWithFILE(MPI_Comm comm,FILE *fd,PetscViewer *lab)
320: {
321: PetscErrorCode ierr;
324: PetscViewerCreate(comm,lab);
325: PetscViewerSetType(*lab,PETSCVIEWERASCII);
326: PetscViewerASCIISetFILE(*lab,fd);
327: return(0);
328: }
332: PetscErrorCode PetscViewerASCIISetFILE(PetscViewer viewer,FILE *fd)
333: {
334: PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
337: vascii->fd = fd;
338: vascii->closefile = PETSC_FALSE;
339: return(0);
340: }