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: #undef __FUNCT__
9: /*@C
10: PetscViewerCreate - Creates a viewing context
12: Collective on MPI_Comm
14: Input Parameter:
15: . comm - MPI communicator
17: Output Parameter:
18: . inviewer - location to put the PetscViewer context
20: Level: advanced
22: Concepts: graphics^creating PetscViewer
23: Concepts: file input/output^creating PetscViewer
24: Concepts: sockets^creating PetscViewer
26: .seealso: PetscViewerDestroy(), PetscViewerSetType()
28: @*/
29: int PetscViewerCreate(MPI_Comm comm,PetscViewer *inviewer)
30: {
31: PetscViewer viewer;
34: *inviewer = 0;
35: PetscHeaderCreate(viewer,_p_PetscViewer,struct _PetscViewerOps,PETSC_VIEWER_COOKIE,-1,"PetscViewer",comm,PetscViewerDestroy,0);
36: PetscLogObjectCreate(viewer);
37: *inviewer = viewer;
38: viewer->type = -1;
39: viewer->data = 0;
40: return(0);
41: }
42:
43: #undef __FUNCT__
45: /*@C
46: PetscViewerSetType - Builds PetscViewer for a particular implementation.
48: Collective on PetscViewer
50: Input Parameter:
51: + viewer - the PetscViewer context
52: - type - for example, "ASCII"
54: Options Database Command:
55: . -draw_type <type> - Sets the type; use -help for a list
56: of available methods (for instance, ascii)
58: Level: advanced
60: Notes:
61: See "include/petscviewer.h" for available methods (for instance,
62: PETSC_VIEWER_SOCKET)
64: .seealso: PetscViewerCreate(), PetscViewerGetType()
65: @*/
66: int PetscViewerSetType(PetscViewer viewer,PetscViewerType type)
67: {
68: int ierr,(*r)(PetscViewer);
69: PetscTruth match;
75: PetscTypeCompare((PetscObject)viewer,type,&match);
76: if (match) return(0);
78: if (viewer->data) {
79: /* destroy the old private PetscViewer context */
80: (*viewer->ops->destroy)(viewer);
81: viewer->data = 0;
82: }
83: /* Get the function pointers for the graphics method requested */
84: if (!PetscViewerList) SETERRQ(1,"No PetscViewer implementations registered");
86: PetscFListFind(viewer->comm,PetscViewerList,type,(void (**)(void)) &r);
88: if (!r) SETERRQ1(1,"Unknown PetscViewer type given: %s",type);
90: viewer->data = 0;
91: PetscMemzero(viewer->ops,sizeof(struct _PetscViewerOps));
92: (*r)(viewer);
94: PetscObjectChangeTypeName((PetscObject)viewer,type);
96: return(0);
97: }
99: #undef __FUNCT__
101: /*@C
102: PetscViewerRegisterDestroy - Frees the list of PetscViewer methods that were
103: registered by PetscViewerRegisterDynamic().
105: Not Collective
107: Level: developer
109: .seealso: PetscViewerRegisterDynamic(), PetscViewerRegisterAll()
110: @*/
111: int PetscViewerRegisterDestroy(void)
112: {
116: if (PetscViewerList) {
117: PetscFListDestroy(&PetscViewerList);
118: PetscViewerList = 0;
119: }
120: return(0);
121: }
123: /*MC
124: PetscViewerRegisterDynamic - Adds a method to the Krylov subspace solver package.
126: Synopsis:
127: int PetscViewerRegisterDynamic(char *name_solver,char *path,char *name_create,int (*routine_create)(PetscViewer))
129: Not Collective
131: Input Parameters:
132: + name_solver - name of a new user-defined solver
133: . path - path (either absolute or relative) the library containing this solver
134: . name_create - name of routine to create method context
135: - routine_create - routine to create method context
137: Level: developer
139: Notes:
140: PetscViewerRegisterDynamic() may be called multiple times to add several user-defined solvers.
142: If dynamic libraries are used, then the fourth input argument (routine_create)
143: is ignored.
145: Sample usage:
146: .vb
147: PetscViewerRegisterDynamic("my_viewer_type",/home/username/my_lib/lib/libO/solaris/mylib.a,
148: "MyViewerCreate",MyViewerCreate);
149: .ve
151: Then, your solver can be chosen with the procedural interface via
152: $ PetscViewerSetType(ksp,"my_viewer_type")
153: or at runtime via the option
154: $ -viewer_type my_viewer_type
156: Concepts: registering^Viewers
158: .seealso: PetscViewerRegisterAll(), PetscViewerRegisterDestroy()
159: M*/
161: #undef __FUNCT__
163: int PetscViewerRegister(char *sname,char *path,char *name,int (*function)(PetscViewer))
164: {
165: int ierr;
166: char fullname[PETSC_MAX_PATH_LEN];
169: PetscFListConcat(path,name,fullname);
170: PetscFListAdd(&PetscViewerList,sname,fullname,(void (*)(void))function);
171: return(0);
172: }
174: #undef __FUNCT__
176: /*@C
177: PetscViewerSetFromOptions - Sets the graphics type from the options database.
178: Defaults to a PETSc X windows graphics.
180: Collective on PetscViewer
182: Input Parameter:
183: . PetscViewer - the graphics context
185: Level: intermediate
187: Notes:
188: Must be called after PetscViewerCreate() before the PetscViewer is used.
190: Concepts: PetscViewer^setting options
192: .seealso: PetscViewerCreate(), PetscViewerSetType()
194: @*/
195: int PetscViewerSetFromOptions(PetscViewer viewer)
196: {
197: int ierr;
198: char vtype[256];
199: PetscTruth flg;
204: if (!PetscViewerList) SETERRQ(1,"No PetscViewer implementations registered");
205: PetscOptionsBegin(viewer->comm,viewer->prefix,"PetscViewer options","PetscViewer");
206: PetscOptionsList("-viewer_type","Type of PetscViewer","None",PetscViewerList,(char *)(viewer->type_name?viewer->type_name:PETSC_VIEWER_ASCII),vtype,256,&flg);
207: if (flg) {
208: PetscViewerSetType(viewer,vtype);
209: }
210: /* type has not been set? */
211: if (!viewer->type_name) {
212: PetscViewerSetType(viewer,PETSC_VIEWER_ASCII);
213: }
214: if (viewer->ops->setfromoptions) {
215: (*viewer->ops->setfromoptions)(viewer);
216: }
217: PetscOptionsEnd();
219: return(0);
220: }