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