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