1 2 #include <petsc-private/petscimpl.h> /*I "petscsys.h" I*/ 3 #include <petscviewerams.h> 4 #include <petscsys.h> 5 6 /* 7 If true then every PETSc object will be published with the AMS 8 */ 9 PetscBool PetscAMSPublishAll; 10 11 #undef __FUNCT__ 12 #define __FUNCT__ "PetscObjectAMSTakeAccess" 13 /*@C 14 PetscObjectAMSTakeAccess - Take access of the data fields that have been published to AMS so they may be changed locally 15 16 Collective on PetscObject 17 18 Input Parameters: 19 . obj - the Petsc variable 20 Thus must be cast with a (PetscObject), for example, 21 PetscObjectSetName((PetscObject)mat,name); 22 23 Level: advanced 24 25 Concepts: publishing object 26 27 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSGrantAccess() 28 29 @*/ 30 PetscErrorCode PetscObjectAMSTakeAccess(PetscObject obj) 31 { 32 PetscErrorCode ierr; 33 34 PetscFunctionBegin; 35 if (obj->amsmem != -1) { 36 ierr = AMS_Memory_take_access(obj->amsmem);CHKERRQ(ierr); 37 } 38 PetscFunctionReturn(0); 39 } 40 41 #undef __FUNCT__ 42 #define __FUNCT__ "PetscObjectAMSGrantAccess" 43 /*@C 44 PetscObjectAMSGrantAccess - Grants access of the data fields that have been published to AMS to the memory snooper to change 45 46 Collective on PetscObject 47 48 Input Parameters: 49 . obj - the Petsc variable 50 Thus must be cast with a (PetscObject), for example, 51 PetscObjectSetName((PetscObject)mat,name); 52 53 Level: advanced 54 55 Concepts: publishing object 56 57 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSTakeAccess() 58 59 @*/ 60 PetscErrorCode PetscObjectAMSGrantAccess(PetscObject obj) 61 { 62 PetscErrorCode ierr; 63 64 PetscFunctionBegin; 65 if (obj->amsmem != -1) { 66 ierr = AMS_Memory_grant_access(obj->amsmem);CHKERRQ(ierr); 67 } 68 PetscFunctionReturn(0); 69 } 70 71 #undef __FUNCT__ 72 #define __FUNCT__ "PetscObjectAMSPublish" 73 /*@C 74 PetscObjectAMSPublish - Publish an object 75 76 Collective on PetscObject 77 78 Input Parameters: 79 . obj - the Petsc variable 80 Thus must be cast with a (PetscObject), for example, 81 PetscObjectSetName((PetscObject)mat,name); 82 83 Notes: PetscViewer objects are not published 84 85 Level: advanced 86 87 Concepts: publishing object 88 89 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish() 90 91 @*/ 92 PetscErrorCode PetscObjectAMSPublish(PetscObject obj) 93 { 94 PetscErrorCode ierr; 95 AMS_Memory amem; 96 AMS_Comm acomm; 97 98 PetscFunctionBegin; 99 PetscValidHeader(obj,1); 100 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 101 if (obj->amsmem != -1) PetscFunctionReturn(0); 102 ierr = PetscObjectName(obj);CHKERRQ(ierr); 103 104 ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(PETSC_COMM_WORLD),&acomm);CHKERRQ(ierr); 105 /* Really want to attach to correct communicator but then browser needs to access multiple communicators 106 ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(obj->comm),&acomm);CHKERRQ(ierr); */ 107 108 ierr = AMS_Memory_create(acomm,obj->name,&amem);CHKERRQ(ierr); 109 obj->amsmem = (int)amem; 110 111 ierr = AMS_Memory_take_access(amem);CHKERRQ(ierr); 112 ierr = AMS_Memory_add_field(amem,"Class",&obj->class_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 113 ierr = AMS_Memory_add_field(amem,"Type",&obj->type_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 114 ierr = AMS_Memory_add_field(amem,"Id",&obj->id,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 115 ierr = AMS_Memory_add_field(amem,"ParentId",&obj->parentid,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 116 ierr = AMS_Memory_add_field(amem,"Name",&obj->name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 117 ierr = AMS_Memory_add_field(amem,"Block",&obj->amspublishblock,1,AMS_BOOLEAN,AMS_WRITE,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 118 if (obj->bops->publish) { 119 ierr = (*obj->bops->publish)(obj);CHKERRQ(ierr); 120 } 121 ierr = AMS_Memory_publish(amem);CHKERRQ(ierr); 122 ierr = AMS_Memory_grant_access(amem);CHKERRQ(ierr); 123 PetscFunctionReturn(0); 124 } 125 126 #undef __FUNCT__ 127 #define __FUNCT__ "PetscObjectAMSBlock" 128 /*@C 129 PetscObjectAMSBlock - Blocks the object if PetscObjectAMSSetBlock() has been called 130 131 Collective on PetscObject 132 133 Input Parameters: 134 . obj - the Petsc variable 135 Thus must be cast with a (PetscObject), for example, 136 PetscObjectSetName((PetscObject)mat,name); 137 138 139 Level: advanced 140 141 Concepts: publishing object 142 143 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSSetBlock() 144 145 @*/ 146 PetscErrorCode PetscObjectAMSBlock(PetscObject obj) 147 { 148 PetscFunctionBegin; 149 PetscValidHeader(obj,1); 150 151 if (!obj->amspublishblock) PetscFunctionReturn(0); 152 /* Eventually this will be fixed to check if the AMS client has changed the lock */ 153 while (1); 154 PetscFunctionReturn(0); 155 } 156 157 #undef __FUNCT__ 158 #define __FUNCT__ "PetscObjectAMSSetBlock" 159 /*@C 160 PetscObjectAMSSetBlock - Sets whether an object will block at PetscObjectAMSBlock() 161 162 Collective on PetscObject 163 164 Input Parameters: 165 + obj - the Petsc variable 166 Thus must be cast with a (PetscObject), for example, 167 PetscObjectSetName((PetscObject)mat,name); 168 - flg - whether it should block 169 170 Level: advanced 171 172 Concepts: publishing object 173 174 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSBlock() 175 176 @*/ 177 PetscErrorCode PetscObjectAMSSetBlock(PetscObject obj,PetscBool flg) 178 { 179 PetscFunctionBegin; 180 PetscValidHeader(obj,1); 181 obj->amspublishblock = flg; 182 PetscFunctionReturn(0); 183 } 184 185 #undef __FUNCT__ 186 #define __FUNCT__ "PetscObjectAMSUnPublish" 187 PetscErrorCode PetscObjectAMSUnPublish(PetscObject obj) 188 { 189 PetscErrorCode ierr; 190 191 PetscFunctionBegin; 192 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 193 if (obj->amsmem == -1) PetscFunctionReturn(0); 194 if (obj->bops->unpublish) { 195 ierr = (*obj->bops->unpublish)(obj);CHKERRQ(ierr); 196 } else { 197 ierr = AMS_Memory_destroy(obj->amsmem);CHKERRQ(ierr); 198 obj->amsmem = -1; 199 } 200 PetscFunctionReturn(0); 201 } 202 203