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