1 2 #include <petsc-private/viewerimpl.h> 3 #include <petscviewerams.h> 4 #include <petscsys.h> 5 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 PetscStackCallAMS(AMS_Comm_publish,((char*)name,&vams->ams_comm,MPI_TYPE,PetscObjectComm((PetscObject)v),&port)); 25 26 ierr = PetscOptionsHasName(NULL,"-ams_printf",&flg);CHKERRQ(ierr); 27 if (!flg) { 28 #if !defined(PETSC_MISSING_DEV_NULL) 29 PetscStackCallAMS(AMS_Set_output_file,("/dev/null")); 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(), PETSC_VIEWER_AMS_, PETSC_VIEWER_AMS_WORLD, PETSC_VIEWER_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, PETSC_VIEWER_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: PETSC_VIEWER_AMS_WORLD, PETSC_VIEWER_AMS_SELF 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__,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__,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__,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__,1,PETSC_ERROR_INITIAL," "); viewer = 0;} 161 ierr = PetscViewerAMSOpen(ncomm,name,&viewer); 162 if (ierr) {PetscError(ncomm,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,1,PETSC_ERROR_INITIAL," "); viewer = 0;} 163 ierr = PetscObjectRegisterDestroy((PetscObject)viewer); 164 if (ierr) {PetscError(ncomm,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,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__,1,PETSC_ERROR_INITIAL," "); viewer = 0;} 167 } 168 ierr = PetscCommDestroy(&ncomm); 169 if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_AMS_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);} 170 PetscFunctionReturn(viewer); 171 } 172 173 /* 174 If there is a PetscViewer associated with this communicator, it is destroyed. 175 */ 176 #undef __FUNCT__ 177 #define __FUNCT__ "PetscViewer_AMS_Destroy" 178 PetscErrorCode PetscViewer_AMS_Destroy(MPI_Comm comm) 179 { 180 PetscErrorCode ierr; 181 PetscMPIInt flag; 182 PetscViewer viewer; 183 184 PetscFunctionBegin; 185 if (Petsc_Viewer_Ams_keyval == MPI_KEYVAL_INVALID) PetscFunctionReturn(0); 186 187 ierr = MPI_Attr_get(comm,Petsc_Viewer_Ams_keyval,(void**)&viewer,&flag);CHKERRQ(ierr); 188 if (flag) { 189 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 190 ierr = MPI_Attr_delete(comm,Petsc_Viewer_Ams_keyval);CHKERRQ(ierr); 191 } 192 PetscFunctionReturn(0); 193 } 194 195 #undef __FUNCT__ 196 #define __FUNCT__ "PetscViewerDestroy_AMS" 197 static PetscErrorCode PetscViewerDestroy_AMS(PetscViewer viewer) 198 { 199 PetscViewer_AMS *vams = (PetscViewer_AMS*)viewer->data; 200 PetscErrorCode ierr; 201 202 PetscFunctionBegin; 203 /* 204 Make sure that we mark that the stack is no longer published 205 */ 206 if (PetscObjectComm((PetscObject)viewer) == PETSC_COMM_WORLD) { 207 ierr = PetscStackAMSViewOff();CHKERRQ(ierr); 208 } 209 210 PetscStackCallAMS(AMS_Comm_destroy,(vams->ams_comm)); 211 ierr = PetscFree(vams);CHKERRQ(ierr); 212 PetscFunctionReturn(0); 213 } 214 215 #undef __FUNCT__ 216 #define __FUNCT__ "PetscViewerCreate_AMS" 217 PETSC_EXTERN PetscErrorCode PetscViewerCreate_AMS(PetscViewer v) 218 { 219 PetscViewer_AMS *vams; 220 PetscErrorCode ierr; 221 222 PetscFunctionBegin; 223 v->ops->destroy = PetscViewerDestroy_AMS; 224 ierr = PetscNew(PetscViewer_AMS,&vams);CHKERRQ(ierr); 225 v->data = (void*)vams; 226 vams->ams_comm = -1; 227 228 ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerAMSSetCommName_C",PetscViewerAMSSetCommName_AMS);CHKERRQ(ierr); 229 ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerAMSGetAMSComm_C",PetscViewerAMSGetAMSComm_AMS);CHKERRQ(ierr); 230 PetscFunctionReturn(0); 231 } 232 233 234 235