Actual source code: viewreg.c
1: /*$Id: viewreg.c,v 1.36 2001/06/21 21:15:13 bsmith Exp bsmith $*/
3: #include "src/sys/src/viewer/viewerimpl.h" /*I "petsc.h" I*/
5: PetscFList PetscViewerList = 0;
7: /*@C
8: PetscViewerCreate - Creates a viewing context
10: Collective on MPI_Comm
12: Input Parameter:
13: . comm - MPI communicator
15: Output Parameter:
16: . inviewer - location to put the PetscViewer context
18: Level: advanced
20: Concepts: graphics^creating PetscViewer
21: Concepts: file input/output^creating PetscViewer
22: Concepts: sockets^creating PetscViewer
24: .seealso: PetscViewerDestroy(), PetscViewerSetType()
26: @*/
27: int PetscViewerCreate(MPI_Comm comm,PetscViewer *inviewer)
28: {
29: PetscViewer viewer;
32: *inviewer = 0;
33: PetscHeaderCreate(viewer,_p_PetscViewer,struct _PetscViewerOps,PETSC_VIEWER_COOKIE,-1,"PetscViewer",comm,PetscViewerDestroy,0);
34: PetscLogObjectCreate(viewer);
35: *inviewer = viewer;
36: viewer->type = -1;
37: viewer->data = 0;
38: return(0);
39: }
40:
41: /*@C
42: PetscViewerSetType - Builds PetscViewer for a particular implementation.
44: Collective on PetscViewer
46: Input Parameter:
47: + viewer - the PetscViewer context
48: - type - for example, "ASCII"
50: Options Database Command:
51: . -draw_type <type> - Sets the type; use -help for a list
52: of available methods (for instance, ascii)
54: Level: advanced
56: Notes:
57: See "include/petscviewer.h" for available methods (for instance,
58: PETSC_VIEWER_SOCKET)
60: .seealso: PetscViewerCreate(), PetscViewerGetType()
61: @*/
62: int PetscViewerSetType(PetscViewer viewer,PetscViewerType type)
63: {
64: int ierr,(*r)(PetscViewer);
65: PetscTruth match;
71: PetscTypeCompare((PetscObject)viewer,type,&match);
72: if (match) return(0);
74: if (viewer->data) {
75: /* destroy the old private PetscViewer context */
76: (*viewer->ops->destroy)(viewer);
77: viewer->data = 0;
78: }
79: /* Get the function pointers for the graphics method requested */
80: if (!PetscViewerList) SETERRQ(1,"No PetscViewer implementations registered");
82: PetscFListFind(viewer->comm,PetscViewerList,type,(void (**)(void)) &r);
84: if (!r) SETERRQ1(1,"Unknown PetscViewer type given: %s",type);
86: viewer->data = 0;
87: PetscMemzero(viewer->ops,sizeof(struct _PetscViewerOps));
88: (*r)(viewer);
90: PetscObjectChangeTypeName((PetscObject)viewer,type);
92: return(0);
93: }
95: /*@C
96: PetscViewerRegisterDestroy - Frees the list of PetscViewer methods that were
97: registered by PetscViewerRegisterDynamic().
99: Not Collective
101: Level: developer
103: .seealso: PetscViewerRegisterDynamic(), PetscViewerRegisterAll()
104: @*/
105: int PetscViewerRegisterDestroy(void)
106: {
110: if (PetscViewerList) {
111: PetscFListDestroy(&PetscViewerList);
112: PetscViewerList = 0;
113: }
114: return(0);
115: }
117: /*MC
118: PetscViewerRegisterDynamic - Adds a method to the Krylov subspace solver package.
120: Synopsis:
121: int PetscViewerRegisterDynamic(char *name_solver,char *path,char *name_create,int (*routine_create)(PetscViewer))
123: Not Collective
125: Input Parameters:
126: + name_solver - name of a new user-defined solver
127: . path - path (either absolute or relative) the library containing this solver
128: . name_create - name of routine to create method context
129: - routine_create - routine to create method context
131: Level: developer
133: Notes:
134: PetscViewerRegisterDynamic() may be called multiple times to add several user-defined solvers.
136: If dynamic libraries are used, then the fourth input argument (routine_create)
137: is ignored.
139: Sample usage:
140: .vb
141: PetscViewerRegisterDynamic("my_viewer_type",/home/username/my_lib/lib/libO/solaris/mylib.a,
142: "MyViewerCreate",MyViewerCreate);
143: .ve
145: Then, your solver can be chosen with the procedural interface via
146: $ PetscViewerSetType(ksp,"my_viewer_type")
147: or at runtime via the option
148: $ -viewer_type my_viewer_type
150: Concepts: registering^Viewers
152: .seealso: PetscViewerRegisterAll(), PetscViewerRegisterDestroy()
153: M*/
155: int PetscViewerRegister(char *sname,char *path,char *name,int (*function)(PetscViewer))
156: {
157: int ierr;
158: char fullname[256];
161: PetscFListConcat(path,name,fullname);
162: PetscFListAdd(&PetscViewerList,sname,fullname,(void (*)(void))function);
163: return(0);
164: }
166: /*@C
167: PetscViewerSetFromOptions - Sets the graphics type from the options database.
168: Defaults to a PETSc X windows graphics.
170: Collective on PetscViewer
172: Input Parameter:
173: . PetscViewer - the graphics context
175: Level: intermediate
177: Notes:
178: Must be called after PetscViewerCreate() before the PetscViewer is used.
180: Concepts: PetscViewer^setting options
182: .seealso: PetscViewerCreate(), PetscViewerSetType()
184: @*/
185: int PetscViewerSetFromOptions(PetscViewer viewer)
186: {
187: int ierr;
188: char vtype[256];
189: PetscTruth flg;
194: if (!PetscViewerList) SETERRQ(1,"No PetscViewer implementations registered");
195: PetscOptionsBegin(viewer->comm,viewer->prefix,"PetscViewer options","PetscViewer");
196: PetscOptionsList("-viewer_type","Type of PetscViewer","None",PetscViewerList,(char *)(viewer->type_name?viewer->type_name:PETSC_VIEWER_ASCII),vtype,256,&flg);
197: if (flg) {
198: PetscViewerSetType(viewer,vtype);
199: }
200: /* type has not been set? */
201: if (!viewer->type_name) {
202: PetscViewerSetType(viewer,PETSC_VIEWER_ASCII);
203: }
204: if (viewer->ops->setfromoptions) {
205: (*viewer->ops->setfromoptions)(viewer);
206: }
207: PetscOptionsEnd();
209: return(0);
210: }