xref: /petsc/src/sys/classes/viewer/impls/ams/ams.c (revision 3bb1ff401821b9e2ae019d3e61bc8ab4bd4e59d5)
1 
2 #include <petsc-private/viewerimpl.h>
3 #include <petscviewerams.h>
4 #include <petscsys.h>
5 
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   PetscStackCallAMS(AMS_Comm_publish,((char*)name,&vams->ams_comm,MPI_TYPE,PetscObjectComm((PetscObject)v),&port));
25 
26   ierr = PetscOptionsHasName(NULL,"-ams_printf",&flg);CHKERRQ(ierr);
27   if (!flg) {
28 #if !defined(PETSC_MISSING_DEV_NULL)
29     PetscStackCallAMS(AMS_Set_output_file,("/dev/null"));
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(), PETSC_VIEWER_AMS_, PETSC_VIEWER_AMS_WORLD, PETSC_VIEWER_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, PETSC_VIEWER_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: PETSC_VIEWER_AMS_WORLD, PETSC_VIEWER_AMS_SELF
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   ierr = PetscCommDestroy(&ncomm);
169   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);}
170   PetscFunctionReturn(viewer);
171 }
172 
173 /*
174        If there is a PetscViewer associated with this communicator, it is destroyed.
175 */
176 #undef __FUNCT__
177 #define __FUNCT__ "PetscViewer_AMS_Destroy"
178 PetscErrorCode PetscViewer_AMS_Destroy(MPI_Comm comm)
179 {
180   PetscErrorCode ierr;
181   PetscMPIInt    flag;
182   PetscViewer    viewer;
183 
184   PetscFunctionBegin;
185   if (Petsc_Viewer_Ams_keyval == MPI_KEYVAL_INVALID) PetscFunctionReturn(0);
186 
187   ierr = MPI_Attr_get(comm,Petsc_Viewer_Ams_keyval,(void**)&viewer,&flag);CHKERRQ(ierr);
188   if (flag) {
189     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
190     ierr = MPI_Attr_delete(comm,Petsc_Viewer_Ams_keyval);CHKERRQ(ierr);
191   }
192   PetscFunctionReturn(0);
193 }
194 
195 #undef __FUNCT__
196 #define __FUNCT__ "PetscViewerDestroy_AMS"
197 static PetscErrorCode PetscViewerDestroy_AMS(PetscViewer viewer)
198 {
199   PetscViewer_AMS *vams = (PetscViewer_AMS*)viewer->data;
200   PetscErrorCode  ierr;
201 
202   PetscFunctionBegin;
203   /*
204      Make sure that we mark that the stack is no longer published
205   */
206   if (PetscObjectComm((PetscObject)viewer) == PETSC_COMM_WORLD) {
207     ierr = PetscStackAMSViewOff();CHKERRQ(ierr);
208   }
209 
210   PetscStackCallAMS(AMS_Comm_destroy,(vams->ams_comm));
211   ierr = PetscFree(vams);CHKERRQ(ierr);
212   PetscFunctionReturn(0);
213 }
214 
215 #undef __FUNCT__
216 #define __FUNCT__ "PetscViewerCreate_AMS"
217 PETSC_EXTERN PetscErrorCode PetscViewerCreate_AMS(PetscViewer v)
218 {
219   PetscViewer_AMS *vams;
220   PetscErrorCode  ierr;
221 
222   PetscFunctionBegin;
223   v->ops->destroy = PetscViewerDestroy_AMS;
224   ierr            = PetscNew(PetscViewer_AMS,&vams);CHKERRQ(ierr);
225   v->data         = (void*)vams;
226   vams->ams_comm  = -1;
227 
228   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerAMSSetCommName_C",PetscViewerAMSSetCommName_AMS);CHKERRQ(ierr);
229   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerAMSGetAMSComm_C",PetscViewerAMSGetAMSComm_AMS);CHKERRQ(ierr);
230   PetscFunctionReturn(0);
231 }
232 
233 
234 
235