xref: /petsc/src/sys/classes/viewer/interface/viewreg.c (revision a64a8e0274a74be50e9a5e5243fa71ef16fcaf3e)
1 
2 #include <petsc-private/viewerimpl.h>  /*I "petscsys.h" I*/
3 
4 PetscFList PetscViewerList              = 0;
5 
6 #undef __FUNCT__
7 #define __FUNCT__ "PetscViewerCreate"
8 /*@
9    PetscViewerCreate - Creates a viewing context
10 
11    Collective on MPI_Comm
12 
13    Input Parameter:
14 .  comm - MPI communicator
15 
16    Output Parameter:
17 .  inviewer - location to put the PetscViewer context
18 
19    Level: advanced
20 
21    Concepts: graphics^creating PetscViewer
22    Concepts: file input/output^creating PetscViewer
23    Concepts: sockets^creating PetscViewer
24 
25 .seealso: PetscViewerDestroy(), PetscViewerSetType(), PetscViewerType
26 
27 @*/
28 PetscErrorCode  PetscViewerCreate(MPI_Comm comm,PetscViewer *inviewer)
29 {
30   PetscViewer    viewer;
31   PetscErrorCode ierr;
32 
33   PetscFunctionBegin;
34   *inviewer = 0;
35 #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
36   ierr = PetscViewerInitializePackage(PETSC_NULL);CHKERRQ(ierr);
37 #endif
38   ierr = PetscHeaderCreate(viewer,_p_PetscViewer,struct _PetscViewerOps,PETSC_VIEWER_CLASSID,-1,"PetscViewer","PetscViewer","Viewer",comm,PetscViewerDestroy,0);CHKERRQ(ierr);
39   *inviewer           = viewer;
40   viewer->data        = 0;
41   PetscFunctionReturn(0);
42 }
43 
44 #undef __FUNCT__
45 #define __FUNCT__ "PetscViewerSetType"
46 /*@C
47    PetscViewerSetType - Builds PetscViewer for a particular implementation.
48 
49    Collective on PetscViewer
50 
51    Input Parameter:
52 +  viewer      - the PetscViewer context
53 -  type        - for example, "ASCII"
54 
55    Options Database Command:
56 .  -draw_type  <type> - Sets the type; use -help for a list
57     of available methods (for instance, ascii)
58 
59    Level: advanced
60 
61    Notes:
62    See "include/petscviewer.h" for available methods (for instance,
63    PETSC_VIEWER_SOCKET)
64 
65 .seealso: PetscViewerCreate(), PetscViewerGetType(), PetscViewerType
66 @*/
67 PetscErrorCode  PetscViewerSetType(PetscViewer viewer,PetscViewerType type)
68 {
69   PetscErrorCode ierr,(*r)(PetscViewer);
70   PetscBool      match;
71 
72   PetscFunctionBegin;
73   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
74   PetscValidCharPointer(type,2);
75   CHKMEMQ;
76   ierr = PetscObjectTypeCompare((PetscObject)viewer,type,&match);CHKERRQ(ierr);
77   if (match) PetscFunctionReturn(0);
78 
79   /* cleanup any old type that may be there */
80   if (viewer->data) {
81     ierr         = (*viewer->ops->destroy)(viewer);CHKERRQ(ierr);
82     viewer->ops->destroy = PETSC_NULL;
83     viewer->data = 0;
84   }
85   ierr = PetscMemzero(viewer->ops,sizeof(struct _PetscViewerOps));CHKERRQ(ierr);
86 
87   ierr =  PetscFListFind(PetscViewerList,((PetscObject)viewer)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
88   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscViewer type given: %s",type);
89 
90   ierr = PetscObjectChangeTypeName((PetscObject)viewer,type);CHKERRQ(ierr);
91   ierr = (*r)(viewer);CHKERRQ(ierr);
92   PetscFunctionReturn(0);
93 }
94 
95 #undef __FUNCT__
96 #define __FUNCT__ "PetscViewerRegisterDestroy"
97 /*@C
98    PetscViewerRegisterDestroy - Frees the list of PetscViewer methods that were
99    registered by PetscViewerRegisterDynamic().
100 
101    Not Collective
102 
103    Level: developer
104 
105 .seealso: PetscViewerRegisterDynamic(), PetscViewerRegisterAll()
106 @*/
107 PetscErrorCode  PetscViewerRegisterDestroy(void)
108 {
109   PetscErrorCode ierr;
110 
111   PetscFunctionBegin;
112   ierr = PetscFListDestroy(&PetscViewerList);CHKERRQ(ierr);
113   PetscFunctionReturn(0);
114 }
115 
116 #undef __FUNCT__
117 #define __FUNCT__ "PetscViewerRegister"
118 PetscErrorCode  PetscViewerRegister(const char *sname,const char *path,const char *name,PetscErrorCode (*function)(PetscViewer))
119 {
120   PetscErrorCode ierr;
121   char fullname[PETSC_MAX_PATH_LEN];
122 
123   PetscFunctionBegin;
124   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
125   ierr = PetscFListAdd(&PetscViewerList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
126   PetscFunctionReturn(0);
127 }
128 
129 #undef __FUNCT__
130 #define __FUNCT__ "PetscViewerSetFromOptions"
131 /*@C
132    PetscViewerSetFromOptions - Sets the graphics type from the options database.
133       Defaults to a PETSc X windows graphics.
134 
135    Collective on PetscViewer
136 
137    Input Parameter:
138 .     PetscViewer - the graphics context
139 
140    Level: intermediate
141 
142    Notes:
143     Must be called after PetscViewerCreate() before the PetscViewer is used.
144 
145   Concepts: PetscViewer^setting options
146 
147 .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType
148 
149 @*/
150 PetscErrorCode  PetscViewerSetFromOptions(PetscViewer viewer)
151 {
152   PetscErrorCode ierr;
153   char       vtype[256];
154   PetscBool  flg;
155 
156   PetscFunctionBegin;
157   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
158 
159   if (!PetscViewerList) {
160     ierr = PetscViewerRegisterAll(PETSC_NULL);CHKERRQ(ierr);
161   }
162   ierr = PetscObjectOptionsBegin((PetscObject)viewer);CHKERRQ(ierr);
163     ierr = PetscOptionsList("-viewer_type","Type of PetscViewer","None",PetscViewerList,(char *)(((PetscObject)viewer)->type_name?((PetscObject)viewer)->type_name:PETSCVIEWERASCII),vtype,256,&flg);CHKERRQ(ierr);
164     if (flg) {
165       ierr = PetscViewerSetType(viewer,vtype);CHKERRQ(ierr);
166     }
167     /* type has not been set? */
168     if (!((PetscObject)viewer)->type_name) {
169       ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr);
170     }
171     if (viewer->ops->setfromoptions) {
172       ierr = (*viewer->ops->setfromoptions)(viewer);CHKERRQ(ierr);
173     }
174 
175     /* process any options handlers added with PetscObjectAddOptionsHandler() */
176     ierr = PetscObjectProcessOptionsHandlers((PetscObject)viewer);CHKERRQ(ierr);
177   ierr = PetscOptionsEnd();CHKERRQ(ierr);
178 
179   PetscFunctionReturn(0);
180 }
181