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