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: }