xref: /petsc/src/sys/classes/viewer/impls/ams/ams.c (revision 245f004be2b2fca55a62739415aedaade1b4b42e)
1 
2 #include <petsc-private/viewerimpl.h>
3 #include <petscsys.h>
4 
5 #include <ams.h>
6 typedef struct {
7   char     *ams_name;
8   AMS_Comm ams_comm;
9 } PetscViewer_AMS;
10 
11 EXTERN_C_BEGIN
12 #undef __FUNCT__
13 #define __FUNCT__ "PetscViewerAMSSetCommName_AMS"
14 PetscErrorCode PetscViewerAMSSetCommName_AMS(PetscViewer v,const char name[])
15 {
16   PetscViewer_AMS *vams = (PetscViewer_AMS*)v->data;
17   PetscErrorCode  ierr;
18   int             port = -1;
19   PetscBool       flg,flg2;
20   char            m[64];
21 
22   PetscFunctionBegin;
23   ierr = PetscOptionsGetInt(NULL,"-ams_port",&port,NULL);CHKERRQ(ierr);
24   ierr = PetscInfo1(v,"Publishing with the AMS on port %d\n",port);CHKERRQ(ierr);
25   ierr = AMS_Comm_publish((char*)name,&vams->ams_comm,MPI_TYPE,((PetscObject)v)->comm,&port);CHKERRQ(ierr);
26 
27   ierr = PetscOptionsHasName(NULL,"-ams_printf",&flg);CHKERRQ(ierr);
28   if (!flg) {
29 #if !defined(PETSC_MISSING_DEV_NULL)
30     ierr = AMS_Set_output_file("/dev/null");CHKERRQ(ierr);
31 #endif
32   }
33 
34   ierr = PetscOptionsGetString(NULL,"-ams_matlab",m,16,&flg);CHKERRQ(ierr);
35   if (flg) {
36     FILE *fp;
37     ierr = PetscStartMatlab(((PetscObject)v)->comm,m,"petscview",&fp);CHKERRQ(ierr);
38   }
39 
40   ierr = PetscGetHostName(m,64);CHKERRQ(ierr);
41   ierr = PetscOptionsHasName(NULL,"-ams_java",&flg);CHKERRQ(ierr);
42   if (flg) {
43     ierr = PetscOptionsGetString(NULL,"-ams_java",m,64,&flg);CHKERRQ(ierr);
44     ierr = PetscOptionsHasName(NULL,"-options_gui",&flg2);CHKERRQ(ierr);
45     if (flg2) {
46       char cmd[PETSC_MAX_PATH_LEN];
47       ierr = PetscStrcpy(cmd,"cd ${PETSC_DIR}/${PETSC_ARCH}/bin;java -d64 -classpath .:");CHKERRQ(ierr);
48       ierr = PetscStrcat(cmd,PETSC_AMS_DIR);CHKERRQ(ierr);
49       ierr = PetscStrcat(cmd,"/java -Djava.library.path=");CHKERRQ(ierr);
50       ierr = PetscStrcat(cmd,PETSC_AMS_DIR);CHKERRQ(ierr);
51       ierr = PetscStrcat(cmd,"/lib amsoptions -ams_server ${HOSTNAME}");CHKERRQ(ierr);
52       ierr = PetscPOpen(((PetscObject)v)->comm,m,cmd,"r",NULL);CHKERRQ(ierr);
53     }
54   }
55   PetscFunctionReturn(0);
56 }
57 EXTERN_C_END
58 
59 EXTERN_C_BEGIN
60 #undef __FUNCT__
61 #define __FUNCT__ "PetscViewerAMSGetAMSComm_AMS"
62 PetscErrorCode PetscViewerAMSGetAMSComm_AMS(PetscViewer lab,AMS_Comm *ams_comm)
63 {
64   PetscViewer_AMS *vams = (PetscViewer_AMS*)lab->data;
65 
66   PetscFunctionBegin;
67   if (vams->ams_comm == -1) SETERRQ(((PetscObject)lab)->comm,PETSC_ERR_ARG_WRONGSTATE,"AMS communicator name not yet set with PetscViewerAMSSetCommName()");
68   *ams_comm = vams->ams_comm;
69   PetscFunctionReturn(0);
70 }
71 EXTERN_C_END
72 
73 #undef __FUNCT__
74 #define __FUNCT__ "PetscViewerAMSSetCommName"
75 PetscErrorCode PetscViewerAMSSetCommName(PetscViewer v,const char name[])
76 {
77   PetscErrorCode ierr;
78 
79   PetscFunctionBegin;
80   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1);
81   ierr = PetscTryMethod(v,"PetscViewerAMSSetCommName_C",(PetscViewer,const char[]),(v,name));CHKERRQ(ierr);
82   PetscFunctionReturn(0);
83 }
84 
85 #undef __FUNCT__
86 #define __FUNCT__ "PetscViewerAMSGetAMSComm"
87 /*@C
88     PetscViewerAMSGetAMSComm - Gets the AMS communicator associated with the PetscViewer.
89 
90     Collective on MPI_Comm
91 
92     Input Parameters:
93 .   lab - the PetscViewer
94 
95     Output Parameter:
96 .   ams_comm - the AMS communicator
97 
98     Level: developer
99 
100     Fortran Note:
101     This routine is not supported in Fortran.
102 
103   Concepts: publishing variables
104   Concepts: AMS^getting communicator
105   Concepts: communicator^accessing AMS communicator
106 
107 .seealso: PetscViewerDestroy(), PetscViewerAMSOpen(), PetscViewer_AMS_, PetscViewer_AMS_WORLD, PetscViewer_AMS_SELF
108 
109 @*/
110 PetscErrorCode PetscViewerAMSGetAMSComm(PetscViewer v,AMS_Comm *ams_comm)
111 {
112   PetscErrorCode ierr;
113 
114   PetscFunctionBegin;
115   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1);
116   ierr = PetscTryMethod(v,"PetscViewerAMSGetAMSComm_C",(PetscViewer,AMS_Comm*),(v,ams_comm));CHKERRQ(ierr);
117   PetscFunctionReturn(0);
118 }
119 
120 /*
121     The variable Petsc_Viewer_Ams_keyval is used to indicate an MPI attribute that
122   is attached to a communicator, in this case the attribute is a PetscViewer.
123 */
124 static PetscMPIInt Petsc_Viewer_Ams_keyval = MPI_KEYVAL_INVALID;
125 
126 #undef __FUNCT__
127 #define __FUNCT__ "PETSC_VIEWER_AMS_"
128 /*@C
129      PETSC_VIEWER_AMS_ - Creates an AMS memory snooper PetscViewer shared by all processors
130                    in a communicator.
131 
132      Collective on MPI_Comm
133 
134      Input Parameters:
135 .    comm - the MPI communicator to share the PetscViewer
136 
137      Level: developer
138 
139      Notes:
140      Unlike almost all other PETSc routines, PetscViewer_AMS_ does not return
141      an error code.  The window PetscViewer is usually used in the form
142 $       XXXView(XXX object,PETSC_VIEWER_AMS_(comm));
143 
144 .seealso: PetscViewer_AMS_WORLD, PetscViewer_AMS_SELF, PetscViewerAMSOpen(),
145 @*/
146 PetscViewer PETSC_VIEWER_AMS_(MPI_Comm comm)
147 {
148   PetscErrorCode ierr;
149   PetscMPIInt    flag;
150   PetscViewer    viewer;
151   char           name[128];
152   MPI_Comm       ncomm;
153 
154   PetscFunctionBegin;
155   ierr = PetscCommDuplicate(comm,&ncomm,NULL);if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);}
156   if (Petsc_Viewer_Ams_keyval == MPI_KEYVAL_INVALID) {
157     ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Ams_keyval,0);
158     if (ierr) {PetscError(ncomm,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,__SDIR__,1,PETSC_ERROR_INITIAL," "); viewer = 0;}
159   }
160   ierr = MPI_Attr_get(ncomm,Petsc_Viewer_Ams_keyval,(void**)&viewer,&flag);
161   if (ierr) {PetscError(ncomm,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,__SDIR__,1,PETSC_ERROR_INITIAL," "); viewer = 0;}
162   if (!flag) { /* PetscViewer not yet created */
163     ierr = PetscStrcpy(name,"PETSc");
164     if (ierr) {PetscError(ncomm,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,__SDIR__,1,PETSC_ERROR_INITIAL," "); viewer = 0;}
165     ierr = PetscViewerAMSOpen(ncomm,name,&viewer);
166     if (ierr) {PetscError(ncomm,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,__SDIR__,1,PETSC_ERROR_INITIAL," "); viewer = 0;}
167     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
168     if (ierr) {PetscError(ncomm,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,__SDIR__,1,PETSC_ERROR_INITIAL," "); viewer = 0;}
169     ierr = MPI_Attr_put(ncomm,Petsc_Viewer_Ams_keyval,(void*)viewer);
170     if (ierr) {PetscError(ncomm,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,__SDIR__,1,PETSC_ERROR_INITIAL," "); viewer = 0;}
171   }
172   PetscFunctionReturn(viewer);
173 }
174 
175 /*
176        If there is a PetscViewer associated with this communicator, it is destroyed.
177 */
178 #undef __FUNCT__
179 #define __FUNCT__ "PetscViewer_AMS_Destroy"
180 PetscErrorCode PetscViewer_AMS_Destroy(MPI_Comm comm)
181 {
182   PetscErrorCode ierr;
183   PetscMPIInt    flag;
184   PetscViewer    viewer;
185 
186   PetscFunctionBegin;
187   if (Petsc_Viewer_Ams_keyval == MPI_KEYVAL_INVALID) PetscFunctionReturn(0);
188 
189   ierr = MPI_Attr_get(comm,Petsc_Viewer_Ams_keyval,(void**)&viewer,&flag);CHKERRQ(ierr);
190   if (flag) {
191     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
192     ierr = MPI_Attr_delete(comm,Petsc_Viewer_Ams_keyval);CHKERRQ(ierr);
193   }
194   PetscFunctionReturn(0);
195 }
196 
197 #undef __FUNCT__
198 #define __FUNCT__ "PetscViewerDestroy_AMS"
199 static PetscErrorCode PetscViewerDestroy_AMS(PetscViewer viewer)
200 {
201   PetscViewer_AMS *vams = (PetscViewer_AMS*)viewer->data;
202   PetscErrorCode  ierr;
203 
204   PetscFunctionBegin;
205   /*
206      Make sure that we mark that the stack is no longer published
207   */
208   if (((PetscObject)viewer)->comm == PETSC_COMM_WORLD) {
209     ierr = PetscStackDepublish();CHKERRQ(ierr);
210   }
211 
212   ierr = AMS_Comm_destroy(vams->ams_comm);
213   if (ierr) {
214     char *err;
215     AMS_Explain_error(ierr,&err);
216     SETERRQ(((PetscObject)viewer)->comm,ierr,err);
217   }
218   ierr = PetscFree(vams);CHKERRQ(ierr);
219   PetscFunctionReturn(0);
220 }
221 
222 EXTERN_C_BEGIN
223 #undef __FUNCT__
224 #define __FUNCT__ "PetscViewerCreate_AMS"
225 PetscErrorCode PetscViewerCreate_AMS(PetscViewer v)
226 {
227   PetscViewer_AMS *vams;
228   PetscErrorCode  ierr;
229 
230   PetscFunctionBegin;
231   v->ops->destroy = PetscViewerDestroy_AMS;
232   ierr            = PetscNew(PetscViewer_AMS,&vams);CHKERRQ(ierr);
233   v->data         = (void*)vams;
234   vams->ams_comm  = -1;
235 
236   ierr = PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerAMSSetCommName_C",
237                                            "PetscViewerAMSSetCommName_AMS",
238                                            PetscViewerAMSSetCommName_AMS);CHKERRQ(ierr);
239   ierr = PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerAMSGetAMSComm_C",
240                                            "PetscViewerAMSGetAMSComm_AMS",
241                                            PetscViewerAMSGetAMSComm_AMS);CHKERRQ(ierr);
242   PetscFunctionReturn(0);
243 }
244 EXTERN_C_END
245 
246 
247