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