Actual source code: ams.c

  1: /*$Id: ams.c,v 1.47 2001/04/10 19:34:07 bsmith Exp $*/

 3:  #include petscsys.h
 4:  #include src/sys/src/viewer/viewerimpl.h
  5: #if defined(PETSC_HAVE_STDLIB_H)
  6: #include <stdlib.h>
  7: #endif

  9: #include "ams.h"
 10: typedef struct {
 11:   char       *ams_name;
 12:   AMS_Comm   ams_comm;
 13: } PetscViewer_AMS;

 15: EXTERN_C_BEGIN
 16: int PetscViewerAMSSetCommName_AMS(PetscViewer v,const char name[])
 17: {
 18:   PetscViewer_AMS *vams = (PetscViewer_AMS*)v->data;
 19:   int             ierr,port = -1;
 20:   PetscTruth      flg,flg2;
 21:   char            m[16];

 24:   PetscOptionsGetInt(PETSC_NULL,"-ams_port",&port,PETSC_NULL);
 25:   PetscLogInfo(v,"Publishing with the AMS on port %dn",port);
 26:   AMS_Comm_publish((char *)name,&vams->ams_comm,MPI_TYPE,v->comm,&port);

 28:   PetscOptionsHasName(PETSC_NULL,"-ams_printf",&flg);
 29:   if (!flg) {
 30: #if !defined(PETSC_MISSING_DEV_NULL)
 31:     AMS_Set_output_file("/dev/null");
 32: #endif
 33:   }

 35:   PetscOptionsGetString(PETSC_NULL,"-ams_matlab",m,16,&flg);
 36:   if (flg) {
 37:     FILE *fp;
 38:     PetscStartMatlab(v->comm,m,"petscview",&fp);
 39:   }

 41:   PetscOptionsGetString(PETSC_NULL,"-ams_java",m,16,&flg);
 42:   if (flg) {
 43:     PetscOptionsHasName(PETSC_NULL,"-ams_publish_options",&flg2);
 44:     if (flg2) {
 45:       PetscPOpen(v->comm,m,"cd ${PETSC_DIR}/src/sys/src/objects/ams/java;make runamsoptions AMS_OPTIONS="-ams_server ${HOSTNAME}"","r",PETSC_NULL);
 46:     }

 48:     PetscOptionsHasName(PETSC_NULL,"-ams_publish_objects",&flg2);
 49:     if (flg2) {
 50:       char dir[256];
 51: #if defined(PETSC_HAVE_UCBPS)
 52:       char buf[1024],*found;
 53:       FILE *fp;

 55:       /* check if jacc is not already running */
 56:       ierr  = PetscPOpen(v->comm,m,"/usr/ucb/ps -ugxww | grep jacc | grep -v grep","r",&fp);
 57:       found = fgets(buf,1024,fp);
 58:       ierr  = PetscFClose(v->comm,fp);
 59:       if (found) return(0);
 60: #endif
 61:       PetscOptionsGetenv(v->comm,"AMS_HOME",dir,256,&flg);
 62:       if (!flg) {
 63:         PetscStrncpy(dir,AMS_HOME,256);
 64:       }
 65:       /* PetscStrcat(dir,"/java/client/jacc -display ${DISPLAY}"); */
 66:       PetscStrcat(dir,"/java/client/jacc");
 67:       PetscPOpen(v->comm,m,dir,"r",PETSC_NULL);
 68:     }
 69:   }
 70:   return(0);
 71: }
 72: EXTERN_C_END

 74: EXTERN_C_BEGIN
 75: int PetscViewerAMSGetAMSComm_AMS(PetscViewer lab,AMS_Comm *ams_comm)
 76: {
 77:   PetscViewer_AMS *vams = (PetscViewer_AMS *)lab->data;

 80:   if (vams->ams_comm == -1) SETERRQ(1,"AMS communicator name not yet set with PetscViewerAMSSetCommName()");
 81:   *ams_comm = vams->ams_comm;
 82:   return(0);
 83: }
 84: EXTERN_C_END

 86: int PetscViewerAMSSetCommName(PetscViewer v,const char name[])
 87: {
 88:   int ierr,(*f)(PetscViewer,const char[]);

 92:   PetscObjectQueryFunction((PetscObject)v,"PetscViewerAMSSetCommName_C",(void (**)())&f);
 93:   if (f) {
 94:     (*f)(v,name);
 95:   }
 96:   return(0);
 97: }

 99: /*@C
100:     PetscViewerAMSGetAMSComm - Gets the AMS communicator associated with the PetscViewer.

102:     Collective on MPI_Comm

104:     Input Parameters:
105: .   lab - the PetscViewer

107:     Output Parameter:
108: .   ams_comm - the AMS communicator

110:     Level: developer

112:     Fortran Note:
113:     This routine is not supported in Fortran.

115:   Concepts: publishing variables
116:   Concepts: AMS^getting communicator
117:   Concepts: communicator^accessing AMS communicator

119: .seealso: PetscViewerDestroy(), PetscViewerAMSOpen(), PetscViewer_AMS_, PetscViewer_AMS_WORLD, PetscViewer_AMS_SELF

121: @*/
122: int PetscViewerAMSGetAMSComm(PetscViewer v,AMS_Comm *ams_comm)
123: {
124:   int ierr,(*f)(PetscViewer,AMS_Comm *);

128:   PetscObjectQueryFunction((PetscObject)v,"PetscViewerAMSGetAMSComm_C",(void (**)())&f);
129:   if (f) {
130:     (*f)(v,ams_comm);
131:   }
132:   return(0);
133: }

135: /*
136:     The variable Petsc_Viewer_Ams_keyval is used to indicate an MPI attribute that
137:   is attached to a communicator, in this case the attribute is a PetscViewer.
138: */
139: static int Petsc_Viewer_Ams_keyval = MPI_KEYVAL_INVALID;

141: /*@C
142:      PetscViewer_AMS_ - Creates an AMS memory snooper PetscViewer shared by all processors 
143:                    in a communicator.

145:      Collective on MPI_Comm

147:      Input Parameters:
148: .    comm - the MPI communicator to share the PetscViewer

150:      Level: developer

152:      Notes:
153:      Unlike almost all other PETSc routines, PetscViewer_AMS_ does not return 
154:      an error code.  The window PetscViewer is usually used in the form
155: $       XXXView(XXX object,PETSC_VIEWER_AMS_(comm));

157: .seealso: PetscViewer_AMS_WORLD, PetscViewer_AMS_SELF, PetscViewerAMSOpen(), 
158: @*/
159: PetscViewer PETSC_VIEWER_AMS_(MPI_Comm comm)
160: {
161:   int         ierr,flag,size,rank;
162:   PetscViewer viewer;
163:   char        name[128];

166:   if (Petsc_Viewer_Ams_keyval == MPI_KEYVAL_INVALID) {
167:     MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Ams_keyval,0);
168:     if (ierr) {PetscError(__LINE__,"VIEWER_AMS_",__FILE__,__SDIR__,1,1,0); viewer = 0;}
169:   }
170:   MPI_Attr_get(comm,Petsc_Viewer_Ams_keyval,(void **)&viewer,&flag);
171:   if (ierr) {PetscError(__LINE__,"VIEWER_AMS_",__FILE__,__SDIR__,1,1,0); viewer = 0;}
172:   if (!flag) { /* PetscViewer not yet created */
173:     if (comm == PETSC_COMM_WORLD) {
174:       PetscStrcpy(name,"PETSc");
175:       if (ierr) {PetscError(__LINE__,"VIEWER_AMS_",__FILE__,__SDIR__,1,1,0); viewer = 0;}
176:     } else {
177:       MPI_Comm_size(comm,&size);
178:       if (ierr) {PetscError(__LINE__,"VIEWER_AMS_",__FILE__,__SDIR__,1,1,0); viewer = 0;}
179:       if (size == 1) {
180:         MPI_Comm_rank(PETSC_COMM_WORLD,&rank);if (ierr) return(0);
181:         sprintf(name,"PETSc_%d",rank);
182:       } else {
183:         PetscError(__LINE__,"VIEWER_AMS_",__FILE__,__SDIR__,1,1,0); viewer = 0;
184:       }
185:     }
186:     PetscViewerAMSOpen(comm,name,&viewer);
187:     if (ierr) {PetscError(__LINE__,"VIEWER_AMS_",__FILE__,__SDIR__,1,1,0); viewer = 0;}
188:     PetscObjectRegisterDestroy((PetscObject)viewer);
189:     if (ierr) {PetscError(__LINE__,"VIEWER_STDOUT_",__FILE__,__SDIR__,1,1,0); viewer = 0;}
190:     MPI_Attr_put(comm,Petsc_Viewer_Ams_keyval,(void*)viewer);
191:     if (ierr) {PetscError(__LINE__,"VIEWER_AMS_",__FILE__,__SDIR__,1,1,0); viewer = 0;}
192:   }
193:   PetscFunctionReturn(viewer);
194: }

196: /*
197:        If there is a PetscViewer associated with this communicator, it is destroyed.
198: */
199: int PetscViewer_AMS_Destroy(MPI_Comm comm)
200: {
201:   int         ierr,flag;
202:   PetscViewer viewer;

205:   if (Petsc_Viewer_Ams_keyval == MPI_KEYVAL_INVALID) {
206:     return(0);
207:   }
208:   MPI_Attr_get(comm,Petsc_Viewer_Ams_keyval,(void **)&viewer,&flag);
209:   if (flag) {
210:     PetscViewerDestroy(viewer);
211:     MPI_Attr_delete(comm,Petsc_Viewer_Ams_keyval);
212:   }
213:   return(0);
214: }

216: static int PetscViewerDestroy_AMS(PetscViewer viewer)
217: {
218:   PetscViewer_AMS *vams = (PetscViewer_AMS*)viewer->data;
219:   int             ierr;


223:   /*
224:      Make sure that we mark that the stack is no longer published
225:   */
226:   if (viewer->comm == PETSC_COMM_WORLD) {
227:     PetscStackDepublish();
228:   }

230:   AMS_Comm_destroy(vams->ams_comm);
231:   if (ierr) {
232:     char *err;
233:     AMS_Explain_error(ierr,&err);
234:     SETERRQ(ierr,err);
235:   }
236:   PetscFree(vams);
237:   return(0);
238: }

240: EXTERN_C_BEGIN
241: int PetscViewerCreate_AMS(PetscViewer v)
242: {
243:   PetscViewer_AMS *vams;
244:   int             ierr;

247:   v->ops->destroy = PetscViewerDestroy_AMS;
248:   ierr            = PetscStrallocpy(PETSC_VIEWER_AMS,&v->type_name);
249:   ierr            = PetscNew(PetscViewer_AMS,&vams);
250:   v->data         = (void*)vams;
251:   vams->ams_comm  = -1;
252:   PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerAMSSetCommName_C",
253:                                     "PetscViewerAMSSetCommName_AMS",
254:                                      PetscViewerAMSSetCommName_AMS);
255:   PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerAMSGetAMSComm_C",
256:                                     "PetscViewerAMSGetAMSComm_AMS",
257:                                      PetscViewerAMSGetAMSComm_AMS);
258:   return(0);
259: }
260: EXTERN_C_END