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