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