Actual source code: vcreatea.c
petsc-3.6.1 2015-08-06
2: #include <../src/sys/classes/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,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__,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,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__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); return(0);}
162: PetscFunctionReturn(viewer);
163: }
166: PetscMPIInt Petsc_Viewer_keyval = MPI_KEYVAL_INVALID;
169: /*
170: 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
171: PetscObjectDestroyRegisterAll(). PetscViewerASCIIGetStdout() registers the viewer with PetscObjectDestroyRegister() to be destroyed when PetscFinalize() is called.
173: This is called by MPI, not by users.
175: */
176: PETSC_EXTERN PetscMPIInt MPIAPI Petsc_DelViewer(MPI_Comm comm,PetscMPIInt keyval,void *attr_val,void *extra_state)
177: {
181: PetscInfo1(0,"Removing viewer data attribute in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
182: PetscFunctionReturn(MPI_SUCCESS);
183: }
187: /*@C
188: PetscViewerASCIIOpen - Opens an ASCII file as a PetscViewer.
190: Collective on MPI_Comm
192: Input Parameters:
193: + comm - the communicator
194: - name - the file name
196: Output Parameter:
197: . lab - the PetscViewer to use with the specified file
199: Level: beginner
201: Notes:
202: This PetscViewer can be destroyed with PetscViewerDestroy().
204: The MPI communicator used here must match that used by the object one is viewing. For example if the
205: Mat was created with a PETSC_COMM_WORLD, then the Viewer must be created with PETSC_COMM_WORLD
207: As shown below, PetscViewerASCIIOpen() is useful in conjunction with
208: MatView() and VecView()
209: .vb
210: PetscViewerASCIIOpen(PETSC_COMM_WORLD,"mat.output",&viewer);
211: MatView(matrix,viewer);
212: .ve
214: Concepts: PetscViewerASCII^creating
215: Concepts: printf
216: Concepts: printing
217: Concepts: accessing remote file
218: Concepts: remote file
220: .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerBinaryOpen(),
221: PetscViewerASCIIGetPointer(), PetscViewerSetFormat(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDERR_,
222: PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF,
223: @*/
224: PetscErrorCode PetscViewerASCIIOpen(MPI_Comm comm,const char name[],PetscViewer *lab)
225: {
226: PetscErrorCode ierr;
227: PetscViewerLink *vlink,*nv;
228: PetscBool flg,eq;
229: size_t len;
232: PetscStrlen(name,&len);
233: if (!len) {
234: PetscViewerASCIIGetStdout(comm,lab);
235: PetscObjectReference((PetscObject)*lab);
236: return(0);
237: }
238: if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) {
239: MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelViewer,&Petsc_Viewer_keyval,(void*)0);
240: }
241: /*
242: It would be better to move this code to PetscFileSetName() but since it must return a preexiting communicator
243: we cannot do that, since PetscFileSetName() takes a communicator that already exists.
245: Plus if the original communicator that created the file has since been close this will not detect the old
246: communictor and hence will overwrite the old data. It may be better to simply remove all this code
247: */
248: /* make sure communicator is a PETSc communicator */
249: PetscCommDuplicate(comm,&comm,NULL);
250: /* has file already been opened into a viewer */
251: MPI_Attr_get(comm,Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);
252: if (flg) {
253: while (vlink) {
254: PetscStrcmp(name,((PetscViewer_ASCII*)(vlink->viewer->data))->filename,&eq);
255: if (eq) {
256: PetscObjectReference((PetscObject)vlink->viewer);
257: *lab = vlink->viewer;
258: PetscCommDestroy(&comm);
259: return(0);
260: }
261: vlink = vlink->next;
262: }
263: }
264: PetscViewerCreate(comm,lab);
265: PetscViewerSetType(*lab,PETSCVIEWERASCII);
266: if (name) {
267: PetscViewerFileSetName(*lab,name);
268: }
269: /* save viewer into communicator if needed later */
270: PetscNew(&nv);
271: nv->viewer = *lab;
272: if (!flg) {
273: MPI_Attr_put(comm,Petsc_Viewer_keyval,nv);
274: } else {
275: MPI_Attr_get(comm,Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);
276: if (vlink) {
277: while (vlink->next) vlink = vlink->next;
278: vlink->next = nv;
279: } else {
280: MPI_Attr_put(comm,Petsc_Viewer_keyval,nv);
281: }
282: }
283: PetscCommDestroy(&comm);
284: return(0);
285: }
289: /*@C
290: PetscViewerASCIIOpenWithFILE - Given an open file creates an ASCII viewer that prints to it.
292: Collective on MPI_Comm
294: Input Parameters:
295: + comm - the communicator
296: - fd - the FILE pointer
298: Output Parameter:
299: . lab - the PetscViewer to use with the specified file
301: Level: beginner
303: Notes:
304: This PetscViewer can be destroyed with PetscViewerDestroy(), but the fd will NOT be closed.
306: If a multiprocessor communicator is used (such as PETSC_COMM_WORLD),
307: then only the first processor in the group uses the file. All other
308: processors send their data to the first processor to print.
310: Concepts: PetscViewerASCII^creating
311: Concepts: printf
312: Concepts: printing
313: Concepts: accessing remote file
314: Concepts: remote file
316: .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerBinaryOpen(),
317: PetscViewerASCIIGetPointer(), PetscViewerSetFormat(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDERR_,
318: PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF, PetscViewerASCIIOpen()
319: @*/
320: PetscErrorCode PetscViewerASCIIOpenWithFILE(MPI_Comm comm,FILE *fd,PetscViewer *lab)
321: {
325: PetscViewerCreate(comm,lab);
326: PetscViewerSetType(*lab,PETSCVIEWERASCII);
327: PetscViewerASCIISetFILE(*lab,fd);
328: return(0);
329: }
333: PetscErrorCode PetscViewerASCIISetFILE(PetscViewer viewer,FILE *fd)
334: {
335: PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
338: vascii->fd = fd;
339: vascii->closefile = PETSC_FALSE;
340: return(0);
341: }