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