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