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